InstallCert, l'outil TLS ultime ?

Bosser avec TLS, https et les certificats peut rapidement devenir un cauchemar. Heureusement, j’ai trouvé un solution pour vous faciliter la vie et vous permettre de gagner du temps.  Si je sujet vous interesse, vous avez sans doute vu passer un article sur l’outil SAS TLS/SSL Diagnostic Tool. Alors oui, cet outil SAS est bien, mais j'ai trouvé mieux..... J'ai trouvé l'outil ultime.... L'arme absolue..... Son nom ? InstallCert  Je vous préviens tout de suite, on ne peut pas faire plus simple comme outil. Simple mais d'un efficacité redoutable ! A mon avis, le meilleur outil dans son genre.   Ce petit programme java permet de : - Vérifier la validité un certificat serveur (ssl handshake) - Afficher  la chaîne de certification du certificat serveur - Ajouter le ou le certificat CA dans le keystore de la JVM.   Ce petit bijoux (si,si) de simplicité et d’efficacité a été développé il y a bien des années par Andreas Sterbenz, alors qu'il était Staff Engineer chez Sun.( Depuis 2008, il est Software Engineer chez Google)

Comment ça marche ?

D'abord on télécharge la source java ici. Première étape, compiler le programme :
javac InstallCert.java
Vous avez maintenant une class InstallCert Nous allons tester l’outil sur google.fr :
java InstallCert google.fr
Ce qui donne :
Opening connection to google.fr:443...
Starting SSL handshake...

No errors, certificate is already trusted

 Server sent 3 certificate(s):
  1 Subject CN=*.google.fr, O=Google Inc, L=Mountain View, ST=California, C=US
   Issuer  CN=Google Internet Authority G2, O=Google Inc, C=US
   sha1    e5 9f ce e8 dc 07 e2 0d cc 43 38 30 17 23 85 f7 ea e1 03 95
   md5     25 87 e2 f4 ad 11 24 fa ff 79 28 b0 ed b8 97 bc
 2 Subject CN=Google Internet Authority G2, O=Google Inc, C=US
   Issuer  CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
   sha1    d6 ad 07 c6 67 56 30 f5 7b 92 7f 66 be 8c e1 f7 68 f8 79 48
   md5     c5 6f 1a 63 b8 17 b7 31 89 34 c0 6e c5 ab b5 b3
 3 Subject CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
   Issuer  OU=Equifax Secure Certificate Authority, O=Equifax, C=US
   sha1    73 59 75 5c 6d f9 a0 ab c3 06 0b ce 36 95 64 c8 ec 45 42 a3
   md5     2e 7d b2 a3 1d 0e 3d a4 b2 5f 49 b9 54 2a 2e 1a
Tout est là ! Le SSL Handshake et la chaine de certification. En quelques secondes, nous avons pu valider notre connexion SSL sans s'embarquer dans des commandes keytool ou openssl efficace mais pris de de tête (mais si avouez le que c'est souvent prise de tête.. n'ayes pas hont de l'avouer) Maintenant  que j'ai validé que mon outil fonctionne, je peux jouer avec :  
java InstallCert nicolas-housset.fr
Ooopsss...
Opening connection to nicolas-housset.fr:443...
Starting SSL handshake...

javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name

at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1406)at su
n.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1982)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1096)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1342)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1369)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1353)
at InstallCert.main(InstallCert.java:98)
Could not obtain server certificate chain
Pour le coup, je m'attendais à cette erreur sur mon nom de domaine. En effet, Java 7 a introduit le support SNI (Server Name Indication), une extension du protocole TLS, et qui est activé par défaut. 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. Passons à autre chose :
java InstallCert yahoo.fr:443
Loading KeyStore
Opening connection to yahoo.fr:443...
Starting SSL handshake...
 
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
 at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
Encore un erreur dans le SSL handshake. Pour le coup le message d'erreur nous indique que le certificat ayant signé le serveur yahoo (Symantec Class 3 Secure Server CA) ne se trouve pas dans le keystore Java.  C'est bien dommage.... Mais comme nous ne sommes du genre à nous laisser abattre et à reculer devant une si petite difficulté (et surtout que l'outil le permet avec une facilité déconcertante) nous allons ajouté ce certificat CA dans le keystore Ni une ni deux, on relancer la commande :
java InstallCert yahoo.fr:443
Bien sûr, l'outil prend un malin plaisir à nous rebalancer l'erreur, mais cette fois-ci nous sommes plus attentif et constatons que l'outil nous affiche les informations du certificat CA :
 1 Subject CN=5to1.com, OU=Information Technology, O=Yahoo Inc., L=Sunnyvale, ST=California, C=US
   Issuer  CN=Symantec Class 3 Secure Server CA - G4, OU=Symantec Trust Network, O=Symantec Corporation, C=US
   sha1    31 13 33 30 71 cb 67 73 f9 59 d1 2e f8 58 63 65 5a 4b 17 4f
   md5     0d 5f 56 d6 38 8b 2c 7c c9 ec ef 29 b4 8c 01 74
... Et nous propose également une option bien pratique :
Enter certificate to add to trusted keystore or 'q' to quit: [1]
Et hop, je valide [1] et mon certificat Symantec Class 3 Secure Server CA  va s'ajouter (presque comme par magie..) dans le keystore :
Added certificate to keystore 'jssecacerts' using alias 'yahoo.fr-1'
L'outil utlime, je vous avais prévenu ! Télécharger la source : InstallCert.java  

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.