Voici un petit moyen de tester si un certificat ssl est valide, et s’il le restera encore pendant un certain temps…
Openssl s_client et openssl x509
Openssl donne deux outils qui vont nous servir.
1. Le premier permet de se connecter à un serveur pour envoyer des requêtes
openssl s_client -connect www.openssl.org:443
Cette commande va se connecter au server www.openssl.org sur le port 443 en utilisant le protocole SSL. Vous pourrez ensuite communiquer avec le serveur en HTTP :
GET / HTTP/1.0 Host : www.openssl.org
et le serveur va vous renvoyer la page. On peut aussi utiliser cette technique sur d’autres ports et d’autres protocoles, comme pour le SMTPs, le POPs, etc.
2. Le deuxième permet d’avoir des informations sur le certificat : est-il valide ? Quelle est sa date d’expiration ? Il suffit de piper la première commande avec la deuxième :
echo | openssl s_client -connect www.openssl.org:443 | openssl x509 -noout -enddate
Quelques astuces avec openssl
- Si openssl vous sort qu’un certificat dans la chaîne n’est pas valide, donnez-lui le chemin vers le dossier contenant les certificats racines, par exemple
-CApath /etc/ssl/certs
- Si vous voulez éviter d’avoir les erreurs de la première commande en sortie, envoyez-les vers /dev/null :
openssl s_client -connect www.openssl.org:443 2> /dev/null
- Si vous voulez connaitres les différentes options de openssl s_client ou de openssl x509, essayez
man ssl-s_client
ouman ssl-x509
Petit bonus : le script PHP qui teste si un certificat expire bientôt
- $args = 'www.openssl.org:443';
- $command =
- 'date +%s -d "$(LANG=C openssl s_client -connect '
- .escapeshellarg($args)
- .' -CApath /etc/ssl/certs/ < /dev/null 2>/dev/null | openssl x509 -noout -text -enddate | tail -n1 | cut -d= -f2)"';
- exec($command, $output);
- $time = array_shift($output);
- if(!is_numeric($time) || $time == 0)
- {
- // Erreur : impossible de tester la validité du certificat : pourquoi ?
- }
- else
- {
- // On va avoir le nombre de jour restant
- $nDaysLeft = floor(($time - time())/86400);
- }
Articles sources
Tester la date de fin d’un certificat : http://www.brandonhutchinson.com/When_does_my_certificate_expire%3F.html
Tester la validité du certificat avec les certificats racines : http://stackoverflow.com/questions/4103472/ssl-handshake-fails-with-a-verisign-chain-certificate-that-contains-two-ca-si