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

62

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
Rétrospectivement, 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.

StackedCrooked
la source
Le lien en bas dans la section d'édition est cassé
enthusiasticgeek
2
Jusqu'en 2015, l'article mentionné dans la dernière édition de cet article est mort. Vous pouvez donc consulter la page via une archive Web : web.archive.org/web/20100504162138/http://www.ibm.com/…
Iomanip
Reportez-vous à 8gwifi.org/cafunctions.jsp
anish

Réponses:

28

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

twk
la source
Merci, vos instructions ont fonctionné après quelques ajustements de mon fichier openssl.conf.
StackedCrooked
3
@twk: notez que la question comporte une étape supplémentaire pour une réponse complète: comment créer un autre certificat qui ne dépend que du certificat créé à l'étape 3, mais pas du certificat racine.
Quack Quotote
3
Échec à la dernière étape avec "impossible de charger la clé privée de l'autorité de certification"; Je peux y aller à mi-chemin en fournissant la clé et le certificat openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, mais il souhaite un demoCArépertoire et divers accessoires.
Date:
23
"Vous devrez peut-être ajouter quelques options ..." supprime vraiment l'utilitaire de cette réponse.
Zach
14

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.crtpar crt_A.crtet CA_key_you_created.keyaveckey_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.

Mr_and_Mrs_D
la source
thx, très utile
flotto
1
Quel fichier .crt?
MickyD
9

OpenSSL est livré avec un script Perl "CA.pl" pour vous aider à créer un certificat d' autorité de certification racine auto-signé , avec la clé privée correspondante, ainsi que quelques fichiers et répertoires simples vous permettant de garder une trace des futurs certificats que vous signez ) avec cette racine CA. 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 de certification contiennent un certain attribut les identifiant comme certificats de certification, 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    
Spiff
la source
4
C'était utile. Sur Ubuntu 14.04, j'ai trouvé le fichier dans/usr/lib/ssl/misc/CA.pl
Colin M le
-1

J'ai trouvé ce post: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

C'est pour Node.JS mais le script de ce référentiel GitHub utilise les commandes openSLL pour créer un cert d'autorité de certification racine et un cert de domaine.

Courir en utilisant: bash make-root-ca-and-certificates.sh 'example.com'

Ou pour localhost utilisant: 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
Ralph Bisschops
la source