Як створити власну ланцюжок сертифікатів?


62

Я хотів би встановити власний OCSP Responder (лише для тестування). Для цього потрібно мати кореневий сертифікат і кілька сертифікатів, згенерованих з нього.

Мені вдалося створити самопідписаний сертифікат за допомогою openssl. Я хочу використовувати його як кореневий сертифікат. Наступним кроком буде створення похідних сертифікатів. Я, здається, не можу знайти документацію, як це зробити. Хтось знає, де я можу знайти цю інформацію?

Редагувати
Ретроспективно, на моє запитання ще не повністю відповіли. Для уточнення проблеми я представляю такий свій ланцюжок сертифікатів:

КОРИНИ -> А -> В -> С -> ...

Наразі я можу створити сертифікати ROOT та A, але я не дізнався, як зробити довший ланцюжок.

Моя команда для створення кореневого сертифіката:

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

Сертифікат A створюється так:

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

Ця команда неявно залежить від кореневого сертифіката, для якого він знаходить необхідну інформацію у файлі конфігурації openssl.

Однак сертифікат B повинен покладатися лише на A, який не зареєстрований у конфігураційному файлі, тому попередня команда тут не працюватиме.

Який командний рядок потрібно використовувати для створення сертифікатів B і вище?

Редагувати
Я знайшов відповідь у цій статті . Сертифікат B (ланцюг 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

Я також змінив файл openssl.cnf:

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

Цей підхід, здається, працює добре.


Посилання на дно в розділі редагування зламана
enthusiasticgeek

2
До 2015 року стаття, згадана в останній редакції цієї публікації, мертва. Тож ви можете перевірити сторінку через веб-архів : web.archive.org/web/20100504162138/http://www.ibm.com/…
Іоманіп

Відповіді:


28

Ви можете використовувати OpenSSL безпосередньо.

  1. Створіть приватний ключ органу сертифікації (це ваш найважливіший ключ):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. Створіть сертифікат самопідписання CA:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. Видайте клієнтський сертифікат, спершу згенерувавши ключ, потім запитайте (або використовуйте той, що надається зовнішньою системою), а потім підпишіть сертифікат, використовуючи приватний ключ вашого ЦА:

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

(Можливо, вам потрібно буде додати деякі параметри, оскільки я використовую ці команди разом із файлом openssl.conf. Можливо, спочатку вам потрібно буде встановити свій власний файл .conf.)


Дякую, ви розпорядилися після деяких налаштувань мого файлу openssl.conf.
StackedCrooked

3
@twk: зауважте, що питання має ще один крок, необхідний для повної відповіді - як створити ще один сертифікат, який залежить лише від сертифіката, створеного на кроці 3, але не кореневого сертифіката.
квакш-кіхот

3
Збій на останньому кроці з "не вдається завантажити приватний ключ CA"; Я можу дістатись до неї, поставивши ключ та сертифікат openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, але він хоче demoCAдовідника та різних пристосувань.
Ірідаїн

23
"Можливо, вам доведеться додати деякі параметри ..." дійсно видаляє утиліту з цієї відповіді.
Зак

14

Після створення вашої ЦО ви можете використовувати його для підписання таким чином:

  • Створіть ключ:

    openssl genrsa -out key_A.key  1024
    
  • Створіть csr:

    openssl req -new -key key_A.key -out csr_A.csr
    You are about to be asked to enter information etc....
    
  • Підпишіться:

    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
    

    і так далі про заміну * _A на * _B і CA_certificate_you_created.crtна crt_A.crtі CA_key_you_created.keyзkey_A.key

Ваші зміни:

basicConstraints=CA:TRUE  # prev value was FALSE

означає, що видані вами сертифікати можуть використовуватися для підписання інших сертифікатів.


thx, дуже корисно
флотто

1
Що .crt файл?
MickyD

9

OpenSSL поставляється зі скриптом Perl "CA.pl", який допоможе вам створити самопідписаний кореневий сертифікат CA разом із відповідним приватним ключем, а також декілька простих файлів і каталогів, щоб допомогти відслідковувати будь-які майбутні серти, які ви підписуєте (також проблема ) з цим коренем CA. Це також допомагає вам генерувати інші пари ключів та запити на підписання сертифікатів (CSR) та допомагає обробляти ці CSR (тобто видавати сертифікати для них) тощо.

Зауважте, що багато продуктів вимагають, щоб сертифікатори CA містили певний атрибут, який позначає їх як сертифікати CA, інакше вони не будуть прийняті як дійсні підписувачі / емітенти інших сертифікатів. Якщо створений вами самопідписаний сертифікат не містить цього атрибута, у вас можуть виникнути проблеми з отриманням іншого програмного забезпечення для його розгляду, як дійсного кореневого сертифіката CA.

Якщо я пригадую правильно, синтаксис виглядає приблизно так:

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
Це було корисно. У Ubuntu 14.04 я знайшов файл за адресою/usr/lib/ssl/misc/CA.pl
Colin M

-1

Я знайшов цю публікацію: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

Він призначений для Node.JS, але скрипт у цьому репортажі GitHub використовує команди openSLL для створення кореневого сертифіката CA та cert домену.

Запустити за допомогою: bash make-root-ca-and-certificates.sh 'example.com'

Або для localhost, використовуючи: bash make-root-ca-and-certificates.sh 'localhost'

make-root-ca-and-certificate.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.