2017-01-03 1 views
1

konvertieren eine pem-Datei enthält eine x509 Zertifikat + private Schlüssel in eine pkcs12 (P12-Datei), der folgende Befehl verwendet wird, um konvertieren:Wie x509 Cert und Schlüssel zu einer pkcs12 Datei

openssl pkcs12 -export -inkey cert_pkey.pem -in cert_pkey.pem -out cert.p12 

I Ich versuche, das gleiche programmatisch mit Java mit BouncyCastle-Bibliothek zu erreichen. Ich bin in der Lage, den X509Cert aus dem PEMObject zu extrahieren, aber der private Schlüssel war verwirrend.

Jede Hilfe die Schritte zusammen in piecing geschätzt:

  1. öffnen cert_pkey.pem Datei-Stream PEMParser mit
  2. die X509-Zertifikat von PemObject Get (fertig)
  3. den privaten Schlüssel aus dem Get PemObject (wie?)
  4. erstellen von Schlüsselspeicher Instanztyp PKCS12 mit Passwort
+0

beliebigen Code Got? Also steckst du auf Schritt 3 fest? – weston

+0

@weston hat die Lösung geschrieben, die für mich unten funktioniert hat. – c360ian

Antwort

1

schließlich dazu gekommen, wie das CERT und Schlüssel getrennt zu bekommen - nicht sicher, warum es so, wie es ausgearbeitet ausgearbeitet:

PEMParser pemParser = new PEMParser(new BufferedReader(new InputStreamReader(certStream))); 
Object pemCertObj = pemParser.readObject(); 
PemObject pemKeyObj = pemParser.readPemObject(); 

PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(pemKeyObj.getContent()); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
PrivateKey privKey = kf.generatePrivate(privKeySpec); 

Security.addProvider(new BouncyCastleProvider()); 
X509CertificateHolder certHolder = (X509CertificateHolder)pemCertObj; 
X509Certificate x509cert = (new JcaX509CertificateConverter()).setProvider("BC").getCertificate(certHolder); 

ich den Hinweis bekam, wenn ich die .getType() auf permCertObj nachgeschlagen und permKeyObj und erhalten RSA CERT und RSA PRIVATE KEY zurückgegeben jeweils.

konnte sich nicht den Unterschied zwischen readObject() und readPemObject()

+0

Welche Sprache ist das? – weston

+0

scala, ich verwende es als Teil der Play App. – c360ian

+0

Warum haben Sie dann die Frage als Java nicht als Scala markiert? – weston

0

Die PEMParser-Klasse analysiert praktisch alles aus dem PEM-Format. Sie können das Objekt aus der Datei mit diesem Parser lesen - wenn Sie die Klasse dieses Objekts drucken, sehe ich, dass es ein PEMKeyPair ist. Dies kann mithilfe von JcaPEMKeyConverter in einen regulären KeyPair konvertiert werden.

public KeyPair importKeyFromPemFile(String filePath) 
{ 
    try (FileReader reader = new FileReader(filePath)) 
    { 
     PEMParser pemParser = new PEMParser(reader); 
     PEMKeyPair pemKeyPair = (PEMKeyPair)pemParser.readObject() 
     return new JcaPEMKeyConverter().getKeyPair(pemKeyPair); 
    } 
    catch (IOException | PEMException e) 
    { 
     throw new RuntimeException(e) 
    } 
} 
+0

Das PEMObject wirft einen Fehler, wenn ich es in PEMKeyPair umwandeln, da die PEM-Datei nur den privaten Schlüssel + Cert und keinen öffentlichen Schlüssel hat. Ich musste ein privates Schlüsselobjekt aus der PKCS8EncodedKeySpec erstellen (pemParser.readPemObject(). GetContent) – c360ian

Verwandte Themen