Comment importer correctement un certificat auto-signé dans le magasin de clés Java qui est disponible par défaut pour toutes les applications Java?

144

Je souhaite importer un certificat auto-signé dans Java afin que toute application Java qui tentera d'établir une connexion SSL fasse confiance à ce certificat.

Jusqu'à présent, j'ai réussi à l'importer dans

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.classj'obtiens toujours:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: la création du chemin PKIX a échoué: sun.security.provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide vers la cible demandée
Sorin
la source
Je ne me fierais pas nécessairement à ce code. Des choses comme Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())sont complètement inutiles dans la première partie. Le second ne fait aucune vérification de certificat. Essayez avec une plaine URLConnectionpour commencer. Etes - vous sûr que vous avez modifié cacertsdans lib/securityde votre installation JRE? Avez-vous essayé l' trustmanageroption de débogage ?
Bruno

Réponses:

224

Sous Windows, le moyen le plus simple est d'utiliser le portecle du programme .

  1. Téléchargez et installez portecle.
  2. Assurez-vous d'abord à 100% de savoir quel JRE ou JDK est utilisé pour exécuter votre programme. Sur un Windows 7 64 bits, il pourrait y avoir un certain nombre de JRE. Process Explorer peut vous aider ou vous pouvez utiliser:System.out.println(System.getProperty("java.home"));
  3. Copiez le fichier JAVA_HOME \ lib \ security \ cacerts dans un autre dossier.
  4. Dans Portecle, cliquez sur Fichier> Ouvrir le fichier Keystore
  5. Sélectionnez le fichier cacerts
  6. Entrez ce mot de passe: changez
  7. Cliquez sur Outils> Importer un certificat approuvé
  8. Recherchez le fichier mycertificate.pem
  9. Cliquez sur Importer
  10. Cliquez sur OK pour l'avertissement concernant le chemin de confiance.
  11. Cliquez sur OK lorsqu'il affiche les détails sur le certificat.
  12. Cliquez sur Oui pour accepter le certificat comme approuvé.
  13. Lorsqu'il demande un alias, cliquez sur OK et cliquez à nouveau sur OK lorsqu'il dit qu'il a importé le certificat.
  14. Cliquez sur Enregistrer. N'oubliez pas ceci ou la modification est annulée.
  15. Copiez le fichier cacerts là où vous l'avez trouvé.

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 keystore Java cacerts:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
Sarel Botha
la source
1
L'idée principale de ceci n'est pas le portecle mais l'importation de certificats dans le bon keystore.
Alfabravo
Cela a fonctionné, mais mon java était dans un endroit différent. Mon keystore était situé dans / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts que j'ai trouvé en exécutant ps -ef | grep javace qui m'a dit que mon java fonctionnait depuis openjdk situé dans / usr / lib / jvm / java-openjdk / bin / java. Aussi, si c'est pour une application Web, n'oubliez pas de redémarrer. Merci pour l'aide!!
Codezilla
7
Je n'ai pas utilisé portecle, mais j'ai trouvé que Keystore Explorer fonctionne plutôt bien pour Windows, Linux (et il devrait également fonctionner sur OSX)
Xantix
Très utile en effet. 2 choses très importantes mises en évidence ici. La première consiste à importer dans le bon keystore. Et une autre consiste à vous assurer de redémarrer en cas de serveur Web.
sdm
6
En 2019, nous pouvons même obtenir des certificats SSL gratuitement en utilisant des services tels que Lets
encrypt
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
la source
12
Vous serez invité à entrer le mot de passe du keystore, la valeur par défaut est "changeit"
The Gilbert Arenas Dagger
33

J'ai fini par écrire un petit script qui ajoute les certificats aux keystores, donc c'est beaucoup plus facile à utiliser.

Vous pouvez obtenir la dernière version sur 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
la source
"sudo keytool" NOPE
Dragas il y a
17

Cela a fonctionné pour moi. :)

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

Si vous utilisez un certificat signé par une autorité de certification qui n'est pas inclus par défaut dans le fichier cacerts Java, vous devez effectuer la configuration suivante pour les connexions HTTPS. Pour importer des certificats dans des cacerts:

  1. Ouvrez l'Explorateur Windows et accédez au fichier cacerts, qui se trouve dans le sous-dossier jre \ lib \ security où AX Core Client est installé. L'emplacement par défaut est C: \ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. Créez une copie de sauvegarde du fichier avant d'apporter des modifications.
  3. Selon les certificats que vous recevez de l'autorité de certification que vous utilisez, vous devrez peut-être importer un certificat intermédiaire et / ou un certificat racine dans le fichier cacerts. Utilisez la syntaxe suivante pour importer des certificats: keytool -import -alias -keystore -trustcacerts -file
  4. Si vous importez les deux certificats, l'alias spécifié pour chaque certificat doit être unique.
  5. Tapez le mot de passe du keystore à l'invite «Password» et appuyez sur Entrée. Le mot de passe Java par défaut pour le fichier cacerts est «changeit». Tapez "y" dans le champ "Faire confiance à ce certificat?" et appuyez sur Entrée.
Bharat Darakh
la source
Utilisez cette commande: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh
1

La simple commande 'keytool' fonctionne également sous Windows et / ou avec Cygwin.

SI vous utilisez Cygwin, voici la commande modifiée que j'ai utilisée à partir du bas de la réponse "S.Botha":

  1. assurez-vous d'identifier le JRE dans le JDK que vous allez utiliser
  2. Démarrez votre invite / cygwin en tant qu'administrateur
  3. aller dans le répertoire bin de ce JDK, par exemple cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Exécutez la commande keytool depuis l'intérieur, où vous fournissez le chemin vers votre nouveau Cert à la fin, comme ceci:

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

Remarquez, car si c'est sous Cygwin, vous donnez un chemin vers un programme non-Cygwin, donc le chemin est de type DOS et entre guillemets.

Jordan Gee
la source
0

Je pourrais vouloir essayer

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

Honnêtement, je n'ai aucune idée de l'endroit où il met votre certificat si vous venez d'écrire, cacertsdonnez-lui simplement un chemin complet

Pente
la source
0

installer le certificat dans java linux

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

Apuri Srikanth
la source
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
la source