원인 : java.security.UnrecoverableKeyException : 키를 복구 할 수 없습니다.


84

ABCC_client.store라는 jks 키 저장소가 제공됩니다. 이 키 저장소를 cacerts로 가져오고 연결을 시도하면 No such Algorithm error라고 표시됩니다. 스택 트레이스 PFA

    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에 추가하지 않고 작동합니다.

일부 인터넷 검색으로 인해 http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/로 연결 되어 암호가 다를 수 있습니다. 키 및 키 저장소.


가능한 경우 무엇이 호출되는지 확인하기위한 약간의 코드?
브루노

코드 내에서 웹 서비스 메서드를 호출하려고했습니다 ..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 2013

내 문제는 해당 키 저장소를 사용하도록 시스템 속성을 설정하면 키 저장소가 작동한다는 것입니다. 그러나 해당 키 저장소를 jvm의 기본 즉 cacerts에로드하면 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) coz Java 키 저장소와 키 암호가 다른 문제가 발생했습니다. 참조 stackoverflow.com/questions/2889238/… . 문제를 해결하기 위해 키 암호를 변경합니다. 큰 도움! 감사.
Rishi

Tomcat6 만 사실 @CaptainMan는 Tomcat7에서 그것을하지 않습니다 .
Andrea Ligios

2
@AndreaLigios 좋은 지적, 관련 인용문 : 마지막으로, 이 인증서에 대한 비밀번호키 비밀번호를 입력 하라는 메시지가 표시됩니다 (동일한 키 저장소 파일에 저장된 다른 인증서와 반대). keytool메시지가 Enter 키를 누르면 자동으로 키 스토어와 키에 대해 동일한 암호를 사용하는 당신에게 말할 것이다. 동일한 암호를 사용하거나 사용자 지정 암호를 선택할 수 있습니다. 키 저장소 비밀번호와 다른 비밀번호를 선택하는 경우 server.xml구성 파일 에 사용자 정의 비밀번호도 지정해야 합니다.
Captain Man

73

앱 / 구성에 정의 된 개인 키 비밀번호가 올바르지 않습니다. 먼저 다음과 같이 다른 암호로 변경하여 개인 키 암호를 확인하십시오.

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

위의 예는 암호를 password에서 changeit으로 변경합니다. 이 명령은 개인 키 암호가 password 인 경우 성공합니다.


2
나는 질문과 관련 하여이 답변을 사용하지 않았습니다. 키 저장소 파일, 저장소 암호, 별칭 / 키 및 키 암호를 확인하는 데 유용했습니다.
Russ

1
이 명령을 실행 한 후에는 키 저장소 암호를 변경하게됩니다. 암호를 원래 암호로 다시 설정해야합니다.
gersonZaragocin

사실, 그냥 지정 -keypasswd -keystore storefile -alias somealias하고 다른 모든 것을 프롬프트에 입력하는 것으로 충분 합니다.
안드레이 Regentov

이 코드를 실행하면 다음과 같은 오류가 발생합니다. "keytool error: java.security.UnrecoverableKeyException: Cannot recover key"별칭 키 비밀번호가 무엇인지 확인하거나 이전 비밀번호를 모르고 변경할 수있는 방법이 있습니까?
Kavin Raju S

10

Cannot recover key예외가 발생 하지 않도록 애플리케이션을 실행하는 Java 설치에 JCE (Java Cryptography Extension) Unlimited Strength Jurisdiction Policy Files를 적용해야했습니다. 이러한 파일의 버전 8은 여기 에서 찾을 수 있거나 최신 버전 이이 페이지에 나열되어야합니다 . 다운로드에는 정책 파일을 적용하는 방법을 설명하는 파일이 포함되어 있습니다.


JDK 8u151 이후로 정책 파일을 추가 할 필요가 없습니다. 대신 JCE 관할 정책 파일은라는 보안 등록 정보에 의해 제어됩니다 crypto.policy. unlimitedJDK에서 무제한 암호화를 사용할 수 있도록 설정합니다 . 위의 상태에 링크 된 릴리스 노트로 파일을 Security.setProperty()통해 또는 java.security파일을 통해 설정할 수 있습니다 . java.security파일도 추가하여 추가 할 수 -Djava.security.properties=my_security.properties설명 된대로 프로그램을 시작하는 명령에 여기 .


JDK 8u161 무제한 암호화가 기본적으로 활성화되어 있기 때문 입니다.


3
정책 파일 jar가 설치 되었음에도 불구하고이 오류가 표시됩니다.
Adam

@Adam My 솔루션은 특정 사례를위한 것이며, 현재 경험하는 것과 다를 수 있습니다. 그러나 JDK 8u151에서 발생한 변경 사항을 반영하기 위해 업데이트를 추가했습니다.
WhiteKnight

5

64 비트 OpenSSL 버전을 사용하여 빌드 된 키 저장소로 키를 가져올 때 동일한 오류가 발생했습니다. 32 비트 OpenSSL 버전을 사용하여 빌드 된 키 저장소로 키를 가져 오는 동일한 절차를 따랐을 때 모든 것이 잘되었습니다.


3
위 오류의 근본 원인은 java.security.UnrecoverableKeyException : 키를 복구 할 수 없습니다. 그 이유는 위에서 언급 한대로 잘못된 암호 일 수 있지만 64 비트 OpenSSL 구현을 사용하는 키 저장소 빌드 일 수도 있습니다. 그래서 나는 나의 대답을 또 다른 가능한 해결책으로 생각합니다. 동일한 오류 상황에서 도움이되었으므로 여기에 해결책을 제공했습니다.
Heimi

openssl은 Java 키 저장소 파일을 생성하지 않습니다. 이것을 명확히 할 수 있습니까?
aled

대답 해 주셔서 감사합니다. OpenESB 3.05에서 https 웹 서비스를 호출 할 때 동일한 문제가 발생합니다. 나는 당신의 지시에 따라 OpenSS의 32 비트 구현에 다시 JKS 파일을 생성하고 그것을 잘 작동합니다
마티 Pàmies 솔라

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.