webentwicklung-frage-antwort-db.com.de

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

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 Passwort. Das Client-Zertifikat, das ich von der Firma hinter dem Webservice erhalten habe, hat das Format .cer. Wenn ich die Datei mit einem Texteditor inspiziere, hat sie folgenden Inhalt:

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

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

Ich konnte dieses Zertifikat in einen Keystore importieren, indem ich zuerst die erste und letzte Zeile entfernt, in Unix-Zeilenumbrüche konvertiert und einen Base64-Dekodierer ausgeführt habe. Die resultierende Datei kann in einen Schlüsselspeicher importiert werden (mit dem Befehl keytool). 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 beginne zu denken, dass das bereitgestellte Zertifikat ein öffentliches Zertifikat ist, das für die Authentifizierung verwendet wird ...

Eine Problemumgehung, die ich gefunden habe, besteht darin, das Zertifikat in IE zu importieren und es als .pfx-Datei 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 Datei .cer direkt in Java laden. Irgendwelche Gedanken?

Zusätzliche Informationen: Die Firma hinter dem Webservice hat mir mitgeteilt, dass das Zertifikat (mithilfe von IE & der Website) vom PC und vom Benutzer angefordert werden soll, der das Zertifikat später importieren möchte.

197
Jan-Pieter
  • 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 (z. B. Firmenname, Land, ...), die von einer Zertifizierungsstelle signiert sind, die garantiert, dass die angehängten Eigenschaften wahr sind.
  • .CER -Dateien sind Zertifikate und haben keinen privaten Schlüssel. Der private Schlüssel wird normalerweise mit einer .PFX keystore -Datei geliefert. Wenn Sie sich wirklich authentifizieren, liegt das daran, dass Sie den privaten Schlüssel bereits importiert hatten.
  • Normalerweise können Sie mit .CER Zertifikate problemlos importieren

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
    
282
lujop

Das Importieren der .cer -Zertifikatsdatei, die vom Browser heruntergeladen wurde (öffnen Sie die URL und suchen Sie nach Details) in cacerts keystore in Java_home\jre\lib\security hat bei mir funktioniert, im Gegensatz zu den Versuchen, meine eigene zu generieren und zu verwenden Schlüsselspeicher.

  1. Gehe zu deinem Java_home\jre\lib\security
  2. ( Windows ) Öffnen Sie dort die Admin-Befehlszeile mit cmd und CTRL+SHIFT+ENTER
  3. Führen Sie keytool aus, um das Zertifikat zu importieren:
    • (Ersetzen Sie yourAliasName und path\to\certificate.cer)
 ..\..\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.

69
jediz

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);
}
48
Patrick M

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-----
17
dogbane

Ein Open-Source-GUI-Tool finden Sie unter keystore-Explorer.org

KeyStore Explorer

KeyStore Explorer ist ein Open-Source-GUI-Ersatz für die Befehlszeilen-Dienstprogramme Keytool und Jarsigner Java. Der KeyStore Explorer bietet Funktionen und mehr über eine intuitive grafische Benutzeroberfläche.

Die folgenden Bildschirme helfen (sie sind von der offiziellen Seite)

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

[email protected]:~$./Downloads/kse-521/kse.sh

enter image description here

Wechseln Sie zur Option Examine und Examine a URL und geben Sie die zu importierende Web-URL an.

Das Ergebnisfenster sieht wie folgt aus, wenn Sie einen Link zur Google-Site angeben. enter image description here

Dies ist einer der Use Cases und der Rest ist Sache des Benutzers (alle Credits gehen an keystore-Explorer.org )

8
Shantha Kumara

Das Zertifikat, über das Sie bereits verfügen, ist wahrscheinlich das Serverzertifikat oder das Zertifikat, das zum Signieren des Serverzertifikats verwendet 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 Webdienst-Client 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 und das Anhängen dieses öffentlichen Schlüssels zusammen mit einigen Ihrer Informationen (E-Mail, Name, Domänenname usw.) an eine Datei, die als Zertifikatsanforderung bezeichnet wird. Anschließend senden Sie diese Zertifikatsanforderung an das Unternehmen, das Sie bereits darum gebeten hat. Das Unternehmen erstellt Ihr Zertifikat, indem es Ihren öffentlichen Schlüssel mit seinem privaten Schlüssel signiert. Anschließend sendet es Ihnen eine X509-Datei mit Ihrem Zertifikat zurück, die Sie verwenden können Fügen Sie nun Ihren Keystore hinzu, und Sie können eine Verbindung zu einem Webdienst über SSL herstellen, für das eine Clientauthentifizierung erforderlich ist.

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

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

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

6
Chochos

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
5
Brad Parks

So hat das bei mir funktioniert:

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

    ----- ZERTIFIKAT BEGINNEN ----- [von Microsoft serialisierte Daten] ----- ZERTIFIKAT BEENDEN -----

  2. Öffnen Sie den Browser chrome (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 im Base-64-codierten Format aus und exportieren Sie es. Speichern Sie es als .cer
  4. Jetzt können Sie es mit keytool oder Portecle in Ihren Java Keystore importieren
1
code4kix