Gây ra bởi: java.security.UnrecoverableKeyException: Không thể khôi phục khóa


84

Tôi được cung cấp một kho khóa jks có tên ABCC_client.store. Khi tôi nhập kho khóa này vào cacerts và thử kết nối nó thông báo Không có lỗi thuật toán như vậy. PFA hệ thống ngăn xếp

    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

Nhưng nếu tôi sử dụng kho khóa này một cách độc lập tức là không thêm nó vào cacerts thì nó hoạt động.

Một số googling dẫn tôi đến http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/ cho biết mật khẩu đó có thể khiến tôi khác với chìa khóa và kho khóa.


Một chút mã để xem những gì được gọi nếu có thể?
Bruno

tôi đang cố gọi một phương thức dịch vụ web từ bên trong mã..AxisFault errorCode: { schemas.xmlsoap.org/soap/envelope } Server.userException errorSubcode: errorString: java.net.SocketException: java.security.NoSuchAlgorithmException: Lỗi xây dựng triển khai (thuật toán: Mặc định, nhà cung cấp: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
Mrinal Bhattacharjee

2
Có thể được trùng lặp ở đây là một câu hỏi tương tự với một asnwer.
icrovett

Không Vấn đề của tôi là kho khóa hoạt động nếu chúng tôi đặt thuộc tính hệ thống để sử dụng kho khóa đó. Nhưng nếu chúng ta tải kho khóa đó vào mặc định của jvm tức là cacerts nó làm tốt nhất wrk. Nó nói rằng chứng chỉ xấu ..
Mrinal Bhattacharjee

Câu trả lời:


109

Nếu sử dụng Tomcat 6 trở về trước, hãy đảm bảo mật khẩu kho khóa và mật khẩu khóa giống nhau. Nếu sử dụng Tomcat 7 trở lên, hãy đảm bảo chúng giống nhau hoặc mật khẩu khóa được chỉ định trong server.xmltệp.


10
Đây là sự thật. Tham khảo tomcat.apache.org/tomcat-6.0-doc/…
Atharva

2
Trích dẫn liên quan: Cuối cùng, bạn sẽ được nhắc nhập mật khẩu khóa , đây là mật khẩu dành riêng cho Chứng chỉ này (trái ngược với bất kỳ Chứng chỉ nào khác được lưu trữ trong cùng một tệp kho khóa). Bạn PHẢI sử dụng cùng một mật khẩu ở đây như đã được sử dụng cho chính mật khẩu kho khóa. Đây là một hạn chế của việc triển khai Tomcat. (Hiện tại, keytoollời nhắc sẽ cho bạn biết rằng việc nhấn phím ENTER sẽ tự động thực hiện việc này cho bạn.)
Captain Man

Tôi gặp sự cố này với kho khóa JMeter (https) coz Java và mật khẩu khóa khác nhau. Cập nhật stackoverflow.com/questions/2889238/… . để thay đổi mật khẩu khóa để giải quyết vấn đề. Giúp đỡ nhiều! Cảm ơn.
Rishi

@CaptainMan điều đó chỉ đúng trong Tomcat6, từ Tomcat7 thì không .
Andrea Ligios

2
@AndreaLigios điểm tốt, trích dẫn có liên quan: Cuối cùng, bạn sẽ được nhắc nhập mật khẩu khóa , đây là mật khẩu dành riêng cho Chứng chỉ này (trái ngược với bất kỳ Chứng chỉ nào khác được lưu trữ trong cùng một tệp kho khóa). Lời keytoolnhắc sẽ cho bạn biết rằng việc nhấn phím ENTER sẽ tự động sử dụng cùng một mật khẩu cho khóa làm kho khóa. Bạn có thể tự do sử dụng cùng một mật khẩu hoặc chọn một mật khẩu tùy chỉnh. Nếu bạn chọn một mật khẩu khác với mật khẩu kho khóa, bạn cũng sẽ cần chỉ định mật khẩu tùy chỉnh trong server.xmltệp cấu hình.
Captain Man

73

Mật khẩu khóa riêng tư được xác định trong ứng dụng / cấu hình của bạn không chính xác. Trước tiên, hãy thử xác minh mật khẩu khóa cá nhân bằng cách thay đổi mật khẩu khác như sau:

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

Ví dụ trên thay đổi mật khẩu từ password sang changeit. Lệnh này sẽ thành công nếu mật khẩu khóa riêng là mật khẩu.


2
Trong khi tôi không sử dụng câu trả lời này liên quan đến câu hỏi. Nó rất hữu ích cho việc xác thực tệp kho khóa, mật khẩu lưu trữ, bí danh / khóa và mật khẩu khóa.
Russ

1
Hãy nhớ rằng sau khi thực hiện lệnh này, bạn sẽ thay đổi mật khẩu kho khóa. Bạn sẽ phải đặt mật khẩu trở lại mật khẩu ban đầu.
gersonZaragocin

trên thực tế, nó đủ để chỉ định -keypasswd -keystore storefile -alias somealiasvà nhập mọi thứ khác vào một dấu nhắc.
Andrey Regentov

Khi chạy mã này, tôi gặp lỗi sau - "keytool error: java.security.UnrecoverableKeyException: Cannot recover key"Có cách nào để kiểm tra mật khẩu khóa bí danh của tôi hoặc thay đổi mật khẩu mà không biết mật khẩu cũ không?
Kavin Raju S

10

Để không có Cannot recover keyngoại lệ, tôi phải áp dụng Tệp chính sách quyền lực không giới hạn về sức mạnh không giới hạn của Java Cryptography Extension (JCE) cho cài đặt Java đang chạy ứng dụng của tôi. Bạn có thể tìm thấy phiên bản 8 của những tệp đó tại đây hoặc phiên bản mới nhất sẽ được liệt kê trên trang này . Tải xuống bao gồm một tệp giải thích cách áp dụng các tệp chính sách.


JDK 8u151 nên không cần thêm tệp chính sách. Thay vào đó, các tệp chính sách quyền tài phán JCE được kiểm soát bởi một thuộc tính Bảo mật được gọi là crypto.policy. Đặt điều đó thành unlimitedvới cho phép JDK sử dụng mật mã không giới hạn. Vì ghi chú phát hành được liên kết với trạng thái trên, nó có thể được đặt bằng Security.setProperty()hoặc thông qua java.securitytệp. Các java.securitytập tin cũng có thể được gắn vào bằng cách thêm -Djava.security.properties=my_security.propertiesvào lệnh để khởi động chương trình như trình bày chi tiết ở đây .


Vì mật mã không giới hạn JDK 8u161 được bật theo mặc định.


3
Tôi gặp lỗi này mặc dù đã cài đặt các lọ tệp chính sách.
Adam

@Adam Giải pháp của tôi dành cho một trường hợp cụ thể, có thể khác với trường hợp bạn đang gặp phải. Tuy nhiên, tôi đã thêm một bản cập nhật để phản ánh thay đổi xảy ra trong JDK 8u151.
WhiteKnight

5

Tôi đã gặp lỗi tương tự khi chúng tôi nhập khóa vào kho khóa được xây dựng bằng Phiên bản OpenSSL 64bit. Khi chúng tôi làm theo quy trình tương tự để nhập khóa vào kho khóa được xây dựng bằng phiên bản OpenSSL 32 bit, mọi thứ đều ổn.


3
Nguyên nhân gốc rễ của Lỗi ở trên là java.security.UnrecoverableKeyException: Không thể khôi phục khóa. Lý do cho điều đó có thể là mật khẩu sai như đã đề cập ở trên, nhưng cũng có thể là một bản dựng kho khóa với Triển khai OpenSSL 64 bit. Vì vậy, tôi coi Câu trả lời của mình như một giải pháp khả thi khác. Nó đã giúp tôi trong tình huống lỗi tương tự, vì vậy tôi đã cung cấp giải pháp ở đây.
Heimi

openssl không tạo tệp kho khóa Java. Bạn có thể làm rõ điều này?
aled

Thks bạn trả lời. Tôi gặp phải vấn đề tương tự khi gọi mẫu dịch vụ web https OpenESB 3.05. Tôi làm theo hướng dẫn của bạn và tạo lại tệp jks với triển khai 32 bit của OpenSS và nó hoạt động tốt
Marti Pàmies Solà

2

Kiểm tra xem mật khẩu bạn đang sử dụng có đúng không bằng cách chạy lệnh dưới đây

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

Nếu bạn gặp lỗi dưới đây thì mật khẩu của bạn sai

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.