Come creare la mia catena di certificati?


62

Vorrei configurare il mio OCSP Responder (solo a scopo di test). Ciò richiede che io abbia un certificato radice e alcuni certificati generati da esso.

Sono riuscito a creare un certificato autofirmato usando openssl. Voglio usarlo come certificato di root. Il prossimo passo sarebbe quello di creare i certificati derivati. Non riesco a trovare la documentazione su come farlo, tuttavia. Qualcuno sa dove posso trovare queste informazioni?

Modifica
A posteriori, la mia domanda non ha ancora ricevuto una risposta completa. Per chiarire il problema, rappresenterò la mia catena di certificati in questo modo:

RADICE -> A -> B -> C -> ...

Sono attualmente in grado di creare i certificati ROOT e A, ma non ho scoperto come creare una catena più lunga.

Il mio comando per la creazione del certificato radice è:

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

Il certificato A viene creato in questo modo:

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

Questo comando dipende implicitamente dal certificato radice, per il quale trova le informazioni richieste nel file di configurazione di openssl.

Il certificato B tuttavia deve fare affidamento solo su A, che non è registrato nel file di configurazione, quindi il comando precedente non funzionerà qui.

Quale riga di comando dovrei usare per creare certificati B e oltre?

Modifica
Ho trovato la risposta in questo articolo . Il certificato B (catena A -> B) può essere creato con questi due comandi:

# 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

Ho anche cambiato il file openssl.cnf:

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

Questo approccio sembra funzionare bene.


Il link in basso nella sezione di modifica è interrotto
enthusiasticgeek,

2
Fino al 2015 l'articolo menzionato sull'ultima modifica di questo post è morto. Quindi puoi controllare la pagina attraverso un archivio web : web.archive.org/web/20100504162138/http://www.ibm.com/…
Iomanip,

Fare riferimento 8gwifi.org/cafunctions.jsp
anish

Risposte:


28

Puoi usare OpenSSL direttamente.

  1. Crea una chiave privata dell'autorità di certificazione (questa è la chiave più importante):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. Crea il tuo certificato autofirmato CA:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. Emettere un certificato client generando prima la chiave, quindi richiedere (o utilizzare uno fornito da un sistema esterno) quindi firmare il certificato utilizzando la chiave privata della propria CA:

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

(Potrebbe essere necessario aggiungere alcune opzioni mentre sto usando questi comandi insieme al mio file openssl.conf. Potrebbe essere necessario prima impostare il proprio file .conf.)


Grazie, le istruzioni hanno funzionato dopo aver modificato il mio file openssl.conf.
StackedCrooked

3
@twk: nota che la domanda ha ancora un passaggio necessario per una risposta completa: come creare un altro certificato che dipende solo dal certificato creato nel passaggio 3, ma non dal certificato radice.
Quack Quixote

3
Non riesce all'ultimo passaggio con "impossibile caricare la chiave privata della CA"; Posso arrivare parzialmente fornendo la chiave e il certificato openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, ma vuole una demoCAdirectory e vari accessori.
Iiridayn,

23
"Potrebbe essere necessario aggiungere alcune opzioni ..." rimuove davvero l'utilità da questa risposta.
Zach,

14

Una volta creata la CA, è possibile utilizzarla per firmare in questo modo:

  • Crea una chiave:

    openssl genrsa -out key_A.key  1024
    
  • Crea un csr:

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

    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
    

    e così via sostituendo * _A con * _B e CA_certificate_you_created.crtcon crt_A.crte CA_key_you_created.keyconkey_A.key

Il tuo cambiamento:

basicConstraints=CA:TRUE  # prev value was FALSE

significa che i certificati emessi possono essere utilizzati per firmare altri certificati.


grazie, molto utile
flotto

1
Quale file .crt?
MickyD

9

OpenSSL viene fornito con uno script Perl "CA.pl" per aiutarti a creare un certificato CA radice autofirmato, insieme alla chiave privata corrispondente, oltre ad alcuni semplici file e directory per aiutarti a tenere traccia di eventuali certificati futuri firmati (aka problema ) con quella CA principale. Ti aiuta anche a generare altre coppie di chiavi e richieste di firma del certificato (CSR) e ti aiuta a elaborare quei CSR (ovvero, rilasciare certificati per loro) e altro ancora.

Si noti che molti prodotti richiedono che i certificati CA contengano un determinato attributo che li contrassegni come certificati CA o che non saranno accettati come firmatari / emittenti validi di altri certificati. Se il certificato autofirmato che hai creato non contiene tale attributo, potresti avere difficoltà a far sì che altri software lo trattino come un certificato CA radice valido.

Se ricordo bene, la sintassi va in questo modo:

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    

4
Questo è stato utile. Su Ubuntu 14.04 ho trovato il file su/usr/lib/ssl/misc/CA.pl
Colin M

-1

Ho trovato questo post: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

È per Node.JS ma lo script in questo repository GitHub utilizza i comandi openSLL per creare un certificato CA radice e un certificato Dominio.

Esegui utilizzando: bash make-root-ca-and-certificates.sh 'example.com'

O per localhost usando: 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.