Wie importiere ich ein .cer-Zertifikat in einen Java-Keystore?

226

Während der Entwicklung eines Java-Webservice-Clients bin ich auf ein Problem gestoßen. Die Authentifizierung für den Webservice erfolgt über ein Client-Zertifikat, einen Benutzernamen und ein Kennwort. Das Client-Zertifikat, das ich von der Firma hinter dem Webservice erhalten habe, ist im .cerFormat. Wenn ich die Datei mit einem Texteditor überprüfe, hat sie folgenden Inhalt:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

Ich kann diese Datei als Zertifikat in Internet Explorer importieren (ohne ein Passwort eingeben zu müssen!) Und sie zur Authentifizierung beim Webservice verwenden.

Ich konnte dieses Zertifikat in einen Schlüsselspeicher importieren, indem ich zuerst die erste und letzte Zeile entfernte, in Unix-Zeilenumbrüche konvertierte und eine base64-Dekodierung ausführte. Die resultierende Datei kann (mit dem keytoolBefehl) in einen Schlüsselspeicher importiert werden . Wenn ich die Einträge im Keystore aufführe, ist dieser Eintrag vom Typ trustedCertEntry. Aufgrund dieses Eintragstyps (?) Kann ich dieses Zertifikat nicht zur Authentifizierung beim Webservice verwenden. Ich fange an zu denken, dass das bereitgestellte Zertifikat ein öffentliches Zertifikat ist, das zur Authentifizierung verwendet wird ...

Eine Problemumgehung, die ich gefunden habe, besteht darin, das Zertifikat in den IE zu importieren und als .pfxDatei zu exportieren . Diese Datei kann als Keystore geladen und zur Authentifizierung beim Webservice verwendet werden. Ich kann jedoch nicht erwarten, dass meine Kunden diese Schritte jedes Mal ausführen, wenn sie ein neues Zertifikat erhalten. Daher möchte ich die .cerDatei direkt in Java laden . Irgendwelche Gedanken?

Zusätzliche Informationen: Das Unternehmen hinter dem Webservice teilte mir mit, dass das Zertifikat (über den Internet Explorer und die Website) vom PC und dem Benutzer angefordert werden sollte, der das Zertifikat später importieren würde.

Jan-Pieter
quelle

Antworten:

317
  • Wenn Sie sich authentifizieren möchten, benötigen Sie den privaten Schlüssel - es gibt keine andere Option.
  • Ein Zertifikat ist ein öffentlicher Schlüssel mit zusätzlichen Eigenschaften (wie Firmenname, Land, ...), der von einer Zertifizierungsstelle signiert wird, die garantiert, dass die angehängten Eigenschaften wahr sind.
  • .CERDateien sind Zertifikate und haben keinen privaten Schlüssel. Der private Schlüssel wird .PFX keystorenormalerweise mit einer Datei geliefert . Wenn Sie sich wirklich authentifizieren, liegt dies daran, dass Sie den privaten Schlüssel bereits importiert haben.
  • Normalerweise können Sie .CERZertifikate problemlos importieren

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
lujop
quelle
3
Es stellt sich heraus, dass der private Schlüssel von einem Plugin für IE generiert wird. Derzeit besteht die einzige Lösung darin, das Zertifikat in den IE zu importieren und eine PFX-Datei zu exportieren.
Jan-Pieter
5
.CER-Dateien haben den öffentlichen Schlüssel. Sie haben keinen privaten Schlüssel. Schlagen Sie eine Bearbeitung vor ..
KyleM
6
Was macht -alias hier?
Hop
5
:( -> Keytool-Fehler: java.lang.Exception: Geben Sie kein X.509-Zertifikat ein
Nekromant
1
@hop Ein Java-Keystore kann mehrere Zertifikate mit jeweils einem anderen Alias ​​haben, um ihn zu identifizieren. Sie können es als Referenz verwenden, um es zu identifizieren und / oder programmgesteuert anhand des Aliasnamens abzurufen.
Lujop
85

Das Importieren der .cervom Browser heruntergeladenen Zertifikatdatei (öffnen Sie die URL und suchen Sie nach Details) in den Cacerts- Keystore java_home\jre\lib\securityfunktionierte für mich, im Gegensatz zu Attemps zum Generieren und Verwenden meines eigenen Keystores.

  1. Gehen Sie zu Ihrem java_home\jre\lib\security
  2. ( Windows ) Öffnen Sie dort die Admin-Befehlszeile mit cmdund CTRL+ SHIFT+ENTER
  3. Führen Sie keytool aus, um das Zertifikat zu importieren:
    • (Ersetzen yourAliasNameund path\to\certificate.cerrespectively)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

Auf diese Weise müssen Sie keine zusätzlichen JVM-Optionen angeben, und das Zertifikat sollte von der JRE erkannt werden.

jediz
quelle
Pfad \ zu \ cert. Wenn sich meine Datei auf dem Desktop befindet, wie kann ich sie als Pfad verwenden? C: / user / desktop / oder ../../../../desktop/filename
Jesse
Unter MacOS / Linux funktioniert dieser Befehl mit sudo. Vielen Dank. aber was ist noprompt param? Ich habe es nicht benutzt und es trotzdem geschafft.
Evgeniy Mishustin
Beachten Sie, dass bei Verwendung des JDK für die Entwicklung der richtige Pfad java_home\jdk_x.xx\jre\lib\security für einen absoluten Pfad Backslash verwendet wird, z. B. "C:\myCert.crt"Anführungszeichen sind optional, wenn der Pfad keine Leerzeichen enthält.
jp-jee
Eine Million Mal danke.
Wikingersteve
Frage: Was ist mit dem privaten Schlüssel? In der Diskussion geht es um Client-Zertifikate. Meines Wissens nach muss man eine CSR mit einem privaten Schlüssel erstellen, dann ein Client-Zertifikat von der Remote-Website-Firma erhalten und dann das Client-Zertifikat mit dem privaten Schlüssel abgleichen. Ihre Antwort scheint nichts über den privaten Schlüssel zu erwähnen. Nur Fragen.
user2367418
51

Hier ist der Code, den ich zum programmgesteuerten Importieren von CER-Dateien in einen neuen KeyStore verwendet habe.

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}
Patrick M.
quelle
20

Sie sollten keine Änderungen am Zertifikat vornehmen müssen. Sind Sie sicher, dass Sie den richtigen Importbefehl ausführen?

Folgendes funktioniert für mich:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

wo mycert.cer enthält:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----
Dogbane
quelle
2
Wenn ich versuche, das unveränderte Zertifikat in den Keystore zu importieren, wird die Fehlermeldung "keytool error: java.lang.Exception: Eingabe kein X.509-Zertifikat" angezeigt. Nachdem ich das Zertifikat wie in meinem Beitrag beschrieben geändert habe, kann ich das Zertifikat ohne Fehler mit einem ähnlichen Befehl wie Ihrem importieren. Es wird jedoch als TrustedCertEntry importiert und beim Zugriff auf den Webservice nicht verwendet.
Jan-Pieter
Können Sie dem Befehl bitte die Ausnahme zur Frage hinzufügen? Sind Sie sicher, dass Sie in Ihrem Importbefehl einen Alias ​​angeben?
Dogbane
Vergessen Sie nicht, cmd als Administrator auszuführen, wenn Sie Windows
SilentBob470
9

Ein Open-Source-GUI-Tool ist unter keystore-explorer.org verfügbar

KeyStore Explorer

KeyStore Explorer ist ein Open-Source-GUI-Ersatz für das Java-Befehlszeilenprogramm keytool und jarsigner. KeyStore Explorer präsentiert ihre Funktionen und mehr über eine intuitive grafische Benutzeroberfläche.

Die folgenden Bildschirme helfen (sie stammen von der offiziellen Website)

Standardbildschirm, den Sie durch Ausführen des Befehls erhalten:

shantha@shantha:~$./Downloads/kse-521/kse.sh

Geben Sie hier die Bildbeschreibung ein

Gehen Sie zu Examineund Examine a URLOption und geben Sie dann die Web-URL an, die Sie importieren möchten.

Das Ergebnisfenster sieht wie folgt aus, wenn Sie einen Link zur Google-Website angeben. Geben Sie hier die Bildbeschreibung ein

Dies ist einer der Anwendungsfälle und der Rest liegt beim Benutzer (alle Credits gehen an keystore-explorer.org ).

Shantha Kumara
quelle
7

Das Zertifikat, über das Sie bereits verfügen, ist wahrscheinlich das Serverzertifikat oder das Zertifikat, mit dem das Serverzertifikat signiert wird. Sie benötigen es, damit Ihr Webdienst-Client den Server authentifizieren kann.

Wenn Sie jedoch zusätzlich eine Clientauthentifizierung mit SSL durchführen müssen, benötigen Sie ein eigenes Zertifikat, um Ihren Webdienstclient zu authentifizieren. Dazu müssen Sie eine Zertifikatsanforderung erstellen. Der Prozess umfasst das Erstellen Ihres eigenen privaten Schlüssels und des entsprechenden öffentlichen Schlüssels sowie das Anhängen dieses öffentlichen Schlüssels zusammen mit einigen Ihrer Informationen (E-Mail, Name, Domänenname usw.) an eine Datei, die als Zertifikatanforderung bezeichnet wird. Anschließend senden Sie diese Zertifikatanforderung an das Unternehmen, das Sie bereits danach gefragt hat. Dieses erstellt Ihr Zertifikat, indem es Ihren öffentlichen Schlüssel mit seinem privaten Schlüssel signiert, und sendet Ihnen eine X509-Datei mit Ihrem Zertifikat zurück, die Sie verwenden können Fügen Sie jetzt Ihren Keystore hinzu, und Sie können über SSL, das eine Clientauthentifizierung erfordert, eine Verbindung zu einem Webdienst herstellen.

Verwenden Sie zum Generieren Ihrer Zertifikatanforderung "keytool -certreq -alias -file -keypass -keystore". Senden Sie die resultierende Datei an das Unternehmen, das sie signieren wird.

Wenn Sie Ihr Zertifikat zurückerhalten, führen Sie "keytool -importcert -alias -keypass -keystore" aus.

In beiden Fällen müssen Sie möglicherweise -storepass verwenden, wenn der Keystore geschützt ist (was eine gute Idee ist).

Chochos
quelle
5

Hier ist ein Skript, mit dem ich eine Reihe von CRT-Dateien im aktuellen Verzeichnis stapelweise in den Java-Keystore importiert habe. Speichern Sie dies einfach in demselben Ordner wie Ihr Zertifikat und führen Sie es folgendermaßen aus:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi
Brad Parks
quelle
1

So hat das bei mir funktioniert:

  1. Speichern Sie die Zertifikatdaten in einem Texteditor als .txt im folgenden Format

    ----- BEGIN CERTIFICATE ----- [von Microsoft serialisierte Daten] ----- END CERTIFICATE -----

  2. Öffnen Sie den Chrome-Browser (dieser Schritt funktioniert möglicherweise auch mit anderen Browsern) Einstellungen> Erweiterte Einstellungen anzeigen> HTTPS / SSL> Zertifikate verwalten Importieren Sie die TXT-Datei in Schritt 1
  3. Wählen Sie dieses Zertifikat aus und exportieren Sie es im Base-64-codierten Format. Speichern Sie es als .cer
  4. Jetzt können Sie Keytool oder Portecle verwenden, um es in Ihren Java-Keystore zu importieren
code4kix
quelle