Mémo openssl

Posted by

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

3 comments

  1. 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.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *