Hallo Habr! Ich präsentiere Ihnen die Übersetzung des 10. Artikels "Java Keytool" von Jakob Jenkov aus einer Reihe von Artikeln für Anfänger , die die Grundlagen der Kryptographie in Java erlernen möchten.
Inhaltsverzeichnis:
- Java-Kryptographie
- Java-Chiffre
- Messagedigest
- Mac
- Unterschrift
- Schlüsselpaar
- Schlüsselgenerator
- KeyPairGenerator
- Keystore
- Keytool
- Zertifikat
- CertificateFactory
- CertPath
Java Keytool ist ein Befehlszeilenprogramm, mit dem Paare aus öffentlichen und privaten Schlüsseln generiert und in einem Schlüsselspeicher gespeichert werden können. Die ausführbare Datei des Dienstprogramms wird mit dem Java SDK (oder JRE) verteilt. Wenn Sie das SDK installiert haben, wird es ebenfalls vorinstalliert.
Die ausführbare Datei heißt keytool
. Öffnen Sie zum Ausführen eine Eingabeaufforderung (cmd, Konsole, Shell usw.). und ändern Sie das aktuelle Verzeichnis in das Verzeichnis bin
im Java SDK-Installationsverzeichnis. keytool
und drücken Sie die Enter
. Sie sollten etwas Ähnliches sehen:
C:\Program Files\Java\jdk1.8.0_111\bin>keytool Key and Certificate Management Tool Commands: -certreq Generates a certificate request -changealias Changes an entry's alias -delete Deletes an entry -exportcert Exports certificate -genkeypair Generates a key pair -genseckey Generates a secret key -gencert Generates certificate from a certificate request -importcert Imports a certificate or a certificate chain -importpass Imports a password -importkeystore Imports one or all entries from another keystore -keypasswd Changes the key password of an entry -list Lists entries in a keystore -printcert Prints the content of a certificate -printcertreq Prints the content of a certificate request -printcrl Prints the content of a CRL file -storepasswd Changes the store password of a keystore Use "keytool -command_name -help" for usage of command_name C:\Program Files\Java\jdk1.8.0_111\bin>
Wie Sie sehen können, unterstützt das Dienstprogramm keytool
eine Reihe von Befehlen für die Arbeit mit Schlüsseln, Zertifikaten und Schlüsselspeichern. Diese Anleitung behandelt die am häufigsten verwendeten dieser Befehle.
Keytool
Befehle enthalten viele Argumente, deren Installation schwer zu merken sein kann. Daher wird empfohlen, mehrere CMD- oder Shell-Skripte mit einer Folge von Keytool
Befehlen zu Keytool
. Diese Skripte erleichtern das erneute Ausführen von Befehlen und ermöglichen es Ihnen, zurück zu gehen und zu sehen, wie der Schlüsselspeicher erstellt wurde.
Schlüsselpaargenerierung
Das Generieren eines Schlüsselpaars (öffentlicher Schlüssel / privater Schlüssel) ist eine der häufigsten Aufgaben, für die das Dienstprogramm Keytool
verwendet wird. Das generierte Schlüsselpaar wird als selbstsigniertes Schlüsselpaar in die KeyStore- Datei eingefügt. Hier ist ein allgemeines Befehlszeilenformat zum Generieren eines Schlüsselpaars:
-genkeypair -alias alias -keyalg keyalg -keysize keysize -sigalg sigalg -dname dname -keypass keypass -validity valDays -storetype storetype -keystore keystore -storepass storepass -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption
Die Argumente werden im Abschnitt Keytool-Argumente erläutert. Nicht alle diese Argumente werden benötigt und viele sind optional. Das Dienstprogramm informiert Sie, wenn Sie das erforderliche Argument übersehen haben. Hier ist ein Beispiel für einen Befehl, der ein Zertifikat in den KeyStore importiert . Denken Sie daran, Zeilenumbrüche zu entfernen, wenn Sie einen Befehl in die Befehlszeile eingeben.
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -importcert -alias testkey -keypass 123456 -storetype JKS -keystore keystore2.jks -file cert.cert -rfc -storepass abcdef
Liste der Tresordatensätze
Um die Einträge im Keystore aufzulisten, können Sie den Befehl list
. Unten finden Sie das Format für den list
. Zeilenumbrüche sollen leicht lesbar sein. Entfernen Sie Zeilenumbrüche, bevor Sie den Befehl ausführen:
-list -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -rfc -protected -Jjavaoption
Hier ist ein Beispiel für einen list
. Denken Sie daran, Zeilenumbrüche zu entfernen!
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -storetype JKS -keystore keystore.jks -storepass abcdef
Dieser Befehl listet alle Einträge in diesem Schlüsselspeicher auf. Die Ausgabe sieht ungefähr so aus:
Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry testkey, 19-Dec-2017, PrivateKeyEntry, Certificate fingerprint (SHA1): 4F:4C:E2:C5:DA:36:E6:A9:93:6F:10:36:9E:E5:E8:5A:6E:F2:11:16
Wenn Sie das alias
Argument in den list
, wird nur der Eintrag aufgelistet, der dem angegebenen Alias entspricht. Hier ist ein Beispiel für einen list
mit dem alias
Argument:
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef
Das Ergebnis des obigen Befehls:
testkey, 15-Dec-2017, PrivateKeyEntry, Certificate fingerprint (SHA1): 71:B0:6E:F1:E9:5A:E7:F5:5E:78:71:DC:08:80:47:E9:5F:F8:6D:25
Löschen Sie einen Keystore-Eintrag
Außerdem gibt es im Dienstprogramm keytool
einen Befehl, mit dem ein Eintrag aus dem Keystore delete
kann: delete
. Hier ist das Format dieses Befehls:
-delete -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption
Hier ist ein Beispiel für den Aufruf von delete
. Denken Sie daran, Zeilenumbrüche vor dem Start zu entfernen!
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -delete -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef
Dieser Befehl löscht den Repository-Eintrag mit dem in der Datei testkey
gespeicherten Alias- testkey
.
Generierung von Zertifikatsanforderungen
Das Dienstprogramm keytool
kann mit dem certreq
eine Zertifikatanforderung generieren. Eine Zertifikatanforderung ist eine Anforderung an eine Zertifizierungsstelle (CA), ein öffentliches Zertifikat für Ihre Organisation zu erstellen. Nach dem Erstellen einer Zertifikatanforderung muss diese an die Zertifizierungsstelle gesendet werden, bei der Sie das Zertifikat erstellen möchten (z. B. Verisign, Thawte oder eine andere Zertifizierungsstelle). Bevor Sie eine Zertifikatanforderung für einen privaten Schlüssel und ein Paar öffentlicher Schlüssel generieren können, müssen Sie diesen privaten Schlüssel und ein Paar öffentlicher Schlüssel im Schlüsselspeicher generieren (oder importieren). Wie das geht, finden Sie im entsprechenden Kapitel. Hier ist das Befehlsformat zum Generieren der Zertifikatanforderung. Denken Sie daran, alle Zeilenumbrüche zu entfernen, wenn Sie diesen Befehl verwenden:
-certreq -alias alias -sigalg sigalg -file certreq_file -keypass keypass -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption
Hier ist ein Beispiel für den -certreq
:
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -certreq -alias testkey -keypass 123456 -storetype JKS -keystore keystore.jks -storepass abcdef -file certreq.certreq
Dieser Befehl generiert eine Zertifikatanforderung für einen Schlüssel, der mit dem Alias- testkey
in der Datei testkey
gespeichert ist, und schreibt die Zertifikatanforderung in eine Datei mit dem Namen certreq.certreq
.
Das Folgende ist eine Liste von Argumenten, die verschiedene keytool
Befehle keytool
. Denken Sie daran, dass nicht alle Teams alle diese Argumente akzeptieren. Sehen Sie sich einen bestimmten Befehl an, um festzustellen, welche Argumente erforderlich sind.
-alias
Der Alias des -alias
Eintrags. Erinnere dich an den Alias
kann nur auf einen Schlüssel zeigen.-keyalg
Der Name des Algorithmus, der zum Generieren des Schlüssels verwendet wird. Häufig verwendete RSA.-keysize
Die Schlüsselgröße in Bit. In der Regel sind die Schlüsselgrößen mehrfach. Darüber hinaus können verschiedene Algorithmen nur bestimmte vordefinierte Schlüsselgrößen unterstützen.-sigalg
Der Signaturalgorithmus zum Signieren eines Schlüsselpaars.-dname
Eindeutiger Name aus dem X.500-Standard. Dieser Name wird zugeordnet
Ein Alias für dieses Schlüsselpaar auch im Keystore
wird als Felder "Emittent" und "Betreff" im selbstsignierten verwendet
Zertifikat.-keypass
Schlüsselpaar Passwort erforderlich für
Zugriff auf dieses bestimmte Schlüsselpaar im Keystore.-validity
Anzahl der Tage, an denen das Zertifikat ausgestellt wurde
an ein Schlüsselpaar angehängt muss gültig sein.-storetype
Das Dateiformat, in dem der -storetype
gespeichert werden soll. Der Standardwert ist JKS. Eine weitere Option ist das PKCS11-Format.-keystore
Der Name der Repository-Datei zum Speichern des generierten Paares
Schlüssel. Wenn die Datei nicht vorhanden ist, wird sie erstellt.-file
Der Name der Datei, die ein Zertifikat lesen oder schreiben oder ein Zertifikat anfordern soll.-storepass
Passwort aus dem Keystore an alle, die arbeiten wollen
Damit benötigen Sie dieses Passwort. Der Unterschied zwischen storepass
und keypass
in
dass der erste Zugriff auf das Repository und der zweite Zugriff auf ein separates Repository bietet
ein Schlüsselpaar. Sie benötigen beide Passwörter, um auf einen beliebigen Schlüssel zugreifen zu können.
im Lager gespeichert.-rfc
Wenn Sie dieses Flag aktivieren, verwendet das Dienstprogramm ein Textformat anstelle eines Binärformats, z. B. zum Exportieren oder Importieren von Zertifikaten. -Rfc-Wert
bezieht sich auf RFC 1421.-providerName
Der Name des kryptografischen API-Anbieters, den Sie beim Erstellen des Schlüsselpaars verwenden möchten. Der Anbietername muss in den Java-Sicherheitseigenschaftendateien angegeben werden.-providerClass
Der Name der Stammklasse des kryptografischen API-Anbieters, den Sie verwenden möchten. Wird verwendet, wenn der Anbietername nicht in den Java-Sicherheitseigenschaftendateien angegeben ist.-providerArg
Argumente, die während der Initialisierung an den eigenen kryptografischen Anbieter übergeben wurden (falls vom Anbieter erforderlich).-v
Kurz für ausführlich, Keytool druckt viele zusätzliche Informationen in einem lesbaren Format in die Befehlszeile.-protected
Legt fest, ob das Keystore-Kennwort von einem externen Mechanismus bereitgestellt werden soll, z. B. einem Hardware-Token. Gültige Werte sind wahr und falsch.-Jjavaoption
für die Java-VM, die ein Schlüsselpaar generiert und Speicher erstellt.