OpenSSL – Formats & Cheat-Sheet

Bonjour à tous ! Aujourd'hui nous allons voir ensemble les principales commandes OpenSSL sur la manipulation des certificats X509, que ça soit générer, convertir, signer, etc.

EDIT : vous trouverez une version plus à jour des commandes sur ce lien.

Les principaux formats

Tout d'abord nous allons aborder les formats les plus utilisés dans le monde des certificats, c'est à dire :

PEM Format

Le format le plus commun, il est utilisé dans la plupart des cas. Les certificats PEM sont en B64 et les extensions sont généralements .crt, .cer, .pem, .key

Ce format la est lisible avec un éditeur et comporte les indications « --- BEGIN XXX --- » & « --- END XXX --- » et est valable pour les certificats et les clés privées.

DER Format

Le format DER est le format binaire des certificats. Tous les types de certificats et clés privées peuvent être convertis en DER. Les fichiers ne contiennent donc pas les indications « BEGIN » & « END » et les fichiers sont difficilement lisibles avec un éditeur comme vi par exemple. Ils sont principalement utilisés sur des plateformes Java.

Les extensions pour les fichiers sont généralement .cer .der & .key

P7B / PKCS7

Le format P7B est également un format basé sur le B64 et possède généralement les extensions .p7b & .p7c

Ce format n'est possible que pour les parties publiques des certificats et les autorités. Il n'est donc pas possible de mettre une clé privée au format p7b. Ce format est utilisé principalement sur des solutions Microsoft et Java.

P12 / PFX

Le format p12/pfx quant à lui permet de stocker tous les éléments en même temps, c'est à dire les autorités, le certificat et la clé privée dans un fichier au format binaire chiffré.

Il est utilisé sur les environnements Microsoft et Java et utilise les extensions : .p12 & .pfx

Java Key Store

Les Java Key Store ou JKS fonctionne presque comme les fichiers p12 à la différence que dans ce dernier vous ne pouvez pas inclure les autorités ou CA. Il y a donc deux fichiers distants, le JKS contenant la clé privée et le certificat et le fichier cacert (truststore) contenant les différentes autorités.

Pour en savoir plus vous pouvez vous rendre ici et ici.

L'extension utilisée pour le JKS est .jks et ce type de certificat ce manipule avec l'outil Keytool contrairement aux autres. Cependant, attention il n'est pas possible à ma connaissance d'extraire de clé privée d'un JKS, si vous en avez besoin pensez à stocker vos clés privées en lieu sûr.

Les commandes principales

Générales

 1### Générer une nouvelle clé RSA
 2openssl genrsa -out www.exemple.com.key 2048
 3
 4### Générer une demande de certificat (CSR) sans clé privée
 5openssl req -sha256 -nodes -newkey rsa:2048 -keyout www.exemple.com.key -out www.exemple.com.csr
 6
 7### Générer une nouvelle demande de certificat à base d'une clé existante
 8openssl req -new -sha256 -key www.exemple.com.key -out www.exemple.com.csr
 9
10### Générer une demande de certificat à base d'un certificat existant
11openssl x509 -x509toreq -in www.exemple.com.crt -out www.exemple.com.csr -signkey www.exemple.com.key
12
13### Générer un certificat auto-signé pour des tests
14openssl req -x509 -newkey rsa:2048 -nodes -keyout www.exemple.com.key -out www.exemple.com.crt -days 365
15
16### Afficher les informations d'une CSR
17openssl req -text -noout -verify -in CSR.csr
18
19### Afficher les informations d'une clé privée
20openssl rsa -noout -text -check -in www.exemple.com.key
21
22### Afficher les informations d'un certificat
23openssl x509 -in certificate.crt -text -noout
24
25### Afficher les informations d'un P12
26openssl pkcs12 -info -in KEYSTORE.p12
27
28### Afficher et tester les certificats sur un serveur
29openssl s_client -connect www.exemple.com:443
30
31### Vérification de l'appartenance CSR/clé/certificat avec le hash du modulus
32openssl x509 -noout -modulus -in www.exemple.com.crt | openssl sha256
33openssl req -noout -modulus -in www.exemple.com.csr | openssl sha256
34openssl rsa -noout -modulus -in www.exemple.com.key | openssl sha256
35
36### Converstion PEM vers P12
37openssl pkcs12 -export -inkey fichier_clé_privée -in fichier_certificat -certfile fichier_chaine_certification -out nom_du_fichier_voulu.pfx
38### Un mot de passe vous sera demandé pour créer le fichier p12.
39
40### Clé et certificat PEM en un seul fichier
41cat votre_cert.crt votre_key.key > nom_du_pem.pem
42
43### Extraction de données d’un p12/pfx
44##### La passphrase du PFX sera demandée pour chaque opération.
45##### Export certificat
46openssl pkcs12 -in votre_fichier.pfx -out certificate.crt –nokeys
47##### Extraction d’une clé en PKCS8
48openssl pkcs12 –in votre_fichier.pfx -out key.key -nocerts –nodes
49
50### Clé privée PKCS8 vers PKCS1 (RSA)
51openssl rsa -in key.key -out key2.key
52
53### Clé privée PKCS1 vers PKCS8 
54openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs1.key -out pkcs8.key
55
56### Conversion d'une clé privée DER vers PEM
57openssl rsa -inform der -in votrecle_der.der -out nomdecle_pem.key
58
59### Conversion d'une clé privée PEM vers DER
60openssl rsa -inform PEM -outform der -in votrecle.key -out nomdecle.der
61
62### Conversion d'un certificat DER vers PEM
63openssl x509 -inform der -in certder.cer -out certificatename.crt
64
65### Conversion d'un certificat PEM to DER
66openssl x509 -outform der -in certificatpem.crt -out certificatder.cer

Pour la partie P7B personnellement j'utilise l'outil en ligne disponible ici, ce n'est pas gênant car le P7B ne contient que des fichiers publiques.

Certificats ECC (Elliptic Curve)

Voir également l'article sur ce sujet.

 1### Générer clé :
 2openssl ecparam -genkey -name prime256v1 -out key.pem
 3
 4### Ajouter passphrase à la clé ECC :
 5openssl ec -in example.key -des3 -out example.key
 6
 7### Générer CSR :
 8openssl req -new -sha256 -key example.key -nodes -out example.csr
 9
10### Générer certificat :
11openssl req -x509 -sha256 -days 365 -key key.pem -in csr.csr -out certificate.pem
12
13### Lister paramètres ECC :
14openssl ecparam -list_curves
15
16### Afficher la clé publique de la clé privée :
17openssl ec -in example.key -pubout
18
19### Afficher la clé publique de la CSR :
20openssl req -in example.csr -pubkey -noout
21
22### Afficher la clé publique du certificat :
23openssl x509 -in example.crt -pubkey -noout

KeyTool (Java Key Store)

 1### Importation/Création du JKS
 2keytool -importkeystore -destkeystore nomdevotrejks.jks -srckeystore votrep12.p12 -srcstoretype pkcs12
 3
 4### Créer/Importer un certificat et une clé privée au format pem (.crt/.key) dans un JKS
 5##### Création d'un fichier .pem contenant la clé privée et le certificat
 6cat votre_cert.cert votre_key.key > nom_du_pem.pem
 7##### Ajout du fichier pem dans un keystore
 8keytool -import -trustcacerts -alias votre_alias -file votre_pem.pem -keystore nomdevotrejks.jks
 9
10### Créer/Importer une CA dans un truststore
11keytool -import -alias donnez_un_alias_a_votre_cert -keystore votretruststore.jks -file CA_ROOT.crt
12keytool -import -alias donnez_un_alias_a_votre_cert -keystore votretruststore.jks -file CA_INT.crt
13
14### Afficher les certificats publiques présent dans un JKS :
15keytool -list -rfc -keystore votrejks.jks -storepass mdp_du_jks

J’espère que cet article vous aura plu, si vous avez des questions ou des remarques sur ce que j’ai pu écrire n’hésitez pas à réagir avec moi par mail ou en commentaire !

Merci pour votre lecture et à bientôt !

Mickael Rigonnaux @tzkuat