Conventions de base
Dans tous les exemples qui suivent, le nommage des fichiers se base sur cette chaine de certification:
Pour les extensions des fichiers, vous retrouverez:
- .key : Clé privée asymétrique,
- .pem : Certificat d’un couple de clé asymétrique (contient la clé publique),
- .csr : Demande de certification à une autorité,
- .conf : Fichier de configuration OpenSSL.
- .srl : Fichier contenant l’ID d’un certificat.
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:
- Une clé privée (asymétrique ou symétrique) ne doit pouvoir être lu que par son propriétaire, et ne pas être écrite.
Personne d’autre ne doit y avoir accès pour des raisons de sécurités
$ chmod 400
- Un certificat ou clé public (.pem) ne peut que être lu.
Personne ne peut écrire dedans, pas même son propriétaire, car il n’est pas forcément l’émetteur du certificat
$ chmod 444
- Une demande de certification à une autorité (.csr), comme le certificat ne peut que être lu.
Les données contenues par cette demande sont publiques, mais ne doivent pas être modifiées
$ chmod 444
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:
- Certificat:
$ openssl x509 -noout -modulus -in myCert.pem | openssl sha256
- Clé privée RSA:
$ openssl rsa -noout -modulus -in myCert.key | openssl sha256
- CSR:
$ openssl req -noout -modulus -in myCert.csr | openssl sha256
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)
-CAcreateserial
: créer un fichier de gestion des numéros de série des certificats issus de l’AC.-extfile
: permet d’ajouter des extensions au certificat : nom du fichier contenant les définitions (pas obligatoire si les données sont déjà dans le CSR).- Le paragraphe concerné dans ce fichier (s’il est inclus) est mentionné par
-extensions
$ 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).
-verify 2
: vérifie le certificat serveur sur 2 niveaux d’AC. Si erreur, la connexion est refusée-showcerts
: permet d’afficher les certificats
$ openssl s_client -connect 127.0.0.1:8080 -cert myCert2.pem -key myCert2.key -CAfile myACs.pem -showcerts -verify 2