Jak stworzyć własny łańcuch certyfikatów?

62

Chciałbym skonfigurować własny obiekt odpowiadający OCSP (tylko do celów testowych). Wymaga to posiadania certyfikatu głównego i kilku certyfikatów z niego wygenerowanych.

Udało mi się utworzyć samopodpisany certyfikat za pomocą openssl. Chcę go użyć jako certyfikatu głównego. Następnym krokiem byłoby utworzenie pochodnych certyfikatów. Nie mogę jednak znaleźć dokumentacji, jak to zrobić. Czy ktoś wie, gdzie mogę znaleźć te informacje?

Edytuj
Z perspektywy czasu moje pytanie nie jest jeszcze w pełni wyczerpane. Aby wyjaśnić problem, przedstawię mój łańcuch certyfikatów w następujący sposób:

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

Obecnie jestem w stanie utworzyć certyfikaty ROOT i A, ale nie dowiedziałem się, jak zrobić dłuższy łańcuch.

Moje polecenie utworzenia certyfikatu głównego to:

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

Certyfikat A jest tworzony w następujący sposób:

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

To polecenie domyślnie zależy od certyfikatu głównego, dla którego znajduje wymagane informacje w pliku konfiguracyjnym openssl.

Certyfikat B musi jednak polegać tylko na A, który nie jest zarejestrowany w pliku konfiguracyjnym, więc poprzednie polecenie nie będzie tutaj działać.

Jakiego wiersza poleceń należy używać do tworzenia certyfikatów B i późniejszych?

Edytuj
Znalazłem odpowiedź w tym artykule . Za pomocą tych dwóch poleceń można utworzyć certyfikat B (łańcuch A -> B):

# 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

Zmieniłem również plik openssl.cnf:

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

To podejście wydaje się działać dobrze.

StackedCrooked
źródło
Link u dołu w sekcji edycji jest zepsuty
entuzjastyczny
2
Do 2015 r. Artykuł wymieniony w ostatniej edycji tego postu był martwy. Możesz więc sprawdzić stronę za pomocą archiwum internetowego : web.archive.org/web/20100504162138/http://www.ibm.com/…
Iomanip

Odpowiedzi:

28

Możesz użyć OpenSSL bezpośrednio.

  1. Utwórz klucz prywatny ośrodka certyfikacji (jest to Twój najważniejszy klucz):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. Utwórz samopodpisany certyfikat urzędu certyfikacji:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. Wydaj certyfikat klienta, najpierw generując klucz, a następnie poproś (lub użyj jednego dostarczonego przez system zewnętrzny), a następnie podpisz certyfikat przy użyciu klucza prywatnego urzędu certyfikacji:

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

(Może być konieczne dodanie niektórych opcji, ponieważ korzystam z tych poleceń razem z moim plikiem openssl.conf. Najpierw może być konieczne skonfigurowanie własnego pliku .conf.)

twk
źródło
Dzięki, instrukcje działały po poprawieniu mojego pliku openssl.conf.
StackedCrooked
3
@twk: zwróć uwagę, że pytanie wymaga jeszcze jednego kroku, aby uzyskać pełną odpowiedź - jak utworzyć kolejny certyfikat, który zależy tylko od certyfikatu utworzonego w kroku 3, ale nie od certyfikatu głównego.
szarlatan
3
Błąd ostatniego kroku przy „niemożności załadowania klucza prywatnego CA”; Mogę się tam dostać częściowo, podając klucz i certyfikat openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, ale potrzebuje demoCAkatalogu i różnych urządzeń.
Iiridayn
23
„Może być konieczne dodanie niektórych opcji ...” naprawdę usuwa narzędzie z tej odpowiedzi.
Zach
14

Po utworzeniu urzędu certyfikacji można go użyć do podpisania:

  • Utwórz klucz:

    openssl genrsa -out key_A.key  1024
    
  • Utwórz csr:

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

    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
    

    i tak dalej, zastępując * _A z * _B i CA_certificate_you_created.crtz crt_A.crta CA_key_you_created.keyzkey_A.key

Twoja zmiana:

basicConstraints=CA:TRUE  # prev value was FALSE

oznacza, że ​​wystawione certyfikaty mogą służyć do podpisywania innych certyfikatów.

Mr_i_Mrs_D
źródło
dzięki, bardzo pomocny
flotto
1
Jaki plik .crt?
MickyD,
9

OpenSSL jest wyposażony w skrypt Perla „CA.pl”, który pomaga utworzyć samopodpisany główny certyfikat CA , wraz z pasującym kluczem prywatnym, a także kilka prostych plików i katalogów, które pomagają śledzić wszelkie przyszłe certyfikaty, które podpisujesz (inaczej problem ) z tym głównym urzędem certyfikacji. Pomaga także generować inne pary kluczy i żądania podpisania certyfikatów (CSR) oraz pomaga przetwarzać te CSR (to znaczy wystawiać dla nich certyfikaty) i więcej.

Należy pamiętać, że wiele produktów wymaga, aby certyfikaty CA zawierały określony atrybut oznaczający je jako certyfikaty CA, w przeciwnym razie nie będą akceptowane jako ważni sygnatariusze / wystawcy innych certyfikatów. Jeśli samopodpisany certyfikat, który utworzyłeś, nie zawiera tego atrybutu, możesz mieć problem z przekonaniem innego oprogramowania, aby traktowało je jak prawidłowy certyfikat głównego urzędu certyfikacji.

Jeśli dobrze pamiętam, składnia wygląda mniej więcej tak:

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
źródło
4
To było pomocne. Na Ubuntu 14.04 znalazłem plik/usr/lib/ssl/misc/CA.pl
Colin M
-1

Znalazłem ten post: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

To jest dla Node.JS, ale skrypt w tym repozytorium GitHub używa poleceń openSLL do utworzenia certyfikatu głównego urzędu certyfikacji i certyfikatu domeny.

Uruchom używając: bash make-root-ca-and-certificates.sh 'example.com'

Lub dla localhost przy użyciu: 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
źródło