92 votes

Comment créer ma propre chaîne de certificats ?

Je voudrais mettre en place mon propre OCSP Responder à des fins de test, et cela nécessite que je dispose d'un certificat racine avec quelques certificats générés à partir de celui-ci.

J'ai réussi à créer un certificat auto-signé en utilisant openssl et je veux l'utiliser comme certificat racine. L'étape suivante consisterait à créer les certificats dérivés, mais je ne parviens pas à trouver la documentation sur la manière de procéder. Quelqu'un sait-il où je peux trouver ces informations ?

  • Edit :
    Avec le recul, ma question n'a pas encore trouvé de réponse complète, et pour clarifier le problème, je vais représenter ma chaîne de certificats comme ceci : Racine > A > B > C > ...

Je suis actuellement en mesure de créer les certificats Root et A via le lien ci-dessous, mais je n'ai pas trouvé comment faire une chaîne plus longue :

# Root certificate is created like this:
  openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
  openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem

# Certificate A is created like this:
  openssl genrsa -out client.key 1024
  openssl req -new -key client.key -out client.csr
  openssl ca -in client.csr -out client.cer
  • Cette commande dépend implicitement du certificat racine, pour lequel elle trouve les informations requises dans le fichier de configuration d'OpenSSL. Cependant, le certificat B ne doit compter que sur A, qui n'est pas enregistré dans le fichier de configuration, donc la commande précédente ne fonctionnera pas ici.

Quelle commande dois-je utiliser pour créer les certificats B et suivants ?

  • Edit :
    J'ai trouvé la réponse dans cet article : Le certificat B (chaîne A -> B) peut être créé avec ces deux commandes et cette approche semble bien fonctionner :

    # Create a certificate request
    openssl req -new -keyout B.key -out B.request -days 365
    
    # Create and sign the certificate
    openssl ca -policy policy_anything -keyfile A.key -cert A.pem -out B.pem -infiles B.request

    J'ai également modifié le openssl.cnf fichier :

    [ usr_cert ]
    basicConstraints=CA:TRUE # prev value was FALSE

45voto

Travis Nelson Points 1633

Vous pouvez utiliser OpenSSL directement.

  1. Créez une clé privée d'autorité de certification (c'est votre clé la plus importante) :

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
  2. Créez votre certificat auto-signé CA :

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
  3. Émettez un certificat client en générant d'abord la clé, puis en demandant (ou en utilisant celle fournie par un système externe) puis en signant le certificat à l'aide de la clé privée de votre CA :

    openssl genrsa -out client.key 1024
    openssl req -new -key client.key -out client.csr
    openssl ca -in client.csr -out client.cer

(Vous devrez peut-être ajouter quelques options car j'utilise ces commandes avec mon fichier openssl.conf. Vous devrez peut-être d'abord configurer votre propre fichier .conf).

29voto

Clarus_Nox Points 3995

Une fois que vous avez créé votre AC, vous pouvez l'utiliser pour signer des certificats :

  • Créez une clé :

    openssl genrsa -out key_A.key  1024
  • Créez un CSR :

    openssl req -new -key key_A.key -out csr_A.csr
      # You are about to be asked to enter information etc....
  • Signe-le :

    openssl x509 -req -days 365 -in csr_A.csr -CA CA_certificate_you_created.crt \
    -CAkey CA_key_you_created.key -set_serial 01 -out crt_A.crt

    Et ainsi de suite, en remplaçant A avec B , _CA_certificate_you_created.crt avec crt_A.crt et CA_key_you_created.key avec key_A.key_

La modification de l'option ci-dessous signifie que les certificats que vous émettez peuvent être utilisés pour signer d'autres certificats :

basicConstraints=CA:TRUE  # prev value was FALSE

29voto

paul Points 541

Résumé

Résumé des commandes utilisées pour créer une AC racine, une AC intermédiaire et un certificat feuille :

openssl genrsa -out root.key 2048
openssl req -new -key root.key -out root.csr -config root_req.config
openssl ca -in root.csr -out root.pem -config root.config -selfsign -extfile ca.ext -days 1095

openssl genrsa -out intermediate.key 2048
openssl req -new -key intermediate.key -out intermediate.csr -config intermediate_req.config
openssl ca -in intermediate.csr -out intermediate.pem -config root.config -extfile ca.ext -days 730

openssl genrsa -out leaf.key 2048
openssl req -new -key leaf.key -out leaf.csr -config leaf_req.config
openssl ca -in leaf.csr -out leaf.pem -config intermediate.config -days 365

openssl verify -x509_strict -CAfile root.pem -untrusted intermediate.pem leaf.pem

Ces commandes reposent sur une certaine configuration que je vais décrire ci-dessous. Elles sont un peu excessives si vous ne voulez que quelques certificats dans une chaîne, ce qui peut être fait avec la commande x509. Ces commandes vont également suivre vos certificats dans une base de données texte et auto-incrémenter un numéro de série. Je vous recommande de lire la section des avertissements et des bogues du site Web de l openssl ca avant ou après avoir lu cette réponse.

Structure du répertoire

Nous aurons besoin de la structure de répertoire suivante avant de commencer.

ca.ext              # the extensions required for a CA certificate for signing certs
intermediate.config # configuration for the intermediate CA
root.config         # configuration for the root CA

leaf_req.config         # configuration for the leaf cert's csr
intermediate_req.config # configuration for the intermediate CA's csr
root_req.config         # configuration for the root CA's csr

intermediate_ca/    # state files specific to the intermediate CA
    index           # a text database of issued certificates
    serial          # an auto-incrementing serial number for issued certificates
root_ca/            # state files specific to the root CA
    index           # a text database of issued certificates
    serial          # an auto-incrementing serial number for issued certificates

S'il s'agit d'un CA plus permanent, les changements suivants sont probablement une bonne idée :

  1. Déplacer le fichier de configuration, la clé privée (générée ultérieurement) et le fichier de certificat (généré ultérieurement) de chaque AC dans le répertoire de l'AC. Cela nécessitera des modifications du fichier de configuration.
  2. Création d'un sous-répertoire dans le répertoire de l'AC pour les certificats émis. Cela nécessite de modifier le fichier de configuration
  3. Cryptage de la clé privée
  4. Définition d'un nombre de jours par défaut pour les certificats émis dans les fichiers de configuration de l'AC

Structure du répertoire de départ Contenu des fichiers

Le contenu de chacun des fichiers de la structure du répertoire est le suivant :

ca.ext

[ default ]
basicConstraints = critical,CA:true     # recommended to be marked critical. required for a ca
keyUsage         = critical,keyCertSign # required to be marked critical. required for signing certs

intermédiaire.config

[ ca ]
default_ca      = CA_default

[ CA_default]
dir             = ./intermediate_ca   # helper variable pointing to ca specific files
database        = $dir/index          # database of certs generated by the ca
new_certs_dir   = ./                  # one dir up to make the demo easier
certificate     = ./intermediate.pem  # one dir up to make the demo easier
serial          = $dir/serial         # file with incrementing hex serial number for certs
private_key     = ./intermediate.key

policy          = policy_any
email_in_dn     = no                  # recommended
unique_subject  = no                  # recommended for easier certificate rollover
copy_extensions = none                # don't honor the extensions in the csr
default_md      = sha256

[ policy_any ]
countryName            = optional
stateOrProvinceName    = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied

root.config

[ ca ]
default_ca      = CA_default

[ CA_default]
dir             = ./root_ca      # helper variable pointing to ca specific files
database        = $dir/index     # database of certs generated by the ca
new_certs_dir   = ./             # one dir up to make the demo easier
certificate     = ./root.pem     # one dir up to make the demo easier
serial          = $dir/serial    # file with incrementing hex serial number for certs
private_key     = ./root.key

policy          = policy_any
email_in_dn     = no             # recommended
unique_subject  = no             # recommended for easier certificate rollover
copy_extensions = none           # don't honor the extensions in the csr
default_md      = sha256

[ policy_any ]
countryName            = optional
stateOrProvinceName    = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied

leaf_req.config

[ req ]
distinguished_name = req_distinguished_name
prompt             = no

[ req_distinguished_name ]
countryName = US
commonName  = Test Leaf

configuration_req.intermédiaire

[ req ]
distinguished_name = req_distinguished_name
prompt             = no

[ req_distinguished_name ]
countryName = US
commonName  = Test Intermediate CA

root_req.config

[ req ]
distinguished_name = req_distinguished_name
prompt             = no

[ req_distinguished_name ]
countryName = US
commonName  = Test Root CA

intermédiaire_ca/index (dossier vide). Base de données des certificats émis. Mise à jour automatique

[empty]

intermédiaire_ca/série (un seul 0 ne fonctionne pas). Ce fichier s'incrémente automatiquement

00

root_ca/index (dossier vide). Base de données des certificats émis. Mise à jour automatique

[empty]

root_ca/serial (un seul 0 ne fonctionne pas). Ce fichier s'incrémente automatiquement

00

Commandes détaillées

Maintenant nous pouvons exécuter les commandes du début de cette réponse :

# create the private key for the root CA
openssl genrsa 
    -out root.key # output file
    2048          # bitcount

# create the csr for the root CA
openssl req 
    -new 
    -key root.key           # private key associated with the csr
    -out root.csr           # output file
    -config root_req.config # contains config for generating the csr such as the distinguished name

# create the root CA cert
openssl ca 
    -in root.csr        # csr file
    -out root.pem       # output certificate file
    -config root.config # CA configuration file
    -selfsign           # create a self-signed certificate
    -extfile ca.ext     # extensions that must be present for CAs that sign certificates
    -days 1095          # 3 years

# create the private key for the intermediate CA
openssl genrsa 
    -out intermediate.key # output file
    2048                  # bitcount

# create the csr for the intermediate CA
openssl req 
    -new 
    -key intermediate.key           # private key associated with the csr
    -out intermediate.csr           # output file
    -config intermediate_req.config # contains config for generating the csr such as the distinguished name

# create the intermediate CA cert
openssl ca 
    -in intermediate.csr  # csr file
    -out intermediate.pem # output certificate file
    -config root.config   # CA configuration file (note: root is still issuing)
    -extfile ca.ext       # extensions that must be present for CAs that sign certificates
    -days 730             # 2 years

# create the private key for the leaf certificate
openssl genrsa 
    -out leaf.key # output file
    2048          # bitcount

# create the csr for the leaf certificate
openssl req 
    -new 
    -key leaf.key           # private key associated with the csr
    -out leaf.csr           # output file
    -config leaf_req.config # contains config for generating the csr such as the distinguished name

# create the leaf certificate (note: no ca.ext. this certificate is not a CA)
openssl ca 
    -in leaf.csr                # csr file
    -out leaf.pem               # output certificate file
    -config intermediate.config # CA configuration file (note: intermediate is issuing)
    -days 365                   # 1 year

# verify the certificate chain
openssl verify 
    -x509_strict                # strict adherence to rules
    -CAfile root.pem            # root certificate
    -untrusted intermediate.pem # file with all intermediates
    leaf.pem                    # leaf certificate to verify

Dernières réflexions

Si vous envisagez d'utiliser une AC en production, veuillez lire les sections "avertissements" et "bogues" de la page d'accueil de l'AC. openssl ca (ou simplement toute la page de manuel).

10voto

Spiff Points 95683

OpenSSL est livré avec un script Perl. CA.pl pour vous aider à créer une racine auto-signée CA ainsi que la clé privée correspondante, et quelques fichiers et répertoires simples permettant de conserver la trace de tous les certificats futurs que vous signerez (ou émettrez) avec cette autorité de certification racine. Il vous aide également à générer d'autres paires de clés et des demandes de signature de certificat (CSR) et vous aide à traiter ces CSR (c'est-à-dire à émettre des certificats pour eux), et plus encore.

Notez que de nombreux produits exigent que les certificats de CA contiennent un certain attribut les marquant comme des certificats de CA, ou ils ne seront pas acceptés comme signataires/émetteurs valides d'autres certificats. Si le certificat auto-signé que vous avez créé ne contient pas cet attribut, vous risquez d'avoir des difficultés à ce que d'autres logiciels le traitent comme un certificat CA racine valide.

Si je me souviens bien, la syntaxe est la suivante :

CA.pl -newca    # Create a new root CA  

CA.pl -newreq   # Create a new CSR

CA.pl -sign     # Sign a CSR, creating a cert  

CA.pl -pkcs12   # Turn an issued cert, plus its matching private key and trust chain, 
                # into a .p12 file you can install on another machine

6voto

Ivan Samygin Points 141

En me basant sur diverses réponses à cette question (et à des questions et articles connexes), j'ai trouvé un ensemble de commandes qui m'ont permis de créer un ca racine, un ca intermédiaire et un certificat de test à des fins de test en utilisant la configuration openssl par défaut. Je veux donc le poster pour moi et pour les autres personnes intéressées par une solution rapide et adaptée à des fins de test :

Prérequis : OpenSSL 1.1.1

  1. Générer des CA

    openssl req -new -newkey rsa:2048 -nodes -out ca.csr -keyout ca.key -extensions v3_ca openssl x509 -signkey ca.key -days 365 -req -in ca.csr -set_serial 01 -out ca.crt

  2. Générer une AC intermédiaire

    openssl req -new -newkey rsa:2048 -nodes -out inter.csr -keyout inter.key -addext basicConstraints=CA:TRUE openssl x509 -CA ca.crt -CAkey ca.key -days 365 -req -in inter.csr -set_serial 02 -out inter.crt

  3. Générer une requête pour le certificat cible.

    openssl req -new -newkey rsa:2048 -nodes -out test.csr -keyout test.key

  4. Signer la demande de certificat cible en utilisant l'AC intermédiaire

    openssl x509 -CA inter.crt -CAkey inter.key -days 365 -req -in test.csr -set_serial 03 -out test.crt

  5. Exportation du certificat de test avec la clé privée et les certificats de la chaîne vers PFX

    openssl pkcs12 -export -out test.pfx -inkey test.key -in test.crt -certfile inter.crt -certfile ca.crt

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X