Création :
Générer une clé privée :
openssl genrsa -out key.pem 2048
Générer un CSR à partir d’une clé existante :
openssl req -out csr.csr -key key.pem -new
Générer une nouvelle clé et un CSR :
openssl req -out csr.csr -new -newkey rsa:2048 -nodes -keyout key.pem
Générer un certificat auto-signé :
openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout key.pem -out certificate.crt -days 365
Générer un CSR sur la base d’un certificat et d’une clé existants :
openssl x509 -x509toreq -in certificate.crt -signkey key.pem -out csr.csr
Retirer la pass-phrase d’une clé privée :
openssl rsa -in key.pem -out newkey.pem
Utiliser un fichier de configuration :
[ req ] default_bits = 4096 default_md = sha256 prompt = no encrypt_key = no distinguished_name = dn req_extensions = req_ext [ dn ] C = Fr O = "Organisation" OU = "Prganizational Unit" ST = "Centre" CN = server.domain.tld [ req_ext ] subjectAltName = DNS:pop.domain.tld
Génération d’une clé et du certificat depuis ce fichier :
openssl req -new -config openssl.cnf -keyout key.pem -out csr.csr
Informations sur un certificat :
Obtenir la date d’expiration :
openssl x509 -noout -in certificate.crt -dates
Obtenir le signataire d’un certificat :
openssl x509 -noout -in certificate.crt -issuer
Obtenir le détail complet d’un certificat :
openssl x509 -noout -in certificate.crt -text
Vérification des certificats :
Vérifier qu’une clé privée et un CSR correspondent :
openssl rsa -noout -modulus -in key.pem | openssl md5 openssl req -noout -modulus -in csr.txt | openssl md5
Vérifier qu’une clé privée et un certificat correspondent :
openssl x509 -noout -modulus -in cert.crt | openssl md5 openssl rsa -noout -modulus -in key.pem | openssl md5
Vérifier un CSR :
openssl req -text -noout -verify -in csr.csr
Vérifier une clé privée :
openssl rsa -in key.pem -check
Vérifier un certificat :
openssl x509 -in certificate.crt -text -noout
Vérifier un certificat PKCS12 :
openssl pkcs12 -info -in store.p12
Tester une connexion à un serveur :
Vérifier une connexion et la chaîne de confiance sur un port TCP :
openssl s_client -connect host:443
Vérifier une connexion et la chaîne de confiance sur un port TCP en précisant le virtualhost pour le SNI :
openssl s_client -connect host:443 -servername http_host
Vérifier la prise en charge de SSLv2, SSLv3, TLS1.0, TLS1.1 et TLS1.2 :
openssl s_client -connect host:443 -ssl2 openssl s_client -connect host:443 –ssl3 openssl s_client -connect host:443 –tls1 openssl s_client -connect host:443 –tls1_1 openssl s_client -connect host:443 –tls1_2
Vérifier la prise en charge d’un algorithme de chiffrement sur un serveur (openssl ciphers) :
openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect host:443
Vérifier les algorithmes supportés avec nmap :
nmap --script ssl-enum-ciphers -p 443 10.221.36.12 Starting Nmap 6.40 ( http://nmap.org ) at 2019-09-19 16:36 CEST Nmap scan report for SR052180CTI3700.hm.dm.ad (10.221.36.12) Host is up (0.00045s latency). PORT STATE SERVICE 443/tcp open https | ssl-enum-ciphers: | TLSv1.0: | ciphers: | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | compressors: | NULL | TLSv1.1: | ciphers: | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | compressors: | NULL | TLSv1.2: | ciphers: | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - strong | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - strong | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA256 - strong | TLS_RSA_WITH_AES_128_GCM_SHA256 - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA256 - strong | TLS_RSA_WITH_AES_256_GCM_SHA384 - strong | compressors: | NULL |_ least strength: strong
Conversions :
Convertir un PEM en DER :
openssl x509 -outform der -in certificate.crt -out certificate.der
Convertir un DER en PEM :
openssl x509 -inform der -in certificate.der -out certificate.pem
Conversion PEM en PKCS12 :
openssl pkcs12 -export -inkey key.pem -in certificate.crt -name SuperCertificat -out store.p12
Conversion PKCS12 en PEM :
openssl pkcs12 -in store.p12 -out store.pem -nodes
Bravo et merci pour ce memo
Bravo pour ce mémo que je met tout de suite en favoris.
J’ai deux remarques en tête :
Je rajouterai la valeur -servername $host aux commandes s_client pour forcer le SNI. On peut tomber sur le certificat du vhost par défaut sans cela.
Je rajouterai les requêtes OCSP qu’on oublie toujours, qui sont parfois nécessaire pour le troubleshoot d’un certificat et pas souvent documenté en français.