เกิดจาก: java.security.UnrecoverableKeyException: ไม่สามารถกู้คืนคีย์


84

ฉันได้รับที่เก็บคีย์ jks ชื่อ ABCC_client.store เมื่อฉันนำเข้าที่เก็บคีย์นี้ไปยัง cacerts และลองเชื่อมต่อมันแจ้งว่าไม่มีข้อผิดพลาดอัลกอริทึมดังกล่าว PFA stacktrace

    Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class:   com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
    at java.security.Provider$Service.newInstance(Provider.java:1245)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:220)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:147)
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
    at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
    at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102)
    at org.apache.axis.components.net.JSSESocketFactory.initFactory(JSSESocketFactory.java:61)
    at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:79)
    ... 32 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
    at sun.security.provider.KeyProtector.recover(KeyProtector.java:311)
    at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:121)
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:38)
    at java.security.KeyStore.getKey(KeyStore.java:763)
    at com.sun.net.ssl.internal.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:113)
    at com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:48)
    at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:239)
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:170)
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:40)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at java.security.Provider$Service.newInstance(Provider.java:1221)
    ... 39 more

แต่ถ้าฉันใช้ที่เก็บคีย์นี้โดยอิสระเช่นโดยไม่ต้องเพิ่มลงใน cacerts มันก็ใช้ได้

googling บางคนพาฉันไปที่http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/ซึ่งบอกว่ารหัสผ่านอาจแตกต่างไปจากฉัน คีย์และที่เก็บคีย์


โค้ดเล็กน้อยเพื่อดูว่ามีอะไรเรียกว่าเป็นไปได้ไหม
Bruno

ฉันพยายามเรียกใช้วิธีการบริการเว็บจากภายในรหัส .. AxisFault faultCode: { schemas.xmlsoap.org/soap/envelope } Server.userException faultSubcode: faultString: java.net.SocketException: java.security.NoSuchAlgorithmException: การสร้างข้อผิดพลาด การใช้งาน (อัลกอริทึม: ค่าเริ่มต้นผู้ให้บริการ: SunJSSE คลาส: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
Mrinal Bhattacharjee

2
อาจจะซ้ำกันที่นี่เป็นคำถามที่คล้ายกันกับ asnwer
icrovett

ไม่ปัญหาของฉันคือที่เก็บคีย์จะทำงานได้หากเราตั้งค่าคุณสมบัติของระบบเพื่อใช้ที่เก็บคีย์นั้น แต่ถ้าเราโหลดที่เก็บคีย์นั้นเป็นค่าเริ่มต้นของ jvm เช่น cacerts มัน doest wrk มันบอกว่าใบรับรองเสีย ..
Mrinal Bhattacharjee

คำตอบ:


109

หากใช้ Tomcat 6 และรุ่นก่อนหน้าตรวจสอบให้แน่ใจว่ารหัสผ่านที่เก็บคีย์และรหัสผ่านคีย์เหมือนกัน หากใช้ Tomcat 7 ขึ้นไปตรวจสอบให้แน่ใจว่าเหมือนกันหรือระบุรหัสผ่านคีย์ไว้ในserver.xmlไฟล์


10
นี่คือเรื่องจริง อ้างอิงtomcat.apache.org/tomcat-6.0-doc/…
Atharva

2
คำพูดที่เกี่ยวข้อง: ในที่สุดคุณจะได้รับแจ้งให้ป้อนรหัสผ่านคีย์ซึ่งเป็นรหัสผ่านเฉพาะสำหรับใบรับรองนี้ (ตรงข้ามกับใบรับรองอื่น ๆ ที่เก็บไว้ในไฟล์ที่เก็บคีย์เดียวกัน) คุณต้องใช้รหัสผ่านเดียวกันกับที่ใช้สำหรับรหัสผ่านที่เก็บคีย์ นี่เป็นข้อ จำกัด ของการใช้งาน Tomcat (ขณะนี้keytoolข้อความแจ้งจะแจ้งให้คุณทราบว่าการกดปุ่ม ENTER จะทำเพื่อคุณโดยอัตโนมัติ)
Captain Man

ฉันมีปัญหานี้กับ JMeter (https) เนื่องจากที่เก็บคีย์ Java และรหัสผ่านคีย์ต่างกัน อ้างอิงstackoverflow.com/questions/2889238/… . เพื่อเปลี่ยนรหัสผ่านคีย์เพื่อแก้ปัญหา ช่วยได้มาก! ขอบคุณ.
Rishi

@CaptainMan ว่าเป็นความจริงเฉพาะใน tomcat6 จาก Tomcat7 มันไม่ได้เป็น
Andrea Ligios

2
จุดดีของ @AndreaLigios คำพูดที่เกี่ยวข้อง: สุดท้ายคุณจะได้รับแจ้งให้ป้อนรหัสผ่านซึ่งเป็นรหัสผ่านเฉพาะสำหรับใบรับรองนี้ (ตรงข้ามกับใบรับรองอื่น ๆ ที่เก็บไว้ในไฟล์ที่เก็บคีย์เดียวกัน) keytoolพรอมต์จะบอกคุณว่าการกดแป้น ENTER โดยอัตโนมัติใช้รหัสผ่านเดียวกันสำหรับคีย์เป็นที่เก็บคีย์ คุณมีอิสระที่จะใช้รหัสผ่านเดียวกันหรือเลือกรหัสที่กำหนดเอง หากคุณเลือกรหัสผ่านอื่นสำหรับรหัสผ่านที่เก็บคีย์คุณจะต้องระบุรหัสผ่านที่กำหนดเองในserver.xmlไฟล์การกำหนดค่าด้วย
Captain Man

73

รหัสผ่านคีย์ส่วนตัวที่กำหนดในแอป / การกำหนดค่าของคุณไม่ถูกต้อง ขั้นแรกให้ลองตรวจสอบรหัสผ่านคีย์ส่วนตัวโดยเปลี่ยนเป็นรหัสผ่านอื่นดังนี้:

keytool -keypasswd -new changeit -keystore cacerts -storepass changeit -alias someapp -keypass password

ตัวอย่างข้างต้นเปลี่ยนรหัสผ่านจากรหัสผ่านเป็นเปลี่ยน คำสั่งนี้จะสำเร็จหากรหัสผ่านคีย์ส่วนตัวเป็นรหัสผ่าน


2
ในขณะที่ฉันไม่ได้ใช้คำตอบนี้เกี่ยวกับคำถาม มันมีประโยชน์สำหรับการตรวจสอบไฟล์ที่เก็บคีย์รหัสผ่านที่จัดเก็บนามแฝง / คีย์และรหัสผ่านของคีย์
Russ

1
โปรดจำไว้ว่าหลังจากดำเนินการคำสั่งนี้คุณจะเปลี่ยนรหัสผ่านที่เก็บคีย์ คุณจะต้องตั้งรหัสผ่านกลับเป็นรหัสเดิม
gersonZaragocin

ที่จริงก็เพียงพอที่จะระบุ-keypasswd -keystore storefile -alias somealiasและป้อนทุกอย่างในพรอมต์
Andrey Regentov

ในการเรียกใช้รหัสนี้ฉันได้รับข้อผิดพลาดต่อไปนี้ - "keytool error: java.security.UnrecoverableKeyException: Cannot recover key"มีวิธีใดในการตรวจสอบรหัสผ่านคีย์นามแฝงของฉันหรือเปลี่ยนรหัสโดยไม่ทราบรหัสเก่าหรือไม่
Kavin Raju S

10

เพื่อที่จะไม่มีCannot recover keyข้อยกเว้นฉันต้องใช้ Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files กับการติดตั้ง Java ที่กำลังเรียกใช้แอปพลิเคชันของฉัน เวอร์ชัน 8 ของไฟล์เหล่านั้นสามารถพบได้ที่นี่หรือเวอร์ชันล่าสุดควรแสดงอยู่ในหน้านี้ การดาวน์โหลดประกอบด้วยไฟล์ที่อธิบายวิธีใช้ไฟล์นโยบาย


เนื่องจากJDK 8u151จึงไม่จำเป็นต้องเพิ่มไฟล์นโยบาย แทนแฟ้มนโยบายเขตอำนาจ JCE crypto.policyถูกควบคุมโดยคุณสมบัติการรักษาความปลอดภัยที่เรียกว่า การตั้งค่าที่unlimitedอนุญาตให้ใช้การเข้ารหัสแบบไม่ จำกัด โดย JDK เนื่องจากบันทึกประจำรุ่นเชื่อมโยงกับสถานะข้างต้นจึงสามารถกำหนดโดยSecurity.setProperty()หรือผ่านjava.securityไฟล์ java.securityไฟล์อาจจะมีการต่อท้ายโดยการเพิ่ม-Djava.security.properties=my_security.propertiesคำสั่งเพื่อเริ่มต้นโปรแกรมตามรายละเอียดที่นี่


เนื่องจากJDK 8u161การเข้ารหัสแบบไม่ จำกัด ถูกเปิดใช้งานโดยค่าเริ่มต้น


3
ฉันเห็นข้อผิดพลาดนี้แม้ว่าจะติดตั้งไหไฟล์นโยบายแล้วก็ตาม
Adam

@Adam วิธีแก้ปัญหาของฉันมีไว้สำหรับกรณีเฉพาะซึ่งอาจแตกต่างจากที่คุณพบ อย่างไรก็ตามฉันได้เพิ่มการอัปเดตเพื่อแสดงถึงการเปลี่ยนแปลงที่เกิดขึ้นใน JDK 8u151
WhiteKnight

5

ฉันมีข้อผิดพลาดเดียวกันเมื่อเรานำเข้าคีย์ไปยังที่เก็บคีย์ที่สร้างโดยใช้เวอร์ชัน OpenSSL 64 บิต เมื่อเราทำตามขั้นตอนเดียวกันเพื่อนำเข้าคีย์ไปยังที่เก็บคีย์ที่สร้างโดยใช้เวอร์ชัน OpenSSL 32 บิตทุกอย่างก็เรียบร้อยดี


3
สาเหตุหลักของข้อผิดพลาดข้างต้นคือ java.security.UnrecoverableKeyException: ไม่สามารถกู้คืนคีย์ได้ สาเหตุนี้อาจเป็นรหัสผ่านที่ผิดพลาดดังที่กล่าวไว้ข้างต้น แต่ยังสร้างที่เก็บคีย์ด้วยการใช้งาน OpenSSL 64 บิต ดังนั้นฉันจึงถือว่าคำตอบของฉันเป็นอีกวิธีหนึ่งที่เป็นไปได้ มันช่วยฉันในสถานการณ์ข้อผิดพลาดเดียวกันดังนั้นฉันจึงให้วิธีแก้ปัญหาที่นี่
Heimi

openssl ไม่สร้างไฟล์ที่เก็บคีย์ Java คุณช่วยชี้แจงเรื่องนี้ได้ไหม
เมา

ขอบคุณสำหรับคำตอบ ฉันประสบปัญหาเดียวกันเมื่อเรียกใช้บริการเว็บ https จาก OpenESB 3.05 ฉันทำตามคำแนะนำของคุณและสร้างไฟล์ jks อีกครั้งด้วยการใช้ OpenSS 32 บิตและใช้งานได้ดี
Marti PàmiesSolà

2

ตรวจสอบว่ารหัสผ่านที่คุณใช้ถูกต้องหรือไม่โดยเรียกใช้คำสั่งด้านล่าง

keytool -keypasswd -new temp123 -keystore awsdemo-keystore.jks -storepass temp123 -alias movie-service -keypass changeit

หากคุณได้รับข้อผิดพลาดด้านล่างแสดงว่ารหัสผ่านของคุณผิด

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.