2017-12-12 5 views
0

Ich habe eine PEM-Datei, die zwei Zertifikate enthält.Konvertieren von Pem mit mehreren Zertifikaten in Java Keystore

Die erste ist das Zertifikat ist spezifisch für meine Firma (d. H. Der Betreff ist spezifisch für meine Firma).

Das zweite Zertifikat ist das Zertifikat für den Aussteller.

Es sieht ungefähr so ​​aus ...

Bag Attributes 
    localKeyID: 01 00 00 00 
    friendlyName: CCAPI Client Certificate 
Key Attributes 
    X509v3 Key Usage: 10 
-----BEGIN RSA PRIVATE KEY----- 
<<contents>> 
-----END RSA PRIVATE KEY----- 
Bag Attributes 
    localKeyID: 01 00 00 00 
    friendlyName: CCAPI Client Certificate 
    subject=MyCompany CN/OU/O/L/ST/C 
    issuer=Issuer CN/OU/O/L/ST/C 
-----BEGIN CERTIFICATE----- 
<<contents>> 
-----END CERTIFICATE----- 
Bag Attributes 
    localKeyID: 02 00 00 00 
    subject=Issuer CN/OU/O/L/ST/C 
    issuer=Issuer CN/OU/O/L/ST/C 
-----BEGIN CERTIFICATE----- 
<<contents>> 
-----END CERTIFICATE----- 

Erstens würde Ich mag ein paar Dinge zu bestätigen.

Terminologie weise ist es richtig zu sagen, ich habe eine PEM-Datei mit zwei Zertifikaten? Wie beschreibe ich den PRIVATE KEY Teil? Ist das der öffentliche Schlüssel des Servers, mit dem ich mich verbinden möchte?

Und zweitens muss ich den Befehl keytool verwenden, um eine Java-Keystore-Datei (JKS) mit sowohl Zertifikat und das Emissionszertifikat darin zu erstellen.

Kann mir jemand mit den Befehlen helfen, das zu tun. Ich verbringe viel Zeit damit, zu googeln, aber es scheint dort eine Menge verschiedener Anwendungsfälle zu geben, die mich verwirren.

Dank im Voraus

+0

Der private Schlüsselteil ist der * private * Schlüssel * Ihres * Zertifikats. – EJP

+0

@EJP, allgemein gesprochen, nein. Es ist nur ein privater Schlüssel. Es ist der private Schlüssel für ein Zertifikat genau dann, wenn der entsprechende öffentliche Schlüssel dem öffentlichen Schlüssel im Zertifikat entspricht. –

Antwort

1

Sie haben nicht erwähnt, warum Sie diese Datei erhalten haben, aber ich gehe davon aus, dass es sich um den Zugriff auf eine Website/einen Dienst über eine HTTPS-Client-Authentifizierung handelt. Der private Schlüssel (und das Zertifikat) dient zur Authentifizierung gegenüber dem Server. Das Ausstellerzertifikat wird möglicherweise benötigt, um eine Kette mit einem vertrauenswürdigen Stammzertifikat auf dem Server abzuschließen (oder es wird möglicherweise gar nicht benötigt).

Diese Datei ist nicht in einem sehr gebräuchlichen Format kodiert, es passiert hauptsächlich, wenn OpenSSL eine PKCS # 12-Datei als PEM schreibt. Die folgende OpenSSL-Befehl würde eine Datei wie folgt erzeugen:

openssl pkcs12 -in keyStore.p12 -out keyStore.pem -nodes 

Dies bewahrt die Metadaten aus den PKCS # 12-Format wie die IDs und friendlyNames, so dass Sie, dass der private Schlüssel und das erste Zertifikat sehen zusammengehören. Aber es ist ein bisschen komisch, denn ...

  1. Der private Schlüssel ist nicht mehr verschlüsselt (mehr).
  2. Dieses Format ist nur für die weitere Verarbeitung in Software geeignet, die die OpenSSL-Bibliothek verwendet, jedoch nicht in der Welt von Java oder Microsoft (IIS, .NET). Eine binäre PKCS # 12-Datei wäre in allen Umgebungen verwendbar gewesen.

Sie können es zurück zu # 12 mit dem folgenden OpenSSL Befehl binär PKCS konvertieren:

openssl pkcs12 -export -in keyStore.pem -out keyStore.p12 

Von diesem Punkt an Dich eine Standard PKCS # 12-Datei, die Sie directly in Java software oder dass Sie verwenden können, convert with keytool to JKS/JCEKS.

+0

Dieses Format ist für einige Programme nützlich, die OpenSSL-Bibliotheken wie Apache httpd und nginx verwenden, da 'SSL_ [CTX_] use * File' sie in einem Schritt lesen kann (während P12 mehrere Schritte benötigt), besonders wenn der Server booten oder neustarten muss ohne eine Person, die anwesend ist, um das Passwort einzugeben. Aber _für Java_ stimme ich völlig zu. –

+0

@ dave_thompson_085 Danke, dass du darauf hingewiesen hast, ich habe die Antwort bearbeitet. – Omikron

+0

danke. Ich habe das getan und es hat funktioniert – Richie

0

Streng genommen ist PEM ein Container, die verschiedenen Arten von Text-codierte PKI-Daten sowie Informationen Text halten.

Zitat aus specification:

textueller Codierung mit einer Linie beginnt; umfassend "----- BEGIN", ein Etikett und "-----", und endet mit einer Linie umfassend " ----- END ", ein Label und" ----- ". Zwischen diesen Linien, oder "Einkapselung Grenzen", sind Base64-kodierte Daten gemäß Abschnitt 4 von [RFC4648]. (PEM [RFC1421] bezog sich auf diese Daten als "verkapselter Textteil".) Daten vor den Verkapselungsgrenzen sind zulässig, und Parser MÜSSEN bei der Verarbeitung solcher Daten NICHT fehlschlagen. Außerdem sollten Parser Whitespace und andere nicht-base64-Zeichen ignorieren und verschiedene Newline-Konventionen verarbeiten.

Der private Schlüssel in Ihrer PEM-Datei ist nur ein privater Schlüssel. Dieser Schlüssel muss in keinem Verhältnis zu den Zertifikaten in der Datei stehen.

Die einzige Möglichkeit zu sehen, ob es sich um den privaten Schlüssel für den öffentlichen Schlüssel eines Zertifikats handelt, ist der Vergleich der entsprechenden öffentlichen Schlüssel. Generieren Sie einen öffentlichen Schlüssel aus dem privaten Schlüssel und vergleichen Sie ihn mit dem öffentlichen Schlüssel aus dem Zertifikat.

  1. Erhalten öffentlichen Schlüssel aus privaten Schlüssel

den privaten Schlüssel in eine separate Datei extrahieren (legen Sie die Linien

-----BEGIN RSA PRIVATE KEY----- 
<<contents>> 
-----END RSA PRIVATE KEY----- 

in eine separate privkey.pem Datei)

In die Befehlszeile:

openssl rsa -in privkey.pem -pubout > pubkey.pub 
  1. von Zertifikat mit öffentlichem Schlüssel Get

das Zertifikat in eine separate Datei Put certfile.pem (die Linien

-----BEGIN CERTIFICATE----- 
<<contents>> 
-----END CERTIFICATE----- 

)

Rufen Sie openssl erneut auf:

-noout Druck unterdrückt das Zertifikat

Dann pubkey.pem und pubkey2.pem überprüfen.

Java Schlüsselspeicher

Es gibt eine article auf Oracle-Website auf, wie PEM-Zertifikate JKS zu importieren. Hast Du es versucht?

Verwandte Themen