Как создать собственную цепочку сертификатов?


62

Я хотел бы настроить свой собственный ответчик OCSP (только для целей тестирования). Это требует, чтобы у меня был корневой сертификат и несколько сертификатов, сгенерированных из него.

Мне удалось создать самозаверяющий сертификат с помощью openssl. Я хочу использовать его в качестве корневого сертификата. Следующим шагом будет создание производных сертификатов. Я не могу найти документацию о том, как это сделать, однако. Кто-нибудь знает, где я могу найти эту информацию?

Редактировать
В ретроспективе, мой вопрос еще не полностью ответил. Чтобы прояснить проблему, я представлю свою цепочку сертификатов следующим образом:

КОРЕНЬ -> A -> B -> C -> ...

В настоящее время я могу создавать сертификаты 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

Сертификат А создается так:

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

Этот подход, кажется, работает хорошо.


Ссылка внизу в разделе редактирования не работает
— энтузиастик

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, но не от корневого сертификата.
— Quackote Quackote

3
Сбой на последнем шаге с «невозможно загрузить закрытый ключ CA»; Я могу попасть туда частично, предоставив ключ и сертификат openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, но он хочет demoCAкаталог и различные атрибуты.
— Иридайн

23
«Возможно, вам придется добавить некоторые параметры ...» действительно удаляет утилиту из этого ответа.
— Зак

14

Как только вы создали свой CA, вы можете использовать его для подписи таким образом:

  • Создать ключ:

    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.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
— Колин М,

-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 и сертификата домена.

Запустите с помощью: bash make-root-ca-and-certificates.sh 'example.com'

Или для локального использования: 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.