PKCS12-Java-Keystore von CA und Benutzer-Zertifikat in java
Ich habe vor kurzem im Auftrag der Spott ein Apple-Produkt (iPhone Configuration Utility) in Java. Eines der Teile habe ich ein wenig stecken, ist ein Teil über Exchange ActiveSync. Dort, ermöglicht es Ihnen, wählen ein Zertifikat aus Ihrem Schlüsselbund zu verwenden, da die Anmeldeinformationen für Ihr EAS-Konto. Nach einigen Recherchen fand ich, dass es eigentlich die Erstellung einer PKCS12-keystore -, das einsetzen der private Schlüssel des Zertifikats, den ich ausgewählt habe, und die Kodierung in XML. So weit keine große Sache. Wenn ich eine .p12-Datei mit dem Schlüsselbund-Sie lädt, ohne ein problem. Aber ich Laufe in ein problem, wenn ich versuche zu bringen, die über Java.
Sagen, dass ich den export einer dieser certs, die ich verwendet hatte früher mit dem .p12-Datei als .cer-Datei (dies ist, was wir erwarten, zu bekommen in der Umgebung). Nun wenn ich es hochladen in Java bekomme ich ein Zertifikat Objekt 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 versuche,...
ks.setCertificateEntry("SomeAlias", userCert);
Bekomme ich die exception...
java.security.KeyStoreException: TrustedCertEntry not supported
Also von certs bewege ich mich auf Tasten. Aber mit den Zertifikaten (ich habe das CA-Cert), ich bin nur in der Lage, Zugriff auf den öffentlichen Schlüssel nicht der private. Und wenn ich versuche, fügen Sie den öffentlichen Schlüssel wie so...
java.security.cert.Certificate[] chain = {CACert};
ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain);
Bekomme ich...
java.security.KeyStoreException: Private key is not stored as PKCS#8 EncryptedPrivateKeyInfo: java.io.IOException: DerValue.getOctetString, not an Octet String: 3
So, jetzt bin ich hier. Hat jemand eine Idee, wie man einen privaten Schlüssel aus .cer-Datei in einen PKCS12-keystore in Java? Bin ich noch auf dem richtigen Weg?
Vielen Dank im Voraus!
InformationsquelleAutor Staros | 2010-09-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
PKCS#12-format ist gedacht für die Speicherung eines privaten Schlüssels mit einem Zertifikat der Kette, und beide sind erforderlich (obwohl Sie vielleicht nicht brauchen die ganze Kette).
Obwohl die
PKCS12
keystore-Typ macht einen guten job für die Zuordnung dieses format, um eine Java -KeyStore
nicht alles wird unterstützt aus diesem Grund.Was Sie zu tun versuchen, in Ihrem ersten Versuch ist die Speicherung eines Zertifikats auf Ihrer eigenen, das wird nicht funktionieren.
Was Sie zu tun versuchen, in Ihrem zweiten Versuch (
ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain)
) ist für einen öffentlichen Schlüssel an Stelle von was sollte einen privaten Schlüssel (siehe- KeyStore#setKeyEntry
)..cer
Datei neigen dazu, nur für die Zertifikate, die keinen privaten Schlüssel (obwohl natürlich, die Verlängerung ist letztendlich auch nur ein Indiz). Wenn Sie exportieren Sie Ihre.cer
Datei aus Schlüsselbund.app, Sie erhalten nicht den privaten Schlüssel mit (das ist, was die.p12
export-format).BEARBEITEN über KeychainStore:
Wenn der Grund, warum Sie versuchen, diese Umwandlung zu tun ist letztendlich der Zugriff auf private Schlüssel und Zertifikate, die bereits im Schlüsselbund könnten Sie laden Sie von der
KeychainStore
direkt:Ein paar Hinweise:
"-".toCharArray()
), da der Zugang wird aufgefordert, die von der OS-security-service (wie in anderen Anwendungen).Spot auf. Danke für die info!
InformationsquelleAutor Bruno
http://www.docjar.com/html/api/org/bouncycastle/jce/examples/PKCS12Example.java.html
So fügen Sie ein Zertifikat mit einem privaten Schlüssel zuordnen, um eine PKCS12-keystore.
Wenn Sie mit client-Authentifizierung, die keystore enthalten muss auch der private Schlüssel, in diesem Fall verwenden Sie den KeyStore.getInstance("PKCS12").
Wenn youre nicht mit client-Authentifizierung, die aber nur server-Authentifizierung(und die privaten Schlüssel werden nicht in den keystore, denn es gehört zum server), die besser zu verwenden
KeyStore.getInstance("JKS"), als Sie können mehrere Zertifikate mit einem alias, einem keystore.
Wenn Sie mit dem PKCS12, soweit ich weiß, können Sie nur hinzufügen, 1 Zertifikat(Sie müssen die ganze Zertifikats-Kette) assoziiert mit dem privaten Schlüssel, den Sie verwenden möchten für das Zertifikat.
InformationsquelleAutor Fico
Ich bin ein paar Jahre zu spät, um der Partei, aber das hat mich ein paar Stunden richtig arbeiten,
also dachte ich, es war lohnt sich die Buchung einer funktionierende Lösung.
Diese Lösung verwendet 1) Ein .p12 /PKCS12-Zertifikat
und 2) eine ZERTIFIZIERUNGSSTELLE, die nicht in der Standard-TrustManager (und Sie Sie hinzufügen möchten programmgesteuert statt Sie auf die Standard-TrustManager). 3) Kein Dritter Kryptographie-Bibliotheken, nur
HttpClient
bringen Sie alle zusammen.Außerdem habe ich ein paar hilfreiche
keytool
undopenssl
Befehle in der JavaDoc für die mit Zertifikaten arbeiten, denn das ist eine Kunst für sich.KeyStore
. Sie wissen nicht einmal zeigen, ein PKCS #12 trust store, oder erklären, warum das nicht funktioniert.InformationsquelleAutor markdsievers