Recherche sur le site Web

OpenSSL Essentials : Travailler avec des certificats SSL, des clés privées et des CSR


Introduction

OpenSSL est un outil de ligne de commande polyvalent qui peut être utilisé pour une grande variété de tâches liées à l'infrastructure à clé publique (PKI) et au HTTPS (HTTP sur TLS). Ce guide de style d'aide-mémoire fournit une référence rapide aux commandes OpenSSL qui sont utiles dans les scénarios courants et quotidiens. Cela inclut des exemples OpenSSL pour générer des clés privées, des demandes de signature de certificat et la conversion de format de certificat. Il ne couvre pas toutes les utilisations d'OpenSSL.

Comment utiliser ce guide :

  • Si vous n'êtes pas familier avec les demandes de signature de certificat (CSR), lisez la première section
  • Mis à part la première section, ce guide est sous forme d'aide-mémoire : une liste d'extraits de ligne de commande autonomes.
  • Accédez à n'importe quelle section pertinente à la tâche que vous essayez d'accomplir (Indice : utilisez le menu Contenu ou la fonction Rechercher de votre navigateur).
  • La plupart des commandes sont des lignes simples qui ont été étendues sur plusieurs lignes (en utilisant le symbole \) pour plus de clarté.

À propos des demandes de signature de certificat (CSR)

Si vous souhaitez obtenir un certificat SSL auprès d'une autorité de certification (CA) commerciale, vous devez générer une demande de signature de certificat (CSR). Un CSR se compose principalement de la clé publique d'une paire de clés et de quelques informations supplémentaires. Ces deux composants sont insérés dans le certificat lors de sa signature.

Chaque fois que vous générez un CSR, vous serez invité à fournir des informations concernant le certificat. Ces informations sont connues sous le nom de nom distinctif (DN). Un champ important du DN est le Nom commun (CN), qui doit être le nom de domaine complet (FQDN) exact de l'hôte avec lequel vous avez l'intention d'utiliser le certificat. Il est également possible d'ignorer les invites interactives lors de la création d'un CSR en transmettant les informations via la ligne de commande ou à partir d'un fichier.

Les autres éléments d'un DN fournissent des informations supplémentaires sur votre entreprise ou organisation. Si vous achetez un certificat SSL auprès d'une autorité de certification, il est souvent requis que ces champs supplémentaires, tels que « Organisation », reflètent avec précision les détails de votre organisation.

Voici un exemple de ce à quoi ressemblera l’invite d’informations RSE :

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

Si vous souhaitez répondre de manière non interactive à l'invite d'informations CSR, vous pouvez le faire en ajoutant l'option -subj à toutes les commandes OpenSSL qui demandent des informations CSR. Voici un exemple de l'option, utilisant les mêmes informations affichées dans le bloc de code ci-dessus :

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

Maintenant que vous comprenez les CSR, n'hésitez pas à consulter la section de ce guide qui couvre vos besoins OpenSSL.

Générer des CSR

Cette section couvre les commandes OpenSSL liées à la génération de CSR (et de clés privées, si elles n'existent pas déjà). Les CSR peuvent être utilisés pour demander des certificats SSL à une autorité de certification.

Gardez à l'esprit que vous pouvez ajouter les informations CSR de manière non interactive avec l'option -subj mentionnée dans la section précédente.

Générer une clé privée et un CSR

Utilisez cette méthode si vous souhaitez utiliser HTTPS (HTTP sur TLS) pour sécuriser votre serveur Web Apache HTTP ou Nginx et que vous souhaitez utiliser une autorité de certification (CA) pour émettre le certificat SSL. Le CSR généré peut être envoyé à une autorité de certification pour demander l'émission d'un certificat SSL signé par l'autorité de certification. Si votre autorité de certification prend en charge SHA-2, ajoutez l'option -sha256 pour signer le CSR avec SHA-2.

Cette commande crée une clé privée de 2 048 bits (domain.key) et un CSR (domain.csr) à partir de zéro :

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

Répondez à l’invite d’informations CSR pour terminer le processus.

L'option -newkey rsa:2048 spécifie que la clé doit être de 2048 bits, générée à l'aide de l'algorithme RSA. L'option -nodes spécifie que la clé privée ne doit pas être chiffrée avec une phrase secrète. L'option -new, qui n'est pas incluse ici mais implicite, indique qu'un CSR est en cours de génération.

Générer un CSR à partir d'une clé privée existante

Utilisez cette méthode si vous disposez déjà d’une clé privée que vous souhaitez utiliser pour demander un certificat à une autorité de certification.

Cette commande crée un nouveau CSR (domain.csr) basé sur une clé privée existante (domain.key) :

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

Répondez à l’invite d’informations CSR pour terminer le processus.

L'option -key spécifie une clé privée existante (domain.key) qui sera utilisée pour générer un nouveau CSR. L'option -new indique qu'un CSR est en cours de génération.

Générer un CSR à partir d'un certificat et d'une clé privée existants

Utilisez cette méthode si vous souhaitez renouveler un certificat existant mais que vous ou votre autorité de certification ne disposez pas du CSR d'origine pour une raison quelconque. Cela vous évite essentiellement de devoir saisir à nouveau les informations CSR, car il extrait ces informations du certificat existant.

Cette commande crée un nouveau CSR (domain.csr) basé sur un certificat existant (domain.crt) et une clé privée (domain.key). :

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

L'option -x509toreq spécifie que vous utilisez un certificat X509 pour créer une CSR.

Génération de certificats SSL

Si vous souhaitez utiliser un certificat SSL pour sécuriser un service mais que vous n'avez pas besoin d'un certificat signé par une autorité de certification, une solution valable (et gratuite) consiste à signer vos propres certificats.

Un type courant de certificat que vous pouvez émettre vous-même est un certificat auto-signé. Un certificat auto-signé est un certificat signé avec sa propre clé privée. Les certificats auto-signés peuvent être utilisés pour chiffrer des données tout aussi bien que les certificats signés par une autorité de certification, mais vos utilisateurs verront un avertissement indiquant que le certificat n'est pas approuvé par leur ordinateur ou leur navigateur. Par conséquent, les certificats auto-signés ne doivent être utilisés que si vous n’avez pas besoin de prouver l’identité de votre service à ses utilisateurs (par exemple, serveurs hors production ou non publics).

Cette section couvre les commandes OpenSSL liées à la génération de certificats auto-signés.

Générer un certificat auto-signé

Utilisez cette méthode si vous souhaitez utiliser HTTPS (HTTP sur TLS) pour sécuriser votre serveur Web Apache HTTP ou Nginx et que vous n'exigez pas que votre certificat soit signé par une autorité de certification.

Cette commande crée une clé privée de 2 048 bits (domain.key) et un certificat auto-signé (domain.crt) à partir de zéro :

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

Répondez à l’invite d’informations CSR pour terminer le processus.

L'option -x509 indique à req de créer un certificat auto-signé. L'option -days 365 précise que le certificat sera valide pendant 365 jours. Un CSR temporaire est généré pour collecter les informations à associer au certificat.

Générer un certificat auto-signé à partir d'une clé privée existante

Utilisez cette méthode si vous disposez déjà d’une clé privée avec laquelle vous souhaitez générer un certificat auto-signé.

Cette commande crée un certificat auto-signé (domain.crt) à partir d'une clé privée existante (domain.key) :

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

Répondez à l’invite d’informations CSR pour terminer le processus.

L'option -x509 indique à req de créer un certificat auto-signé. L'option -days 365 précise que le certificat sera valide pendant 365 jours. L'option -new active l'invite d'informations CSR.

Générer un certificat auto-signé à partir d'une clé privée et d'un CSR existants

Utilisez cette méthode si vous disposez déjà d’une clé privée et d’un CSR et que vous souhaitez générer un certificat auto-signé avec eux.

Cette commande crée un certificat auto-signé (domain.crt) à partir d'une clé privée existante (domain.key) et (domain.csr) :

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

L'option -days 365 précise que le certificat sera valide pendant 365 jours.

Afficher les certificats

Les fichiers de certificat et CSR sont codés au format PEM, qui n'est pas facilement lisible par l'homme.

Cette section couvre les commandes OpenSSL qui généreront les entrées réelles des fichiers codés PEM.

Afficher les entrées CSR

Cette commande vous permet d'afficher et de vérifier le contenu d'un CSR (domain.csr) en texte brut :

  1. openssl req -text -noout -verify -in domain.csr

Afficher les entrées de certificat

Cette commande permet de visualiser le contenu d'un certificat (domain.crt) en texte brut :

  1. openssl x509 -text -noout -in domain.crt

Vérifier qu'un certificat a été signé par une autorité de certification

Utilisez cette commande pour vérifier qu'un certificat (domain.crt) a été signé par un certificat d'autorité de certification spécifique (ca.crt) :

  1. openssl verify -verbose -CAFile ca.crt domain.crt

Clés privées

Cette section couvre les commandes OpenSSL spécifiques à la création et à la vérification de clés privées.

Créer une clé privée

Utilisez cette commande pour créer une clé privée de 2 048 bits protégée par mot de passe (domain.key) :

  1. openssl genrsa -des3 -out domain.key 2048

Entrez un mot de passe lorsque vous êtes invité à terminer le processus.

Vérifier une clé privée

Utilisez cette commande pour vérifier qu'une clé privée (domain.key) est une clé valide :

  1. openssl rsa -check -in domain.key

Si votre clé privée est cryptée, vous serez invité à saisir sa phrase de passe. En cas de succès, la clé non cryptée sera affichée sur le terminal.

Vérifier qu'une clé privée correspond à un certificat et à une CSR

Utilisez ces commandes pour vérifier si une clé privée (domain.key) correspond à un certificat (domain.crt) et à un CSR (domain.csr). :

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

Si le résultat de chaque commande est identique, il existe une probabilité extrêmement élevée que la clé privée, le certificat et le CSR soient liés.

Chiffrer une clé privée

Cela prend une clé privée non chiffrée (unencrypted.key) et en génère une version chiffrée (encrypted.key) :

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

Entrez la phrase de passe souhaitée pour chiffrer la clé privée.

Décrypter une clé privée

Cela prend une clé privée chiffrée (encrypted.key) et en génère une version déchiffrée (decrypted.key) :

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

Saisissez la phrase secrète de la clé chiffrée lorsque vous y êtes invité.

Convertir les formats de certificat

Tous les certificats avec lesquels nous avons travaillé sont des certificats X.509 codés en ASCII PEM. Il existe une variété d’autres types de codage de certificat et de conteneurs ; certaines applications préfèrent certains formats à d'autres. En outre, bon nombre de ces formats peuvent contenir plusieurs éléments, tels qu'une clé privée, un certificat et un certificat CA, dans un seul fichier.

OpenSSL peut être utilisé pour convertir des certificats vers et depuis une grande variété de ces formats. Cette section couvrira certaines des conversions possibles.

Convertir PEM en DER

Utilisez cette commande si vous souhaitez convertir un certificat codé PEM (domain.crt) en un certificat codé DER (domain.der), au format binaire :

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

Le format DER est généralement utilisé avec Java.

Convertir DER en PEM

Utilisez cette commande si vous souhaitez convertir un certificat codé DER (domain.der) en un certificat codé PEM (domain.crt) :

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

Convertir PEM en PKCS7

Utilisez cette commande si vous souhaitez ajouter des certificats PEM (domain.crt et ca-chain.crt) à un fichier PKCS7 (domain.p7b ) :

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

Notez que vous pouvez utiliser une ou plusieurs options -certfile pour spécifier les certificats à ajouter au fichier PKCS7.

Les fichiers PKCS7, également appelés P7B, sont généralement utilisés dans les magasins de clés Java et Microsoft IIS (Windows). Ce sont des fichiers ASCII pouvant contenir des certificats et des certificats CA.

Convertir PKCS7 en PEM

Utilisez cette commande si vous souhaitez convertir un fichier PKCS7 (domain.p7b) en fichier PEM :

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

Notez que si votre fichier PKCS7 contient plusieurs éléments (par exemple, un certificat et un certificat intermédiaire CA), le fichier PEM créé contiendra tous les éléments qu'il contient.

Convertir PEM en PKCS12

Utilisez cette commande si vous souhaitez prendre une clé privée (domain.key) et un certificat (domain.crt) et les combiner dans un fichier PKCS12 ( domaine.pfx) :

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

Vous serez invité à saisir des mots de passe d'exportation, que vous pourrez laisser vides. Notez que vous pouvez ajouter une chaîne de certificats au fichier PKCS12 en concaténant les certificats ensemble dans un seul fichier PEM (domain.crt) dans ce cas.

Les fichiers PKCS12, également appelés fichiers PFX, sont généralement utilisés pour importer et exporter des chaînes de certificats dans Microsoft IIS (Windows).

Convertir PKCS12 en PEM

Utilisez cette commande si vous souhaitez convertir un fichier PKCS12 (domain.pfx) et le convertir au format PEM (domain.combined.crt) :

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

Notez que si votre fichier PKCS12 contient plusieurs éléments (par exemple un certificat et une clé privée), le fichier PEM créé contiendra tous les éléments qu'il contient.

Version OpenSSL

La commande openssl version peut être utilisée pour vérifier quelle version vous utilisez. La version d'OpenSSL que vous exécutez et les options avec lesquelles elle a été compilée affectent les fonctionnalités (et parfois les options de ligne de commande) qui sont à votre disposition.

La commande suivante affiche la version d'OpenSSL que vous exécutez et toutes les options avec lesquelles elle a été compilée :

openssl version -a

Ce guide a été écrit à l'aide d'un binaire OpenSSL avec les détails suivants (le résultat de la commande précédente) :

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

Conclusion

Cela devrait expliquer comment la plupart des gens utilisent OpenSSL pour travailler avec des certificats SSL. Il a de nombreuses autres utilisations qui n'ont pas été abordées ici, alors n'hésitez pas à demander ou à suggérer d'autres utilisations dans les commentaires.

Si vous rencontrez des problèmes avec l'une des commandes, assurez-vous de commenter (et d'inclure la sortie de votre version OpenSSL).

Articles connexes: