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 à HTTPS (HTTP via TLS). Ce guide de style aide-mémoire fournit une référence rapide aux commandes OpenSSL utiles dans des scénarios courants et courants. Cela inclut des exemples OpenSSL de génération de clés privées, de demandes de signature de certificat et de 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 présenté sous forme d’extraits de ligne de commande autonomes, au format aide-mémoire.

  • Passez à n’importe quelle section pertinente à la tâche que vous essayez de terminer (astuce: utilisez le menu Contents en bas à gauche ou la fonction Find de votre navigateur)

  • La plupart des commandes sont des lignes uniques qui ont été étendues à 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, 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. Cette information est appelée nom distinctif (DN). Un champ important dans le nom distinctif est le * Nom commun * (CN), qui doit correspondre exactement au nom de domaine pleinement qualifié (FQDN) de l’hôte avec lequel vous prévoyez d’utiliser le certificat. Il est également possible d’ignorer les invites interactives lors de la création d’une CSR en transmettant les informations via une ligne de commande ou à partir d’un fichier.

Les autres éléments d’un DN fournissent des informations supplémentaires sur votre entreprise ou votre organisation. Si vous achetez un certificat SSL auprès d’une autorité de certification, il est souvent nécessaire 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 l’invite d’information sur la RSE ressemblera:

---
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
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 + à toute commande OpenSSL qui demande des informations CSR. Voici un exemple de l’option, utilisant les mêmes informations que celles affichées dans le bloc de code ci-dessus:

-subj "/C=/ST=/L=/O=/CN="

Maintenant que vous comprenez les CSR, n’hésitez pas à passer à 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.

N’oubliez pas que vous pouvez ajouter les informations de 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 si vous souhaitez utiliser une autorité de certification pour émettre le certificat SSL. La CSR générée peut être envoyée à une autorité de certification pour demander l’émission d’un certificat SSL signé par une autorité de certification. Si votre autorité de certification prend en charge SHA-2, ajoutez l’option + -sha256 + pour signer la CSR avec SHA-2.

Cette commande crée une clé privée de 2048 bits (+ domain.key +) et une CSR (+ domain.csr +):

openssl req \
      -newkey rsa:2048 -nodes -keyout  \
      -out

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 cryptée avec une phrase secrète. L’option + -new +, qui n’est pas incluse ici mais implicite, indique qu’une RSC 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 avez déjà une clé privée que vous souhaitez utiliser pour demander un certificat à une autorité de certification.

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

openssl req \
      -key  \
      -new -out

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 une nouvelle CSR. L’option + -new + indique qu’une RSC est en cours de génération.

Générer une CSR à partir d’un certificat existant et d’une clé privée

Utilisez cette méthode si vous souhaitez renouveler un certificat existant mais que vous ou votre autorité de certification ne disposez pas de la CSR d’origine pour une raison quelconque. En gros, cela vous évite d’avoir à saisir à nouveau les informations CSR, car ces informations sont extraites du certificat existant.

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

openssl x509 \
      -in  \
      -signkey  \
      -x509toreq -out

L’option + -x509toreq + indique que vous utilisez un certificat X509 pour créer une CSR.

Générer des 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 valide (et gratuite) consiste à signer vos propres certificats.

Un type de certificat commun 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 aussi bien que les certificats signés par une autorité de certification, mais vos utilisateurs recevront 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 non producteurs 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, sans que votre certificat soit signé par une autorité de certification.

Cette commande crée une clé privée de 2048 bits (+ domain.key +) et un certificat auto-signé (+ domain.crt +):

openssl req \
      -newkey rsa:2048 -nodes -keyout  \
      -x509 -days 365 -out

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

L’option + -x509 + demande à + ​​req + de créer un certificat auto-signé. L’option + -days 365 + indique que le certificat sera valide pendant 365 jours. Une CSR temporaire est générée pour rassembler 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 avez déjà 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 +):

openssl req \
      -key  \
      -new \
      -x509 -days 365 -out

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

L’option + -x509 + demande à + ​​req + de créer un certificat auto-signé. L’option + -days 365 + indique 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 existante et d’un CSR

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

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

openssl x509 \
      -signkey  \
      -in  \
      -req -days 365 -out

L’option + -days 365 + indique que le certificat sera valide pendant 365 jours.

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

Voir les entrées CSR

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

openssl req -text -noout -verify -in

Afficher les entrées de certificat

Cette commande vous permet d’afficher le contenu d’un certificat (+ domain.crt +) en texte brut:

openssl x509 -text -noout -in

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 de CA spécifique (+ ca.crt +):

openssl verify -verbose -CAFile

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 2048 bits protégée par mot de passe (+ domain.key +):

openssl genrsa -des3 -out  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:

openssl rsa -check -in

Si votre clé privée est cryptée, vous serez invité à entrer sa phrase secrète. En cas de succès, la clé non chiffrée sera sortie sur le terminal.

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

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

openssl rsa -noout -modulus -in  | openssl md5
openssl x509 -noout -modulus -in  | openssl md5
openssl req -noout -modulus -in  | openssl md5

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

Crypter 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 +):

openssl rsa -des3 \
      -in  \
      -out

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

Déchiffrer 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 +):

openssl rsa \
      -in  \
      -out

Entrez la phrase de passe de la clé cryptée lorsque vous y êtes invité.

Convertir les formats de certificat

Tous les certificats avec lesquels nous travaillons sont des certificats X.509 codés au format ASCII PEM. Il existe une variété d’autres types de codage et de conteneur de certificat; certaines applications préfèrent certains formats par rapport à 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 d’autorité de certification, 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 quelques unes des conversions possibles.

Conversion 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:

openssl x509 \
      -in  \
      -outform der -out

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

Conversion DER en PEM

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

openssl x509 \
      -inform der -in  \
      -out

Conversion de PEM en PKCS7

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

openssl crl2pkcs7 -nocrl \
      -certfile  \
      -certfile  \
      -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 dans Microsoft IIS (Windows). Ce sont des fichiers ASCII pouvant contenir des certificats et des certificats d’autorité de certification.

Conversion de PKCS7 en PEM

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

openssl pkcs7 \
      -in  \
      -print_certs -out

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.

Conversion de PEM en PKCS12

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

openssl pkcs12 \
      -inkey  \
      -in  \
      -export -out

Vous serez invité à entrer les mots de passe d’exportation, que vous pouvez laisser vierges. Notez que vous pouvez ajouter une chaîne de certificats au fichier PKCS12 en concaténant les certificats 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 Micrsoft IIS (Windows).

Conversion de 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  \
      -nodes -out

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 pour lesquelles elle a été compilée affectent les fonctionnalités (et parfois les options de ligne de commande) disponibles.

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

openssl version -a

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

OpenSSL 1.0.1f 6 Jan 2014
built on: Mon Apr  7 21:22:23 UTC 2014
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"

Conclusion

Cela devrait expliquer comment la plupart des gens utilisent OpenSSL pour traiter les certificats SSL! Il a beaucoup d’autres utilisations qui n’étaient pas couvertes 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 de ces commandes, veillez à bien commenter (et à inclure la sortie de votre version OpenSSL).