Bases OpenSSL

Conventions de base

Dans tous les exemples qui suivent, le nommage des fichiers se base sur cette chaine de certification:

certificate chain

Pour les extensions des fichiers, vous retrouverez:

Dans certain cas, OpenSSL refusera de faire certaine opérations si les droits de vos fichiers ne sont pas assez restrictifs. Pour les types de fichiers suivant, voici les droits que vous devriez positionner:

Commandes de base

Affichage du contenu d’un certificat x509v3

$ openssl x509 -text -in myCert.pem

Vérification que la clé privée est bien associée au certificat/CSR. Pour cela il faut vérifier que les « modulus » des deux sont similaires:

Sinon on peut vérifier la clé privée par rapport au certificat en lançant un serveur:

$ openssl s_server -accept 443 -cert myCert.pem -key myCert.key

Vérification de la chaine de certification. Vérifie que le certificat myCert.pem est bien issu de myACInter.pem, lui-même issu de myRootAC.pem

$ openssl verify -CAfile myRootAC.pem -untrusted myACInter.pem myCert.pem

Pour récupérer la chaine de certification d’un serveur TLS/SSL (affiche la liste au format PEM):

$ openssl s_client -showcerts -connect www.example.com:443

Conversion d’un format DER en PEM:

$ openssl x509 -inform der -in myCert.crt -out myCert.pem

Conversion d’une clé privé au format PEM en PKCS#8:

$ openssl pkcs8 -in myCert.key -topk8 -out myCertPkcs8.key -nocrypt

Création d’un PKCS#12 à partir d’un certificat et de sa clé:

$ openssl pkcs12 -export -out myCert.p12 -inkey myCert.key -in myCert.pem

Autorité racine

Génération d’une biclé RSA (de 2048 bits) et du certificat correspondant pour création d’une autorité de certification racine (durée de vie 10 ans)

$ openssl req -x509 -newkey rsa:2048 -keyout myRootAC.key -out myRootAC.pem -days 3652 -config openssl.conf -extensions CA_ROOT

Chiffrement de la clé privé RSA si aucune passphrase n’a été définie.

$ cat myClearRootAC.key | openssl rsa -out myRootAC.key -aes256

Génération d’une clé privée ECDSA (de 384 bits) et sécurisation de celle-ci avec une passphrase (chiffrement symétrique AES-256)

$ openssl ecparam -genkey -name secp384r1 | openssl ec -out myRootAC.key -aes256

Création d’une autorité de certification racine (durée de vie 10 ans) à partir de la clé privée ECDSA générée précédemment.

$ openssl req -key myRootAC.key -new -x509 -days 3652 -sha384 -out myRootAC.pem -config openssl.conf -extensions CA_ROOT

Packaging en PKCS#7 (possibilité de mettre plusieurs certificats)

$ openssl crl2pkcs7 -nocrl -certfile myRootAC.pem -out myRootAC.p7b

Extraction de certificats depuis un PKCS#7. Si plusieurs certificats sont présents, ils seront mis bout à bout

$ openssl pkcs7 -print_certs -in myRootAC.pem -out myRootAC.pem

Autorité intermédiaire

Génération d’une biclé RSA et demande de signature de certificat (CSR) au format PKCS#10. Les informations relatives au futur certificat (pays, ou, cn…) sont demandées en ligne.

$ openssl req -newkey rsa:2048 -keyout myACInter.key -out myACInter.csr -config openssl.conf -extensions CA_INTER

Demande de signature de certificat (CSR) au format PKCS#10, si la clé a déjà été générée préalablement. Les informations relatives au futur certificat (pays, ou, cn…) sont demandées en ligne, en accord avec le fichier de configuration openssl.conf.

$ openssl req -new -sha256 -key myACInter.key -out myACInter.csr -config openssl.conf -extensions CA_INTER

Signature d’un certificat à partir d’un CSR et d’une autorité de certification (durée de vie du certificat 5 ans)

$ openssl x509 -req -in myACInter.csr -out myACInter.pem -CA myRootAC.pem -CAkey myRootAC.key -CAcreateserial -days 1825 -extfile openssl.conf -extensions CA_INTER

Certificats finaux

Génération d’une biclé RSA et demande de signature du certificat (csr) au format PKCS#10

$ openssl req -newkey rsa:2048 -keyout myCert.key -out myCert.csr -config openssl.conf -extensions USER_CERT

Demande de signature de certificat (CSR) au format PKCS#10, si la clé a déjà été générée préalablement. Les informations relatives au futur certificat (pays, ou, cn…) sont demandées en ligne, en accord avec le fichier de configuration openssl.conf.

$ openssl req -new -sha256 -key myCert.key -out myCert.csr -config openssl.conf -extensions USER_CERT

Signature d’un certificat à partir d’un CSR et d’une autorité de certification (durée de vie du certificat 2 ans). Les options -extfile, et -extensions sont facultatives si les informations sont présentes dans le CSR.

$ openssl x509 -req -in myCert.csr -out myCert.pem -CA myACInter.pem -CAkey myACInter.key -CAcreateserial -days 730 -extfile openssl.conf -extensions USER_CERT

Exemple de fichier de configuration d’extensions

Pour éviter de passer tous les paramètres OpenSSL en ligne de commande, il est possible de créer des fichiers de configuration x509v3. Ces fichiers de configuration permettent d’être consistant dans les algorithmes, types de certificats …

[ req ]
distinguished_name = req_distinguished_name

[ req_distinguished_name ]
countryName                 = Pays (code sur 2 lettres)
countryName_default         = FR
countryName_min             = 2
countryName_max             = 2
stateOrProvinceName         = Etat, province ou departement
stateOrProvinceName_default = Indre-et-Loire
localityName                = Ville
localityName_default        = Tours
organizationName            = Organisation
organizationName_default    = Polytech
commonName                  = Nom Commun
commonName_max              = 64
emailAddress                = Adresse Mail
emailAddress_max            = 64

[ CA_ROOT ]
basicConstraints       = critical, CA:TRUE, pathlen:2
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always
keyUsage               = critical, keyCertSign, cRLSign
nsCertType             = sslCA, emailCA, objCA
nsComment              = "Certificat Racine"

[ CA_INTER ]
basicConstraints       = critical, CA:TRUE, pathlen:1
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always
keyUsage               = critical, keyCertSign, cRLSign

[ USER_CERT ]
basicConstraints       = critical, CA:FALSE
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always

Client / Serveur OpenSSL

Concaténation des AC dans un fichier PEM unique

$ cat myRootAC.pem myACInter.pem > myACs.pem

Lancement d’un serveur.

$ openssl s_server -accept 8080 -cert myCert.pem -key myCert.key -CAfile myACs.pem

Lancement d’un client. Le handshake TLS négociera les algos cryptographiques entre client et serveur (plus fort dénominateur commun).

$ openssl s_client -connect 127.0.0.1:8080 -cert myCert2.pem -key myCert2.key -CAfile myACs.pem -showcerts -verify 2
Par Jérémy HERGAULT, le .