2013-01-09 5 views
1

우리의 응용 프로그램 중 하나에서 개인 키는 BouncyCastle의 PEMWriter를 사용하여 저장됩니다. Java 7에서 우리가 필요로하는 모든 것을 가진 것처럼 보이기 때문에 BouncyCastle 의존성을 제거 할 수 있는지 조사하고 있습니다. 유일한 문제는 데이터베이스에 저장된 개인 키를 PEM으로 인코딩 된 문자열 (인증서/공개 키가 유효 함)로 읽을 수 없다는 것입니다. 내가 파일에 데이터베이스에서 개인 키의 PEM 인코딩 된 문자열을 저장하면JCA를 사용하여 BouncyCastle 개인 키 PEM 파일을 읽으려면 어떻게해야합니까?

나는 8 형식과 같이 PKCS 번호의 열쇠를 변환하는 OpenSSL을 실행할 수 있습니다 : 내가 할 수있는

openssl pkcs8 -topk8 -inform PEM -outform DER \ 
       -in private_key.pem -out private_key.der -nocrypt 

결과 출력을 base64로 인코딩은 다음 자바/JCA 코드의이 비트를 사용하여 읽을 :

byte[] privateKeyBytes = 
      DatatypeConverter.parseBase64Binary(privateKeyDERcontents); 
PrivateKey prKey = 
      KeyFactory.getInstance("RSA"). 
       generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); 

이 개인 키는 즉, 나는 일반 텍스트에서 왕복 다시 암호문하고 있습니다, 예상대로 저장된 공개 키와 일치.

내가 가진 질문은 : 직접 원본 PEM 인코딩을 어떻게 든 읽을 수 있습니까?

EDIT가 여기

사용 BouncyCastle 해당 문자열을 판독하고 코드 비트이다

은 "privateKeyPEM"
if (Security.getProvider("BC") == null) { 
    Security.addProvider(new BouncyCastleProvider()); 
} 
PEMReader pemReader = new PEMReader(new StringReader(privateKeyPEM)); 
KeyPair keyPair = (KeyPair) pemReader.readObject(); 
PrivateKey key = keyPair.getPrivate(); 

데이터베이스에서 PEM 인코딩 된 문자열이, 그렇지 않으면,이 예는 자체 포함. 흥미롭게도 이미 JCA KeyPair 객체를 출력으로 사용합니다. 원래 질문을 바꾸려면 : PEMReader에 의존하지 않고 위의 코드와 동일한 기능을 수행 할 수 있습니까? (그리고 꽤 많은 다른 BouncyCastle 클래스)?

+0

첫 번째 코드는 openssl 명령과 함께 사용되지 않습니다. openssl 명령은 DER 출력을 생성하지만 Java 코드 base64는이를 디코딩합니다. 시작하기 위해 base64로 인코딩되지 않았으므로 작동하지 않습니다. –

+0

@GregS : 네 말이 맞아, 나는 내 실험에서 잘못된 비트를 결합했을거야. 어떤 것이 작동하는지 확인하겠습니다. "-outform PEM"을 사용하고 header/footer (가능한) 또는 base64를 DER 출력 (덜 가능성)으로 스트립했습니다. 곧 게시물을 수정하겠습니다. –

+0

@GregS : DER 코드를 base64로 인코딩하기 만하면됩니다. 64 자로 래핑 된 경우 어쨌든 PEM과 동일합니다. –

답변

-1

PEM 파일의 키 내부는 이미 PKCS # 8 형식으로 저장되어 있으므로 암호로 암호화되지 않은 경우 헤더 (----- BEGIN RSA PRIVATE KEY -----), Base64- 입력을 디코드하고 필요한 바이트를 가져옵니다.

+1

나는 이것이 정확하지 않다는 것을 확신한다. PEM 파일에는 PKCS # 8 인코딩 된 키가 포함될 수 있지만 다른 이진 데이터를 포함 할 수 있습니다. X.509 인증서 (공개 키에 일반적으로 사용됨)와 OpenSSL에 대한 기본값 (독점 형식)이 있습니다. PEM을 외부 인코딩으로 유지하면서 openssl을 하나에서 다른 것으로 변환 할 수 있습니다. -form과 -outform을 모두 PEM으로 설정 한 명령을 사용하십시오. –

+2

물론 PEM은 바이너리 데이터의 텍스트 인코딩입니다. 이 특별한 상황에 대해 말하고 있습니다. 여기에 Base64로 인코딩 된 PKCS # 8 개인 키가 있습니다. –

+1

PKCS # 8로 변환하는 openssl 명령이 필요합니다. 예 : http://www.openssl.org/docs/apps/pkcs8.html - 필자는이 문서에서 "전통적인"형식이라는 것 같습니다. –