우리의 응용 프로그램 중 하나에서 개인 키는 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 클래스)?
첫 번째 코드는 openssl 명령과 함께 사용되지 않습니다. openssl 명령은 DER 출력을 생성하지만 Java 코드 base64는이를 디코딩합니다. 시작하기 위해 base64로 인코딩되지 않았으므로 작동하지 않습니다. –
@GregS : 네 말이 맞아, 나는 내 실험에서 잘못된 비트를 결합했을거야. 어떤 것이 작동하는지 확인하겠습니다. "-outform PEM"을 사용하고 header/footer (가능한) 또는 base64를 DER 출력 (덜 가능성)으로 스트립했습니다. 곧 게시물을 수정하겠습니다. –
@GregS : DER 코드를 base64로 인코딩하기 만하면됩니다. 64 자로 래핑 된 경우 어쨌든 PEM과 동일합니다. –