web-dev-qa-db-fra.com

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

Je souhaite configurer mon propre répondeur OCSP (uniquement à des fins de test). Cela nécessite que je possède un certificat racine et quelques certificats générés à partir de celui-ci.

J'ai réussi à créer un certificat auto-signé en utilisant openssl. Je veux l'utiliser comme certificat racine. La prochaine étape serait de créer les certificats dérivés. Je n'arrive pas à trouver la documentation sur la façon de faire cela cependant. Est-ce que quelqu'un sait où je peux trouver cette information?

Modifier
En rétrospective, ma question n’a pas encore été complètement répondue. Pour clarifier le problème, je vais représenter ma chaîne de certificats comme suit:

ROOT -> A -> B -> C -> ...

Je suis actuellement en mesure de créer les certificats ROOT et A, mais je n’ai pas trouvé comment créer une chaîne plus longue.

Ma commande pour créer le certificat racine est:

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

Le certificat A est créé comme ceci:

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

Cependant, le certificat B ne doit s’appuyer que sur A, qui n’est pas enregistré dans le fichier de configuration. La commande précédente ne fonctionnera donc pas ici.

Quelle ligne de commande dois-je utiliser pour créer des certificats B et au-delà?

Modifier
J'ai trouvé la réponse dans cet article . Le certificat B (chaîne A -> B) peut être créé avec ces deux commandes:

# 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 aussi changé le fichier openssl.cnf:

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

Cette approche semble bien fonctionner.

57
StackedCrooked

Vous pouvez utiliser OpenSSL directement.

  1. Créez une clé privée d'autorité de certification (il s'agit de la 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 demandez (ou utilisez-en un fourni par un système externe), puis signez le certificat en utilisant la clé privée de votre autorité de certification:

    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 des options car j'utilise ces commandes avec mon fichier openssl.conf. Vous devrez peut-être d'abord configurer votre propre fichier .conf.)

26
twk

Une fois que vous avez créé votre autorité de certification, vous pouvez l’utiliser pour signer ainsi:

  • Créer une clé:

    openssl genrsa -out key_A.key  1024
    
  • Créer un csr:

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

    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 par * _B et CA_certificate_you_created.crt par crt_A.crt et CA_key_you_created.key par key_A.key

Votre changement:

basicConstraints=CA:TRUE  # prev value was FALSE

signifie que les certificats que vous émettez peuvent être utilisés pour signer d'autres certificats.

12
Mr_and_Mrs_D

OpenSSL est livré avec un script Perl "CA.pl" pour vous aider à créer une racine auto-signéeCAcert, ainsi que la clé privée correspondante, ainsi que quelques fichiers et répertoires simples vous permettant de garder une trace de l'avenir. certs vous signez (aka problème) avec cette autorité de certification racine. Il vous aide également à générer d'autres paires de clés et demandes de signature de certificat (CSR) et vous permet de traiter ces CSR (c'est-à-dire, émettre des certificats pour eux), etc.

Notez que de nombreux produits exigent que les certificats CA contiennent un certain attribut les qualifiant de certificats CA. Sinon, ils ne seront pas acceptés en tant que signataires/émetteurs valides d'autres certificats. Si le certificat auto-signé que vous avez créé ne contient pas cet attribut, vous aurez peut-être du mal à le traiter comme un certificat racine valide.

Si je me souviens bien, la syntaxe ressemble à ceci:

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    
8
Spiff

Vous pouvez le faire en une seule commande:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

Vous pouvez également ajouter -nodes (abréviation de no DES) si vous ne souhaitez pas protéger votre clé privée avec une phrase secrète. Sinon, vous serez invité à entrer un mot de passe "au moins 4 caractères".

Le paramètre days (365) que vous pouvez remplacer par n’importe quel nombre afin d’affecter la date d’expiration. Il vous invitera ensuite pour des choses comme "Nom du pays", mais vous pouvez simplement appuyer sur Enter et accepter les valeurs par défaut.

Ajoutez -subj '/CN=localhost' pour supprimer les questions sur le contenu du certificat (remplacez localhost par le domaine de votre choix).

Les certificats auto-signés ne sont validés par aucun tiers, à moins que vous ne les ayez importés auparavant dans les navigateurs. Si vous souhaitez que votre certificat soit accepté par les navigateurs sans votre chaîne de certificats installée, vous devez utiliser un certificat signé par un autorité de certification (CA).

0
vharron