2011-02-07 2 views
7

나는 자바 키 스토어와 keytool에 대해 다음 질문을 가지고있다. 키 스토어에는 1 개 이상의 인증서가있을 수 있다고 가정합니다. 내가 시도한 것처럼 keytool을 통해 키 저장소를 만들 수 있으며이 키 저장소에 액세스하려면 암호를 설정해야합니다. 또한 각 인증서 항목에 액세스하려면 암호를 설정해야합니다. 키 저장소와 항목에 대해 동일한 암호를 반드시 입력해야합니까? 그렇지 않다면 (왜 그렇게 생각하는 것이 합리적이라고 생각합니다) 다음 코드는 무엇입니까?자바 키 스토어와 패스워드 설정

char[] pwd = new char[]{'s','e','c','r','e','t'}; 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
ks.load(new FileInputStream("myPersonal.keystore"), pwd); 
kmf.init(ks, pwd);//fails here with exception 

다음 예외는 무엇입니까?

Exception in thread "main" java.security.UnrecoverableKeyException: Cannot recover key 
    at sun.security.provider.KeyProtector.recover(Unknown Source) 
    at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source) 
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source) 
    at java.security.KeyStore.getKey(Unknown Source) 

secret

내가 키 도구를 통해 생성 된 키 스토어 myPersonal.keystore에 액세스 할 수있는 암호입니다. 인증서에는 인증서 2 개, DSA 1 개, RSA 1 개가 있습니다. 각각은 키 스토어 (그리고 서로)와 다른 암호를 가지고 있습니다. 열쇠 스토어와 같은 패스워드를 가지는 단일의 증명서 엔트리로 키 스토어를 사용하면 (자), 예외는없고 프로그램도 정상적으로 동작하기 때문에, 코드는 정확합니다.

그래서 여기에 무슨 문제가 있습니까? 다른 암호가 없어야합니까? 나는 많은 인증서가 없어야합니까? 또는 무엇을?

답변

7

KeyManagerFactory.init 메소드는 API에 의해 지정된대로 키 스토어에서 키를 검색하는 데 사용되는 암호를 사용합니다. 하나의 암호 매개 변수 만 있기 때문에 모든 키의 암호가 동일 할 것으로 예상됩니다. 키 중 하나에 다른 암호가 사용되면 해당 키 저장소 항목에 대한 암호가 올바르지 않기 때문에 본 오류가 발생합니다.

가장 간단한 해결책은 키 저장소의 모든 항목에 동일한 암호를 사용하는 것입니다. 각 항목마다 다른 비밀번호를 유지하도록 설정 한 경우 KeyManager와 같은 맞춤 보안 요소를 만들어야 할 수도 있습니다.

+0

KeyManagerFactory에서이 제한을 강제하는 이유가 있습니까? 실제 시나리오에서는 일반적으로 다른 암호를 사용하는 것으로 가정합니다. – Cratylus

+0

KeyManagerFactory의 API 정의에 대해서는 암시 적입니다. . 나는 API가 가장 단순한 시나리오를 다루기 위해 만들어 졌다고 가정 할 것이다. 즉, 모든 키는 동일한 패스워드를 가질 것이다. KeyManagerFactory는보다 일반적인 접근법 (내가 검증하지 않은 것)을 다루는 간단한 메커니즘입니다. KeyStore API를 사용하면 다른 암호로 다른 키에 액세스 할 수 있으므로 더 복잡한 시나리오의 기능을 확장 할 수 있습니다. API 정의 뒤에있는 추론에 관해서는 말하기 어렵습니다. –

+0

그것은 작동합니다. 도움을 감사하십시오! – Bai