2013-05-08 3 views
0

외부 서버에서 SSLeay 형식의 개인 키를 받고 Java.security.PrivateKey 파생 개체를 생성해야하는 Java (JSE 7) 응용 프로그램을 작성하고 있습니다. 키가 동적으로 수신되고 앱이 JNI를 사용할 수 없으므로 openssl을 사용하여 키를 변환 할 수 없습니다.SSLeay 형식의 키로 Java PrivateKey 개체 구성

대신 SSLeay에서 PKCS # 8 또는 PrivateKey를 구성 할 수있는 다른 형식으로 변환하기위한 순수 Java 솔루션을 찾고 있습니다.

인터넷 검색은 SSLeay 키 (예 : Entrust에서 가져온 키)를 처리하는 제 3 자 라이브러리를 보여 주지만 불행하게도이 구현에서는 외부 라이브러리를 사용하지 못하도록 제한되어 있습니다. 그래, 알아. 심지어 Commons도.

누구도 JSE 7 표준 라이브러리에서이 작업에 도움이되는 도구를 알고 있습니까? 나는 전환을 직접 쓰는 것에 신경 쓰지 않지만 SSLeay에 대한 정확한 명세를 찾기가 힘들었다.

어떤 조언을 해주셔서 감사합니다!

답변

0

제 3 자 라이브러리 사용을 피하기 위해 제한된 경우에만이 답변이 유용하다는 점에 유의하십시오. BouncyCastle이나 다른 라이브러리를 사용할 수 있다면 더 나은 방법 일 것입니다.

받은 키는 PEM으로 인코딩 된 OpenSSL ("traditional SSLeay") DER 형식의 RSA 키입니다. 나는 다음과 같은 방법으로 자바 java.security.PrivateKey 개체를 얻을 수있었습니다 :

  1. 는 DER 태그 2 형 (정수)를 처리하는 단순한 DER 파서를 썼다. 파서는 DER 시퀀스 태그 (0x30)와 고정 및 가변 길이 객체를 읽는 것을 처리해야했습니다.
  2. String.replace을 사용하여 PEM 문자열에서 RSA 키 머리글과 바닥 글을 제거합니다.
  3. DatatypeConverter.parseBase64Binary()을 사용하여 PEM 문자열에서 바이트 배열을 가져옵니다.
  4. DER 파서를 사용하여 버전, 모듈러스, 공개 지수, 개인 지수, 소수 P, 소수 Q, 소수 지수 Q, CRT 계수 (이 순서대로)에서 데이터를 추출합니다 (BigInteger).
  5. 해당 값으로부터 java.security.spec.RSAPrivateCrtKeySpec 개체 (keySpec)를 생성했습니다.
  6. PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

이 내 목적을 위해 일하지만, 바퀴의 부부의 불행한 재발입니다.