2010-03-31 15:38:27 +0000 2010-03-31 15:38:27 +0000
63
63

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

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

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

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

ROOT -> 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

Сертификат 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

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

Ответы (4)

28
28
28
2010-03-31 18:03:18 +0000

Вы можете использовать OpenSSL напрямую.

  1. Создать приватный ключ Certificate Authority (это ваш самый важный ключ):

  2. Создайте самоподписной сертификат ЦС:

  3. Выпустите клиентский сертификат, сначала сгенерировав ключ, затем запросите (или используйте его, предоставленный внешней системой), а затем подпишите сертификат, используя закрытый ключ вашего ЦС:

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

14
14
14
2012-04-29 17:54:40 +0000

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

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

  • Создайте csr :

  • Подпишите его :

Ваше изменение :

basicConstraints=CA:TRUE # prev value was FALSE

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

9
9
9
2010-03-31 17:51:10 +0000

OpenSSL поставляется с Perl скриптом “CA.pl”, который поможет вам создать самоподписанный корневой CA cert, вместе с подходящим приватным ключом, а также несколько простых файлов и каталогов, которые помогут отслеживать любые будущие сертификаты, которые вы подпишете (так называемая проблема) с этим корневым 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
-1
-1
-1
2018-11-06 22:59:55 +0000

Я нашел этот пост: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

Это для Node.JS, но скрипт в этом GitHub repo использует команды openSLL для создания корневого CA cert и Domain cert.

Выполняется с использованием: 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

Похожие вопросы

8
21
8
9
5