7

Ho seguente codice:Può org.bouncycastle.openssl.PEMReader leggere java.security.PrivateKey?

PrivateKey key = null; 
X509Certificate cert = null; 
KeyPair keyPair = null; 

final Reader reader = new StringReader(pem); 
try { 
    final PEMReader pemReader = new PEMReader(reader, new PasswordFinder() { 
     @Override 
     public char[] getPassword() { 
      return password == null ? null : password.toCharArray(); 
     } 
    }); 

    Object obj; 
    while ((obj = pemReader.readObject()) != null) { 
     if (obj instanceof X509Certificate) { 
      cert = (X509Certificate) obj; 
     } else if (obj instanceof PrivateKey) { 
      key = (PrivateKey) obj; 
     } else if (obj instanceof KeyPair) { 
      keyPair = (KeyPair) obj; 
     } 
    } 
} finally { 
    reader.close(); 
} 

Sarà mai letto PrivateKey? In altre parole, un file PEM può contenere solo una chiave privata pura? Se sì, potresti fornirmi un file PEM di esempio?

Grazie in anticipo.

+2

Non ho un campione a portata di mano, ma come potete leggere qui: http://ospkibook.sourceforge.net/docs/OSPKI-2.4.7/OSPKI-html/sample-priv-key.htm è possibile . (o si tratta di un tentativo di ottenere chiavi private da persone :)) – albertjan

+0

Vedere anche * [Formattazione di chiavi RSA per OpenSSL in Java] (http://stackoverflow.com/q/3660132/3474). * – erickson

risposta

6

Un file può può contenere solo una chiave privata e può essere crittografato o chiaro. OpenSSL lo fa sempre.

Ho rivisto il codice per PEMReader, tuttavia, e sembra che restituirà un KeyPair da una chiave privata RSA (il file della chiave privata contiene tutte le informazioni necessarie per la chiave pubblica corrispondente). Sembra che non restituirà mai semplicemente un PrivateKey da readObject().

Ecco una chiave privata 1024 RSA non crittografata da OpenSSL.

-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQC/oBTZGo0cgHHdZD8LgDpUVOPjsI58PrTJPtrlVT7kyznmzFEt 
TW9cqxlw6EOo09tTTrjikLDA2M5xzejbLGPb8sa7AzVhuHkChgGh9eZmphsnvq1W 
LjuXCk5yWOR9ziaBKKFeNXOsdvDp3eMDM+wz3vzn1wrGrg00jMvKP5kcpwIDAQAB 
AoGBAI9oJ/IKEszfu1cqLJxYzE5McXf2q8uDyhxJs9upHjZveNem1KGIr+y0B4gd 
6nSwiBUidu7nxb+tAWLd7IQKBnhKC3AtGNT7qTwnXelKsJhaok2+kEEuzjQYnmsP 
AreEsAi/FlHj/kAyjGBoQ4QLrx1sp2cDcBTP78PeJfZvm/RxAkEA7zVuumjrz3ui 
zmBzQI1pwD9F0REyE5zJfgUz5iDQbK2RRPhcQ9LCZdEJRU0vdWTBmmgadYwpg0uG 
hYFwCy7PWwJBAM0Tk+pMRwke0m4oiI4mKh0u4enHXE2RFMUtTMjGILHt8+m4Q7rd 
KGfO9/ylK82LhbT0Z/BeszbnneaAefkxFaUCQQDephVSXKZgkOuQvCWKSBXOYxZQ 
6nh52M2TBrSv1ospHMTCNYlrd5iJvG+smZM66XVqistV7ggVtQ6Y5Umsnv1RAkBW 
l/K4V1cTcdFXNIRcyZ60zewUw9qk4iMME1G94XNCzoBU6zqmN+Zs1wb9xlzVoRln 
TGBrLgGsqGaTQyK9500FAkBuKohFvOgFHSKOskiVu/swByWZANEZsoEPUx7V6vXH 
Tk+qftY64tt4AazHPVyVtsj1oqOv3zbulfnotFvU1nmp 
-----END RSA PRIVATE KEY----- 

Ecco la corrispondente chiave pubblica:

-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/oBTZGo0cgHHdZD8LgDpUVOPj 
sI58PrTJPtrlVT7kyznmzFEtTW9cqxlw6EOo09tTTrjikLDA2M5xzejbLGPb8sa7 
AzVhuHkChgGh9eZmphsnvq1WLjuXCk5yWOR9ziaBKKFeNXOsdvDp3eMDM+wz3vzn 
1wrGrg00jMvKP5kcpwIDAQAB 
-----END PUBLIC KEY----- 

Un KeyStore è destinato a essere utilizzato per trasportare le chiavi pubbliche, private e simmetriche in un'applicazione Java. La maggior parte delle applicazioni Java memorizza le chiavi private in una codifica PKCS # 8 (che non è the same as the OpenSSL format) e le chiavi pubbliche sono rappresentate con una struttura SubjectPublicKeyInfo (che è uguale a OpenSSL).

+1

Grazie per la risposta . Il tuo esempio di chiave privata contiene anche la chiave pubblica e quindi è un KeyPair. È possibile estrarre una chiave pubblica con: openssl pkey -inform PEM -pubout -outform PEM. Mi stavo chiedendo se ci può essere un PEM con una semplice chiave privata, senza informazioni sulla chiave pubblica. –

+0

@ Martin In realtà, quello che il mio campione contiene è un 'RSAPrivateKey', come definito PKCS # 1. Come ho affermato, * contiene * l'esponente pubblico (insieme ai valori del teorema del resto cinese), per facilitare il recupero della chiave pubblica. Qualsiasi chiave privata che può essere letta da 'PEMReader' (o dai programmi di utilità OpenSSL) deve essere in questo formato standard, sebbene possa essere racchiusa in un wrapper PKCS # 8 o PEM. Alcune implementazioni di SSH2 sono insolite in quanto non utilizzano una chiave PKCS # 1. PEMReader ** non ** non restituirà mai un 'PrivateKey'; genererà un'eccezione se una chiave privata non è in formato PKCS # 1. – erickson