Je souhaite importer un certificat auto-signé dans Java afin que toute application Java qui tente d'établir une connexion SSL approuve ce certificat.
Jusqu'à présent, j'ai réussi à l'importer
_keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem
_
Pourtant, quand j'essaye de courir HTTPSClient.class
je reçois toujours:
javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: la construction du chemin PKIX a échoué: Sun.security.provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide pour la cible demandée
Sous Windows , le moyen le plus simple consiste à utiliser le programme portecle .
System.out.println(System.getProperty("Java.home"));
Sous Linux:
Vous pouvez télécharger le certificat SSL à partir d'un serveur Web qui l'utilise déjà comme ceci:
$ echo -n | openssl s_client -connect www.example.com:443 | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt
Vérifiez éventuellement les informations du certificat:
$ openssl x509 -in /tmp/examplecert.crt -text
Importez le certificat dans le magasin de clés Java cacerts:
$ keytool -import -trustcacerts -keystore /opt/Java/jre/lib/security/cacerts \
-storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
Modifier:
De nos jours, il n'est pas souvent nécessaire d'ajouter un certificat au magasin de clés car vous pouvez obtenir un certificat à 5 $ par an auprès de ssls.com . Juste au cas où ce serait une option pour vous.
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"
J'ai fini par écrire un petit script qui ajoute les certificats aux magasins de clés, ce qui rend son utilisation beaucoup plus simple.
Vous pouvez obtenir la dernière version de 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
`` `
Cela a fonctionné pour moi. :)
Sudo keytool -importcert -file nom_fichier.cer -alias nomaliasalias -keystore $ ACCUEIL Java/jre/lib/security/cacerts -storepass changeit
Si vous utilisez un certificat signé par une autorité de certification qui n'est pas inclus par défaut dans le fichier Java cacerts, vous devez effectuer la configuration suivante pour les connexions HTTPS. Pour importer des certificats dans des cacerts:
La commande simple 'keytool' fonctionne également sous Windows et/ou avec Cygwin.
SI vous utilisez Cygwin voici la commande modifiée que j'ai utilisée depuis le bas de la réponse "S.Botha":
Exécutez la commande keytool de l'intérieur, en indiquant le chemin d'accès à votre nouveau certificat à la fin, comme suit:
./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"
Remarquez, car si cela est sous Cygwin, vous donnez un chemin à un programme non-Cygwin, le chemin est donc semblable à DOS et entre guillemets.
Pourrait vouloir essayer
keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem
honnêtement, je ne sais pas du tout où se trouve votre certificat si vous écrivez simplement cacerts
donnez-lui simplement un chemin complet
installer le certificat dans Java linux
/ opt/jdk (version)/bin/keytool -import -alias alias nom -fichier certificat.cer -keystore cacerts -storepass mot de passe