Vor kurzem wurde mir die Aufgabe übertragen, ein Apple-Produkt (iPhone Configuration Utility) in Java nachzubilden. Einer der Abschnitte, bei dem ich nicht weiterkomme, ist ein Teil über Exchange ActiveSync. Dort können Sie ein Zertifikat aus Ihrem Schlüsselbund auswählen, das als Anmeldeinformationen für Ihr EAS-Konto verwendet werden soll. Nach einigen Nachforschungen habe ich herausgefunden, dass tatsächlich ein PKCS12-Keystore erstellt wird, in den der private Schlüssel des von mir ausgewählten Zertifikats eingefügt und in XML kodiert wird. So weit keine große Sache. Wenn ich mit Keychain Access eine .p12-Datei erstelle, wird sie ohne Probleme hochgeladen. Aber ich stoße auf ein Problem, wenn ich versuche, diese Datei nach Java zu übertragen.
Angenommen, ich exportiere eines der Zertifikate, die ich zuvor mit der .p12-Datei verwendet habe, als .cer-Datei (das ist das, was wir in der Umgebung erwarten). Wenn ich es nun in Java hochlade, erhalte ich ein Zertifikatsobjekt wie folgt...
KeyStore ks = java.security.KeyStore.getInstance("PKCS12");
ks.load(null, "somePassword".toCharArray());
CertificateFactory cf = CertificateFactory.getInstance("X.509", new BouncyCastleProvider());
java.security.cert.Certificate userCert = cf.generateCertificate(new FileInputStream("/Users/me/Desktop/RecentlyExportedCert.cer"));
Aber wenn ich es versuche...
ks.setCertificateEntry("SomeAlias", userCert);
Ich verstehe die Ausnahme...
java.security.KeyStoreException: TrustedCertEntry not supported
Von den Zertifikaten gehe ich also zu den Schlüsseln über. Aber mit diesen Zertifikaten (ich habe auch das CA-Zertifikat) kann ich nur auf den öffentlichen Schlüssel zugreifen, nicht auf den privaten. Und wenn ich versuche, den öffentlichen Schlüssel wie folgt hinzuzufügen...
java.security.cert.Certificate[] chain = {CACert};
ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain);
Ich verstehe...
java.security.KeyStoreException: Private key is not stored as PKCS#8 EncryptedPrivateKeyInfo: java.io.IOException: DerValue.getOctetString, not an Octet String: 3
Jetzt bin ich also hier. Hat jemand eine Idee, wie man einen privaten Schlüssel aus einer .cer Datei in einen PKCS12 Keystore in Java bekommt? Bin ich überhaupt auf dem richtigen Weg?
Vielen Dank im Voraus!