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

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

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

StackedCrooked
источник
Ссылка внизу в разделе редактирования не работает
энтузиастик
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.)

TWK
источник
Спасибо, ваши инструкции сработали после некоторой настройки моего файла 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

означает, что выданные вами сертификаты могут использоваться для подписи других сертификатов.

Mr_and_Mrs_D
источник
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    
Spiff
источник
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
Ральф Бишопс
источник