Ich möchte ein selbstsigniertes Zertifikat in Java importieren, damit jede Java) - Anwendung, die versucht, eine SSL-Verbindung herzustellen, diesem Zertifikat vertraut.
Bisher konnte ich es 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
Trotzdem, wenn ich versuche zu rennen HTTPSClient.class
Ich bekomme immer noch:
javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX-Pfadaufbau fehlgeschlagen: Sun.security.provider.certpath.SunCertPathBuilderException: Es wurde kein gültiger Zertifizierungspfad für das angeforderte Ziel gefunden
Unter Windows ist es am einfachsten, das Programm portecle zu verwenden.
System.out.println(System.getProperty("Java.home"));
Unter Linux:
Sie können das SSL-Zertifikat wie folgt von einem Webserver herunterladen, der es bereits 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
Bearbeiten:
Heutzutage müssen wir dem Keystore nicht mehr oft ein Zertifikat hinzufügen, da Sie von ssls.com ein Zertifikat für 5 USD pro Jahr erhalten können. Nur für den Fall, dass das eine Option für Sie ist.
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"
Am Ende habe ich ein kleines Skript geschrieben, das die Zertifikate zu den Keystores hinzufügt, sodass die Verwendung wesentlich einfacher ist.
Die neueste Version erhalten Sie von 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
`` `
Das hat bei mir funktioniert. :)
Sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ Java_HOME/jre/lib/security/cacerts -storepass changeit
Wenn Sie ein von einer Zertifizierungsstelle signiertes Zertifikat verwenden, das nicht standardmäßig in der Java cacerts-Datei enthalten ist, müssen Sie die folgende Konfiguration für HTTPS-Verbindungen vornehmen. Um Zertifikate in cacerts zu importieren:
Der einfache Befehl 'keytool' funktioniert auch unter Windows und/oder mit Cygwin.
WENN Sie Cygwin verwenden hier ist der modifizierte Befehl, den ich unten in "S.Bothas" Antwort verwendet habe:
Führen Sie den Befehl keytool aus, in dem Sie am Ende den Pfad zu Ihrem neuen Zertifikat angeben:
./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"
Beachten Sie, dass unter Cygwin ein Pfad zu einem Nicht-Cygwin-Programm angegeben wird, der Pfad also DOS-ähnlich und in Anführungszeichen steht.
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 cacerts
schreiben, geben Sie ihm einfach einen vollständigen Pfad
installiere das Zertifikat in Java Linux
/ opt/jdk (version)/bin/keytool -import -alias aliasname -datei certificate.cer -keystore cacerts -storepass password