Wie konvertiere ich eine PFX-Datei mit einem privaten Schlüssel in einen Keystore?

107

Ich muss die Android-Anwendung ( .apk) signieren .
Ich habe .pfxDatei. Ich habe es .cerüber Internet Explorer in eine Datei konvertiert und dann .cerin .keystoreKeytool konvertiert . Dann habe ich versucht, .apkmit jarsigner zu signieren, aber es heißt, dass .keystore keinen privaten Schlüssel enthält.

Was mache ich falsch?

Ola
quelle
Dies kann nützlich sein: Wie kann ich das Keytool für Windows finden und ausführen? Stackoverflow.com/questions/5488339/…
Peter Barbanyaga

Antworten:

259

Verwenden von JDK 1.6 oder höher

Justin hat in den Kommentaren unten darauf hingewiesen, dass Keytool allein dies mit dem folgenden Befehl tun kann (allerdings nur in JDK 1.6 und höher):

keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 
-destkeystore clientcert.jks -deststoretype JKS

Verwenden von JDK 1.5 oder niedriger

OpenSSL kann alles. Diese Antwort auf JGuru ist die beste Methode, die ich bisher gefunden habe.

Stellen Sie zunächst sicher, dass Sie OpenSSL installiert haben. Viele Betriebssysteme haben es bereits installiert, wie ich es unter Mac OS X gefunden habe.

Die folgenden zwei Befehle konvertieren die pfx-Datei in ein Format, das als Java PKCS12-Schlüsselspeicher geöffnet werden kann:

openssl pkcs12 -in mypfxfile.pfx -out mypemfile.pem
openssl pkcs12 -export -in mypemfile.pem -out mykeystore.p12 -name "MyCert"

HINWEIS: Der im zweiten Befehl angegebene Name ist der Alias ​​Ihres Schlüssels im neuen Schlüsselspeicher.

Sie können den Inhalt des Schlüsselspeichers mit dem Dienstprogramm Java keytool mit dem folgenden Befehl überprüfen:

keytool -v -list -keystore mykeystore.p12 -storetype pkcs12

Wenn Sie möchten, können Sie dies schließlich in einen JKS-Schlüsselspeicher konvertieren, indem Sie den oben erstellten Schlüsselspeicher in einen neuen Schlüsselspeicher importieren:

keytool -importkeystore -srckeystore mykeystore.p12 -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
MikeD
quelle
28
Alle drei Schritte sind nicht erforderlich. Führen Sie einfach Folgendes aus: keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
JustinMorris
Ich denke, dass die älteren Versionen von Keytool Sie das nicht zulassen würden. Ich erinnere mich, dass ich vor 8 Jahren openssl ausführen musste, aber jetzt mit keytool in Oracle JDK 6 und 7 funktioniert es wie ein Zauber, genau wie Justin sagte.
David Brossard
2
Bitte beachten Sie, dass ich diese Antwort ein Jahr vor Justin in einer einfacheren Form mit mehr Details gegeben habe.
gjpc
@gjpc Noted. Ihre Antwort ist sehr vollständig und verdient viele Stimmen :)
MikeD
Dies ist wirklich eine großartige Antwort und hat mich nach Tagen der Forschung gerettet. Diese Antwort verdient wirklich viel mehr Gegenstimmen. Danke mein Herr.
Mythul
22

jarsigner kann Ihre pfx-Datei als Schlüsselspeicher für die Signatur Ihres JARs verwenden. Stellen Sie sicher, dass Ihre pfx-Datei beim Exportieren den privaten Schlüssel und die Zertifikatskette enthält. Es ist nicht erforderlich, in andere Formate zu konvertieren. Der Trick besteht darin, den Alias Ihrer pfx-Datei zu erhalten:

 keytool -list -storetype pkcs12 -keystore your_pfx_file -v | grep Alias

Sobald Sie Ihren Alias ​​haben, ist das Signieren einfach

jarsigner.exe -storetype pkcs12 -keystore pfx_file jar_file "your alias"

Die beiden oben genannten Befehle fordern Sie zur Eingabe des Kennworts auf, das Sie beim pfx-Export angegeben haben. Wenn Sie möchten, dass Ihr Passwort im Klartext angezeigt wird , verwenden Sie den Schalter -storepass vor dem Schalter -keystore

Bewundern Sie nach der Unterzeichnung Ihre Arbeit:

jarsigner.exe -verify -verbose -certs  yourjarfile
gjpc
quelle
1
+1 für nicht konvertieren der Keystore-Datei (ich habe es bereits in genug Formaten!)
Trejkaz
22

Ich habe diese Seite gefunden, auf der Sie erfahren, wie Sie einen PFX in JKS (Java Key Store) importieren:

keytool -importkeystore -srckeystore PFX_P12_FILE_NAME -srcstoretype pkcs12 -srcstorepass PFX_P12_FILE -srcalias SOURCE_ALIAS -destkeystore KEYSTORE_FILE -deststoretype jks -deststorepass PASSWORD -destalias ALIAS_NAME
kaptan
quelle
3
Dies sollte die vollständige Antwort sein!
JustAGuy
Ich suchte nach einer Antwort wie dieser - mit Aliasnamen
user3437460
2

Ihre PFX-Datei sollte den privaten Schlüssel enthalten. Exportieren Sie den privaten Schlüssel und das Zertifikat direkt aus Ihrer PFX-Datei (z. B. mit OpenSSL) und importieren Sie sie in Ihren Java-Keystore.

Bearbeiten

Weitere Informationen:

  • Download von OpenSSL für Windows hier .
  • Privaten Schlüssel exportieren: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • Exportzertifikat: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • Importieren Sie den privaten Schlüssel und das Zertifikat mithilfe von in den Java-Keystore keytool.
Bernard
quelle
Können Sie mir bitte sagen, wie ich key.pem und cert.pem mit keytool importieren kann?
Sad Al Abdullah
Kleiner Zusatz: Sie müssen -nodes am Ende hinzufügen, wenn Sie private ky exportieren
morgan_il
2

Justin (oben) ist genau. Beachten Sie jedoch, dass je nachdem, von wem Sie das Zertifikat erhalten (Zwischenzertifizierungsstelle, betroffene Stammzertifizierungsstelle oder nicht) oder wie der Pfx erstellt / exportiert wird, manchmal die Zertifikatkette fehlt. Nach dem Import hätten Sie ein Zertifikat vom Typ PrivateKeyEntry, jedoch mit einer Kette von 1 Länge.

Um dies zu beheben, gibt es mehrere Optionen. Die einfachere Option ist für mich das Importieren und Exportieren der pfx-Datei in IE (Auswahl der Option Alle Zertifikate in die Kette aufnehmen). Der Import- und Exportprozess von Zertifikaten im IE sollte an anderer Stelle sehr einfach und gut dokumentiert sein.

Importieren Sie den Keystore nach dem Export wie oben gezeigt. Jetzt hätten Sie einen Keystore mit einem Zertifikat vom Typ PrivateKeyEntry und einer Zertifikatskettenlänge von mehr als 1.

Bestimmte .Net-basierte Webdienst-Clients sind fehlerhaft (Vertrauensstellung kann nicht hergestellt werden), wenn Sie die oben genannten Schritte nicht ausführen.

TechIsFun
quelle
Dies scheint auf IE11 nicht zu funktionieren. Es ist nicht möglich, die Zertifikatskette einzuschließen, obwohl ich es sage. Ich weiß, dass dies in der Vergangenheit funktioniert hat.
Brian Knoblauch
0

Wenn Sie mit JDK 1.5 oder niedriger arbeiten, verfügt das Dienstprogramm keytool nicht über die -importkeystoreOption (siehe Dokumentation zum Keytool JDK 1.5 ), und die Lösung von MikeD ist nur verfügbar, wenn Sie das .pfxauf einem Computer mit einem neueren JDK (1.6 oder höher) übertragen.

Eine weitere Option in JDK 1.5 oder niedriger (wenn Sie über ein Oracle WebLogic-Produkt verfügen) besteht darin, die Anweisungen in diesem Oracle-Dokument zu befolgen: Verwenden von PFX- und PEM-Zertifikatformaten mit Keystores . Es beschreibt die Konvertierung in ein .pemFormat, wie Zertifikatinformationen aus diesem Textformat extrahiert und .jksmit dem java utils.ImportPrivateKeyDienstprogramm in das Format importiert werden (dies ist ein Dienstprogramm, das im WebLogic-Produkt enthalten ist).

Mariano Paniga
quelle