Wie importiere ich ein selbstsigniertes Zertifikat ordnungsgemäß in den Java-Keystore, der standardmäßig für alle Java-Anwendungen verfügbar ist?

144

Ich möchte ein selbstsigniertes Zertifikat in Java importieren, damit jede Java-Anwendung, die versucht, eine SSL-Verbindung herzustellen, diesem Zertifikat vertraut.

Bisher habe ich es geschafft, es zu importieren

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem

Wenn ich versuche zu rennen, HTTPSClient.classbekomme ich trotzdem:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: Es konnte kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden werden
Sorin
quelle
Ich würde mich nicht unbedingt auf diesen Code verlassen. Dinge wie Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())sind im ersten Teil völlig unnötig. Der zweite führt keine Zertifikatsüberprüfung durch. Versuchen Sie es zunächst mit einer Ebene URLConnection. Sind Sie sicher , dass Sie geändert haben cacertsin lib/securityIhrer JRE - Installation? Haben Sie die trustmanagerDebugging-Option ausprobiert ?
Bruno

Antworten:

225

Unter Windows ist es am einfachsten, das Programm portecle zu verwenden .

  1. Laden Sie portecle herunter und installieren Sie es.
  2. Stellen Sie zunächst zu 100% sicher, dass Sie wissen, welche JRE oder JDK zum Ausführen Ihres Programms verwendet wird. Unter 64-Bit-Windows 7 kann es einige JREs geben. Process Explorer kann Ihnen dabei helfen oder Sie können Folgendes verwenden:System.out.println(System.getProperty("java.home"));
  3. Kopieren Sie die Datei JAVA_HOME \ lib \ security \ cacerts in einen anderen Ordner.
  4. Klicken Sie in Portecle auf Datei> Keystore-Datei öffnen
  5. Wählen Sie die Cacerts-Datei aus
  6. Geben Sie dieses Passwort ein: changeit
  7. Klicken Sie auf Extras> Vertrauenswürdiges Zertifikat importieren
  8. Suchen Sie nach der Datei mycertificate.pem
  9. Klicken Sie auf Importieren
  10. Klicken Sie auf OK, um eine Warnung zum Vertrauenspfad anzuzeigen.
  11. Klicken Sie auf OK, wenn die Details zum Zertifikat angezeigt werden.
  12. Klicken Sie auf Ja, um das Zertifikat als vertrauenswürdig zu akzeptieren.
  13. Wenn Sie nach einem Alias ​​gefragt werden, klicken Sie auf OK und dann erneut auf OK, wenn das Zertifikat importiert wurde.
  14. Klicken Sie auf Speichern. Vergessen Sie dies nicht oder die Änderung wird verworfen.
  15. Kopieren Sie die Datei-Cacerts dorthin zurück, wo Sie sie gefunden haben.

Unter Linux:

Sie können das SSL-Zertifikat von einem Webserver herunterladen, der es bereits wie folgt verwendet:

$ echo -n | openssl s_client -connect www.example.com:443 | \
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt

Überprüfen Sie optional die Zertifikatinformationen:

$ openssl x509 -in /tmp/examplecert.crt -text

Importieren Sie das Zertifikat in den Java Cacerts-Keystore:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
Sarel Botha
quelle
1
Die Hauptidee dabei ist nicht Portecle, sondern das Importieren von Zertifikaten in den richtigen Keystore.
Alfabravo
Das hat funktioniert, aber mein Java war an einem anderen Ort. Mein Schlüsselspeicher wurde unter / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts befindet , die ich durch Laufen gefunden , ps -ef | grep javadie mir sagte , mein Java von openjdk unter / usr / lib / jvm / java-openjdk gelegen ausgeführt wurde / bin / java. Auch wenn dies für eine Webanwendung gilt, denken Sie daran, neu zu starten. Danke für die Hilfe!!
Codezilla
7
Ich habe Portecle nicht verwendet, aber ich fand, dass Keystore Explorer ziemlich gut für Windows, Linux (und es sollte auch unter OSX funktionieren)
funktioniert
Sehr hilfreich. 2 sehr wichtige Dinge, die hier hervorgehoben werden. Zum einen geht es darum, in den richtigen Keystore zu importieren. Und eine andere ist, sicherzustellen, dass Sie im Falle eines Webservers neu starten.
SDM
6
Im Jahr 2019 können wir sogar SSL-Zertifikate kostenlos mit Diensten wie Lets encrypt
Ferrybig
41
    D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"
Vikky
quelle
12
Sie werden aufgefordert, das Keystore-Passwort einzugeben.
Der
34

Am Ende habe ich ein kleines Skript geschrieben, das die Zertifikate zu den Keystores hinzufügt, sodass die Verwendung viel einfacher ist.

Die neueste Version erhalten Sie unter https://github.com/ssbarnea/keytool-trust

#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}

KEYSTORE_PASS=changeit
KEYTOOL="sudo keytool"

# /etc/java-6-sun/security/cacerts

for CACERTS in  /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
    /usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts"
do

if [ -e "$CACERTS" ]
then
    echo --- Adding certs to $CACERTS

# FYI: the default keystore is located in ~/.keystore

if [ -z "$REMHOST" ]
    then
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
    exit 1
    fi

set -e

rm -f $REMHOST:$REMPORT.pem

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
        then
        :
        else
        cat /tmp/keytool_stdout
        cat /tmp/output
        exit 1
        fi

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
        then
        :
        else
        echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
        cat /tmp/output
        fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
    then
    echo "Key of $REMHOST already found, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
    then
    echo "Key of $REMHOST already found in cacerts, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

fi

done

`` `

Sorin
quelle
18

Das hat bei mir funktioniert. :) :)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 
Gehen
quelle
4

Wenn Sie ein von einer Zertifizierungsstelle signiertes Zertifikat verwenden, das standardmäßig nicht in der Java-Cacerts-Datei enthalten ist, müssen Sie die folgende Konfiguration für HTTPS-Verbindungen durchführen. So importieren Sie Zertifikate in Zertifikate:

  1. Öffnen Sie den Windows Explorer und navigieren Sie zu der Datei cacerts, die sich im Unterordner jre \ lib \ security befindet, in dem AX Core Client installiert ist. Der Standardspeicherort ist C: \ Programme \ ACL-Software \ AX Core Client \ jre \ lib \ security
  2. Erstellen Sie eine Sicherungskopie der Datei, bevor Sie Änderungen vornehmen.
  3. Abhängig von den Zertifikaten, die Sie von der von Ihnen verwendeten Zertifizierungsstelle erhalten, müssen Sie möglicherweise ein Zwischenzertifikat und / oder ein Stammzertifikat in die Cacerts-Datei importieren. Verwenden Sie die folgende Syntax, um Zertifikate zu importieren: keytool -import -alias -keystore -trustcacerts -file
  4. Wenn Sie beide Zertifikate importieren, sollte der für jedes Zertifikat angegebene Alias ​​eindeutig sein.
  5. Geben Sie das Passwort für den Schlüsselspeicher an der Eingabeaufforderung "Passwort" ein und drücken Sie die Eingabetaste. Das Standard-Java-Passwort für die Cacerts-Datei lautet "changeit". Geben Sie "y" unter "Diesem Zertifikat vertrauen?" Ein. Eingabeaufforderung und drücken Sie die Eingabetaste.
Bharat Darakh
quelle
Verwenden Sie diesen Befehl: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh
1

Der einfache Befehl 'keytool' funktioniert auch unter Windows und / oder mit Cygwin.

WENN Sie Cygwin verwenden , ist hier der geänderte Befehl, den ich am Ende der Antwort von "S.Botha" verwendet habe:

  1. Stellen Sie sicher, dass Sie die JRE im JDK identifizieren, die Sie verwenden werden
  2. Starten Sie Ihre Eingabeaufforderung / cygwin als Administrator
  3. Gehen Sie in das bin-Verzeichnis dieses JDK, z. B. cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Führen Sie den Befehl keytool von dort aus aus, wo Sie am Ende den Pfad zu Ihrem neuen Zertifikat angeben, wie folgt:

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts  -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"

Beachten Sie, dass Sie unter Cygwin einen Pfad zu einem Nicht-Cygwin-Programm angeben, sodass der Pfad DOS-ähnlich und in Anführungszeichen steht.

Jordan Gee
quelle
0

Vielleicht möchten Sie es versuchen

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

Ich habe ehrlich gesagt keine Ahnung, wo es Ihr Zertifikat ablegt, wenn Sie nur schreiben, cacertsgeben Sie ihm einen vollständigen Pfad

Gradient
quelle
0

Installieren Sie das Zertifikat unter Java Linux

/ opt / jdk (version) / bin / keytool -import -alias aliasname -file certificate.cer -keystore cacerts -storepass password

Apuri Srikanth
quelle
0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
Hilal Aissani
quelle