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