Valider une connexion https avec l’outil SAS TLS/SSL Diagnostic Tool
SAS TLS/SSL Diagnostic Tool est un outil fourni par SAS. Il s’agit d’un outil fourni «tel quel» sans aucune garantie, expresse ou implicite. SAS décline toute responsabilité liée à l'utilisation de cet outils et ne propose aucun support technique pour cet outil. Malgré ces avertissements, cet outil reste formidable pour valider une chaîne de certification SSL et pour vérifier, avec java, la sécurisation d’un site web. Cet outil forme avec keytool et openssl un trio gagnant !
Pour télécharger cet outil java, rendez-vous à l'adresse suivante : http://support.sas.com/kb/57/370.html
Maintenant que vous avez téléchargé le jar std112.jar, vous pouvez l'exécuter via la commande suivante :
Nous allons commencer par tester la validation d'un site internet que nous savons correctement configuré, Google.
Cliquez sur "Connection" puis sur "Java Keystore"
Dans la fenetre, tapez l'url de google :
https://www.google.fr :
Vous constatez également l'emplacement du keystore utilisé par java :
Une fois validé, nous constatons que la connexion est "Success"
L'outil affiche également la chaine de certification :
Maintenant que nous avons valider le fonctionnement de l'outil, nous pouvons tester sur une autre url.
Prenons par exemple, https://www.nicolas-housset.fr :
Après avoir cliqué sur "ok", une erreur s'affiche :
Pourquoi cet erreur ?
Java 7 a introduit le support SNI (
Server Name Indication), une extension du protocole TLS, et qui est activé par défaut. n J'ai constaté que certains serveurs mal configurés engendre un avertissement "Unrecognized Name" lors de la négociation SSL. Cet avertissement est ignoré par la plupart des clients SSL... sauf Java.
Pour désactiver ce check, il faut relancer l’outil en positionnant l’option « Djsse.enableSNIExtension=false » :
Relançons le test sur
https://www.nicolas-housset.fr. Nous obtenons une nouvelle erreur :
Il s’agit d’une erreur de handshake, c’est-à-dire dans la négociation SSL. En effet, avant de communiquer, le client et le serveur négocient des clés et des protocoles de chiffrement communs. Sachez qu’au début de la communication le client et le serveur s'échangent des informations (version SSL, méthodes de chiffrement méthodes de compression et certificats).
L’outil nous affiche la chaîne de certification attendue, pratique pour analyser notre problème :
On apprend donc que le site interne https://www.nicolas-housset.fr est signé par l’autorité GeoTrust Global / RapidSSL.
Pourquoi cette erreur durant le handshake ?
Il arrive parfois qu'une autorité de certification ne soit pas connue de la JVM, il faut alors ajouter manuellement les éléments de l'autorité de certification du fournisseur dans la KeyStore de la JVM. D’après le message d’erreur, cela semble être le cas. Pour vérifier, rendons-nous sur
https://www.nicolas-housset.fr en utilisant un bon vieux navigateur Chrome :
Nous constatons que le site est bien sécurisé via https :
En cliquant sur « Informations relatives au certificat », nous confirmons la chaîne de certification :
L’étape suivant de notre « débogage » consiste à confirmer l’absence du certificat « GeoTrust Global CA » dans le keystore java.
L'outil SAS TLS/SSL Diagnostic Tool propose une solution simple pour visualiser le contenu d'un keystore :
Nous constatons l’absence du certificat « GeoTrust Global CA »
Cette absence confirme l’erreur rencontrée.
Java ne peut pas vérifier l’autorité ayant certifié le certificat serveur.
Comment résoudre ce problème ?
Nous allons donc importer le certificat CA dans le keystore java.
Ce certificat Geotrust est téléchargeable à l’adresse suivante :
https://www.geotrust.com/resources/root-certificates/
Puis nous utilisons l’outil keytool pour importer le certificat dans le keystore :
Une fois l'import réalisé, nous pouvons vérifier as présence dans le keystore, en utilisant SAS TLS/SSL Diagnostic Tool :
Et maintenant que notre magasin de certificat contient l'autorité certifiante du certificat serveur du site https://www.nicolas-housset.fr, la connexion est bien sécurisé :
Il est également possible d’importer le certificat manquant directement dans l’outil.
Pour cela :
1) Renseigner le mot de passe du Keystore :
2) Sélectionner le certificat que vous souhaitez importer :
3) Cliquer sur le bouton "Import Certificate" :
4) Une fenêtre vous demande de spécifier le nom du certificat :
5) L'import est terminé :
Ce nouveau certificat CA est maintenant bien présent dans le keystore JAVA :
Boite a outils keytool :
Sous Windows, j’utilise
MobaXterm pour exécuter mes commandes keytool.
Liste des certificats présents dans un keystore :
Retourner les informations d'un certificat en le recherchant pas son alias :
Vous pouvez obtenir l'erreur suivante si l'alias n'existe pas :
Ajouter un certificat dans le keystore :
Supprimer un certificat dans le keystore :
1 |
"SASHome\SASPrivateJavaRuntimeEnvironment\9.4\jre\bin\java.exe" -jar std112.jar |
1 |
C:\Program Files\SASHome\SASPrivateJavaRuntimeEnvironment\9.4\jre\lib\security\jssecacerts |
1 |
handshake alert: unrecognized_name |
1 |
"C:\Program Files\SASHome\SASPrivateJavaRuntimeEnvironment\9.4\jre\bin\java.exe" -Djsse.enableSNIExtension=false -jar std112.jar |
1 |
unable to find valid certification path to requested target. |
1 |
keytool.exe -import -trustcacerts -file "D:\SAS\SSL\geotrust_global.crt" -alias "cn=geotrust global ca,o=geotrust inc.,c=us" -keystore "C:/Program Files/SASHome/SASPrivateJavaRuntimeEnvironment/9.4/jre/lib/security/jssecacerts" |
1 |
keytool.exe -list -v -keystore "C:/Program Files/SASHome/SASPrivateJavaRuntimeEnvironment/9.4/jre/lib/security/jssecacerts" |
1 |
keytool.exe -list -v -keystore "C:/Program Files/SASHome/SASPrivateJavaRuntimeEnvironment/9.4/jre/lib/security/jssecacerts" -alias "cn=geotrust global ca,o=geotrust inc.,c=us" |
1 2 3 4 5 6 7 8 9 10 11 |
erreur keytool : java.lang.Exception: L'alias <cn=geotrust global ca,o=geotrust inc.,c=us> n'existe pas java.lang.Exception: L'alias <cn=geotrust global ca,o=geotrust inc.,c=us> n'existe pas at sun.security.tools.KeyTool.doPrintEntry(Unknown Source) at sun.security.tools.KeyTool.doCommands(Unknown Source) at sun.security.tools.KeyTool.run(Unknown Source) at sun.security.tools.KeyTool.main(Unknown Source) |
1 |
keytool.exe -import -trustcacerts -file "D:\___HUBIC__\SAS\SSL\geotrust_global.crt" -alias "cn=geotrust global ca,o=geotrust inc.,c=us" -keystore "C:/Program Files/SASHome/SASPrivateJavaRuntimeEnvironment/9.4/jre/lib/security/jssecacerts" |
1 |
keytool.exe -list -v -keystore "C:/Program Files/SASHome/SASPrivateJavaRuntimeEnvironment/9.4/jre/lib/security/jssecacerts" -alias "cn=geotrust global ca,o=geotrust inc.,c=us" -delete |