2015-12-16 9 views
1

Я получаю открытый ключ от моего REST API, который закодирован в PEM. Теперь мне нужно изменить кодировку на DER, чтобы сохранить ее как объект PublicKey. Однако, к сожалению, я получаю следующее сообщение об ошибке:Как преобразовать открытый ключ PEM в открытый ключ DER?

java.lang.IllegalArgumentException: unknown object in getInstance: org.spongycastle.asn1.ASN1Integer

И ошибка указывает на этой линии:

RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(pemReader.readPemObject().getContent()); 

Открытый ключ выглядит следующим образом:

-----BEGIN RSA PUBLIC KEY----- 
MIIBCgKCAQEA04XyJ5K4sQCtqapk98yEAR/ECaVC85JYPsqC09GiZboNdSSxQXj3 
UNb53Po8iNX24T4elyjjzqQpVcyi+eaFp9Fggg2ZDyK9Re1wTucs0APDQdsGe1Q5 
KImT/SBycI7v1RwSgjQ4I6npMg/0lZY8bnw4Q1AaTIII0KFBHmIYBD1oeCSdVPED 
JWQWTSXtStQj83Vyj1uSLEEzXLpVYW4fq8e24tH2D/1j6eIBnBw6YpkWE6T9pZlE 
wIs8YoeQWt5+lPWI28PST8VKqXsxH6JVzu5Mj6jLw8WTZxyKvNaGgO4B3J/ze/58 
zW0LtlhsKMEq48QdLgPJZ+tfac2EhKANrQIDAQAB 
-----END RSA PUBLIC KEY----- 

Вот мой код:

public void setPublicKey(String publicKey) { 
    try { 
     PemReader pemReader = new PemReader(new StringReader(publicKey)); 
     RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(pemReader.readPemObject().getContent()); 
     pemReader.close(); 
     RSAPublicKeySpec rsaSpec = new RSAPublicKeySpec(rsa.getModulus(), rsa.getExponent()); 
     KeyFactory kf = KeyFactory.getInstance("RSA/ECB/PKCS1Padding"); 
     this.publicKey = kf.generatePublic(rsaSpec); 
    } catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException ex) { 
     ex.printStackTrace(); 
     throw new IllegalStateException("Cannot set public key."); 
    } 
} 
+0

где именно вы получаете NPE? в 'new PemReader (новый StringReader (publicKey));' statement? Можете ли вы предоставить образец открытого ключа, который вы пытаетесь преобразовать? – user1516873

+0

Благодарим за помощь. Ну, я получил NPE, потому что я удалил '----- BEGIN RSA PUBLIC KEY -----' и '----- END RSA PUBLIC KEY -----' из ключа вручную на бэкэнд , Теперь я удалил операцию подстроки, и я получаю эту ошибку: 'java.lang.IllegalArgumentException: неизвестный объект в getInstance: org.spongycastle.asn1.ASN1Integer'. – user3475602

ответ

2

Java действительно хочет видеть закодированный объект SubjectPublicKeyInfo, но у вас есть более простой объект PKCS # 1 RSAPublicKey.

Самый простой способ, которым я знаю, это использовать класс PEMParser из библиотеки PKIX от bouncycastle - там должна быть эквивалентная библиотека Spongycastle. Используйте этот класс вместо класса PemReader, который вы используете в настоящее время, например:

 PEMParser pemParser = new PEMParser(new StringReader(publicKey)); 
     SubjectPublicKeyInfo spki = (SubjectPublicKeyInfo) pemParser.readObject(); 
     pemParser.close(); 
     byte [] spkiEncoded = spki.getEncoded(); 
     X509EncodedKeySpec keySpec = new X509EncodedKeySpec(spkiEncoded); 

     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     this.publicKey = kf.generatePublic(keySpec); 
Смежные вопросы