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

1voto

schnatterer Points 131

Voici la solution la plus simple que j'ai trouvée.

cert=crt.pem
certPk=pk.pem
ca=ca.crt.pem
caPk=ca.pk.pem

host=example.com
certValidityDays=30

cd "$(mktemp -d)"

# Create CA
openssl req -newkey rsa:4096 -keyout "${caPk}" -x509 -new -nodes -out "${ca}" \
  -subj "/OU=Unknown/O=Unknown/L=Unknown/ST=unknown/C=AU" -days "${certValidityDays}"

# Create Cert Signing Request
openssl req -new -newkey rsa:4096 -nodes -keyout "${certPk}" -out csr.pem \
       -subj "/CN=${host}/OU=Unknown/O=Unknown/L=Unknown/ST=unknown/C=AU" 

# Sign Cert
openssl x509 -req -in csr.pem -CA "${ca}" -CAkey "${caPk}" -CAcreateserial -out "${cert}" \
       -days "${certValidityDays}"
  • Essentiellement, seulement trois commandes.
  • J'ai introduit quelques variables pour rendre les commandes plus faciles à comprendre.
  • Ce dont vous aurez besoin sur votre serveur web sont : cert , certPk y ca .
  • caPk n'est nécessaire que si vous voulez signer plus de certitudes.
  • fonctionne sans interaction, ce qui permet de l'utiliser dans un processus par lots.
  • Si vous voulez de l'interaction, il suffit d'omettre le -subj pièces.

Quelques conseils supplémentaires

  • Vous pourriez exécuter ces étapes dans un environnement Debian standardisé comme ceci :

    docker run --rm -it debian:buster-20200327-slim bash apt update && apt install openssl #=1.1.1d-0+deb10u2

    Run steps above, then exit - the certs are stored in a subfolder in your current directory

  • Un exemple concret : J'utilise ces étapes pendant initialisation d'une image Docker .

  • Cet article explique ces étapes de manière plus détaillée et donne également quelques conseils pour regrouper le fichier, si votre serveur Web l'exige : Créez votre propre autorité de certification (pour les tests)

1voto

Treviño Points 407

C'est une question assez ancienne, mais j'ai trouvé une documentation bien faite avec des exemples de configuration dans le guide. Autorité de certification OpenSSL guide.

0voto

Ralph Bisschops Points 113

J'ai trouvé este sur Stack Overflow et c'est pour Node.JS, mais le script en este Le repo GitHub utilise openssl pour créer une autorité de certification racine et un certificat de domaine.

Exécuter en utilisant :

  • example.com : bash make-root-ca-and-certificates.sh 'example.com'
  • localhost : bash make-root-ca-and-certificates.sh 'localhost'

make-root-ca-and-certificates.sh

#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p certs/{server,client,ca,tmp}

# Create your very own Root Certificate Authority
openssl genrsa \
  -out certs/ca/my-root-ca.key.pem \
  2048

# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
  -x509 \
  -new \
  -nodes \
  -key certs/ca/my-root-ca.key.pem \
  -days 1024 \
  -out certs/ca/my-root-ca.crt.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"

# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
  -out certs/server/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key certs/server/privkey.pem \
  -out certs/tmp/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
# -CAserial certs/ca/my-root-ca.srl
openssl x509 \
  -req -in certs/tmp/csr.pem \
  -CA certs/ca/my-root-ca.crt.pem \
  -CAkey certs/ca/my-root-ca.key.pem \
  -CAcreateserial \
  -out certs/server/cert.pem \
  -days 500

# Create a public key, for funzies
# see https://gist.github.com/coolaj86/f6f36efce2821dfb046d
openssl rsa \
  -in certs/server/privkey.pem \
  -pubout -out certs/client/pubkey.pem

# Put things in their proper place
rsync -a certs/ca/my-root-ca.crt.pem certs/server/chain.pem
rsync -a certs/ca/my-root-ca.crt.pem certs/client/chain.pem
cat certs/server/cert.pem certs/server/chain.pem > certs/server/fullchain.pem

0voto

KungFuPanda Points 1

La meilleure réponse se trouve ici - https://www.youtube.com/watch?v=KXi3-3dEb8k

Je l'ai modifié pour répondre aux besoins en rendant la contrainte de base de l'autorité de certification du certificat intermédiaire True :

MyOpenssl.conf:

[ req ]
distinguished_name       = distinguished_name
extensions               = int_ca
req_extensions           = int_ca

[ int_ca ]
basicConstraints         = CA:TRUE

[ distinguished_name ]

#create Root CA
openssl genrsa -out RootCA.key 4096
openssl req -new -x509 -days 1826 -key RootCA.key -out RootCA.pem -subj "/C=US/O=xzy/OU=abc/CN=ROOT-CN"

#create Intermediate CA
openssl genrsa -out IntermediateCA.key 4096
openssl req -new -sha256 -key IntermediateCA.key -nodes -out IntermediateCA.csr -subj "/C=US/O=xyz/OU=abc/CN=INTERIM-CN"
openssl x509 -req -days 1000 -extfile MyOpenssl.conf -extensions int_ca -in IntermediateCA.csr -CA RootCA.pem -CAkey RootCA.key -CAcreateserial -out IntermediateCA.pem

#create EndUser certificates
openssl genrsa -out my_server.key 2048
openssl req -new -key my_server.key -out my_server.csr -subj "/C=US/O=xyz/OU=abc/CN=USER-CN"
openssl x509 -req -in my_server.csr -CA IntermediateCA.pem -CAkey IntermediateCA.key -set_serial 01 -out my_server.pem -days 500 -sha1

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