2017-03-10 1 views
-1

OpenSSL을 사용하여 새로운 X509EncodedKeySpec을 인스턴스화하는 데 궁극적으로 사용할 수있는 인증서를 InvalidKeySpecException과 함께 사용하지 않고 사용하려고합니다.X509EncodedKeySpec의 생성자가 사용할 수있는 X509 인증서를 생성하는 방법은 무엇입니까?

지금까지 내가 해봤 다음

openssl req -x509 -newkey rsa:4096 -keyout privkey.pem cert.pem -days 365 

다음 내 안드로이드 응용 프로그램의 암호화 클래스 :

/** @param rawCert is the content of cert.pem, read into a String. */ 
public static PublicKey regenerateKey(String rawCert) 
     throws NoSuchAlgorithmException, InvalidKeySpecException { 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    byte[] certBytes = Base64.decode(rawCert, 0)); 
    return kf.generatePublic(new X509EncodedKeySpec(certBytes)); 
} 

는 인증서 자체가 보이는

는 OpenSSL을을 사용하여 키 쌍을 생성 이렇게 :

-----BEGIN CERTIFICATE----- 
MIIGDTCCA/WgAwIBAgIJANIT8Fk2cT0HMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD 
(... removed to save space in posting ...) 
Fk7oUsABk7xlpP7kS5+lKfLk+/6DvwIyjU8PB6faBe8EDgXSZMh9K/36Onpvr62i 
ysBiCKTT+y+NC3u4cFiTjR4= 
-----END CERTIFICATE----- 
문자열의 getBytes와 바이트 []로 변환 한 후,

  • 이 문자열로 원래 .PEM 파일 읽기 (/ END 인증서와 모든 BEGIN) : 그것은 가치가 무엇인지에 대한

    , 나는 이미 다음과 같은 실험을 시도 (StandardCharsets.UTF_8) 메소드를 호출합니다. 실패한.

  • 동일한 실험이지만 US_ASCII 및 ISO_8859_1을 대신 사용해 보았습니다. 여전히 실패했습니다.

  • 첫 번째 줄과 마지막 줄을 제거하여 파일에 base64 인코딩 된 cert 내용 만 포함 시켰습니다. 실패한.

  • .pem 파일이 개행 문자로 끝나지 않았는지 다시 확인하십시오. 실패한.

  • base64 인코딩 된 파일을 사용하려는 이전 시도 대신 base64가 파일을 byte []로 디코딩했습니다. 실패한.

스택 추적에서 특정 해당 줄은 것으로 나타납니다

java.lang.RuntimeException가 : java.security.spec.InvalidKeySpecException : java.lang.RuntimeException가 : 오류 : 0c0890ba을 : ASN.1을 인코딩 루틴 : asn1_check_tlen : WRONG_TAG

이 시점에서 문제가 인증서 자체와 관련이 있는지 또는 다른 것이 있거나 (대신) 받아 들일 수있는 형식으로 마사지해야하는지 여부가 확실하지 않습니다. X509EncodedKeySpec.

+0

의미가 없습니다. 인증서는 공개 키가 아닙니다. 그것은 * 공개 키를 포함합니다. 인증서 자체를 생성해야하며 공개 키를 직접 얻을 수 있습니다. – EJP

답변

1

잘못된 방법을 사용하고 있습니다. 포인트 @EJP으로 인증서가

documentation를 참조 공개 키

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
Certificate cert = cf.generateCertificate(inputStream); 
PublicKey publicKey = cert.getPublicKey(); 

generateCertificate()이 (base64로 내용을 머리글/바닥 글을 제거하고 디코딩) PEM 형식과 바이너리 (머리글과 바닥 글에 64 기수)에서 인증서를 받아 포함

In the case of a certificate factory for X.509 certificates, the certificate provided in inStream must be DER-encoded and may be supplied in binary or printable (Base64) encoding. If the certificate is provided in Base64 encoding, it must be bounded at the beginning by -----BEGIN CERTIFICATE-----, and must be bounded at the end by -----END CERTIFICATE-----.

관련 문제