Program Club

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

proclub 2020. 10. 13. 19:36
반응형

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


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/로 연결 되어 암호가 다를 수 있습니다. 키 및 키 저장소.


Tomcat 6 및 이전 버전을 사용하는 경우 키 저장소 비밀번호와 키 비밀번호가 동일한 지 확인하십시오. Tomcat 7 이상을 사용하는 경우 동일한 지 또는 server.xml파일 에 키 암호가 지정되어 있는지 확인하십시오 .


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

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

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


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 무제한 암호화가 기본적으로 활성화되어 있기 때문 입니다.


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

참고 URL : https://stackoverflow.com/questions/15967650/caused-by-java-security-unrecoverablekeyexception-cannot-recover-key

반응형