TLDR
Создать файл generate.sh
#!/usr/bin/env bash
find . \( -name "$1.*" -o -name "*.srl" \) -type f -delete
cp /usr/lib/ssl/openssl.cnf $1.cnf
python <(
cat << "END"
import sys
from ConfigParser import ConfigParser
from StringIO import StringIO
domain = sys.argv[1]
config = ConfigParser()
config.optionxform = lambda option: option
name = "{}.cnf".format(domain)
with open(name, "rb") as stream:
config.readfp(StringIO("[top]\n" + stream.read()))
config.set(" v3_ca ", "subjectKeyIdentifier", "hash")
config.set(" v3_ca ", "authorityKeyIdentifier", "keyid:always,issuer")
config.set(" v3_ca ", "basicConstraints", "critical, CA:TRUE, pathlen:3")
config.set(" v3_ca ", "keyUsage", "critical, cRLSign, keyCertSign")
config.set(" v3_ca ", "nsCertType", "sslCA, emailCA")
config.set(" v3_req ", "basicConstraints", "CA:FALSE")
config.set(" v3_req ", "keyUsage", "nonRepudiation, digitalSignature, keyEncipherment")
config.set(" v3_req ", "subjectAltName", "@alt_names")
config.remove_option(" v3_req ", "extendedKeyUsage")
config.add_section(" alt_names ")
config.set(" alt_names ", "DNS.1", domain)
config.set(" alt_names ", "DNS.2", "*.{}".format(domain))
config.set(" req ", "req_extensions", "v3_req")
with open(name, "wb") as stream:
config.write(stream)
END
) $1
tail -n +2 $1.cnf > $1.cnf.tmp && mv $1.cnf.tmp $1.cnf
echo "$1\n" | openssl genrsa -aes256 -out $1.ca.key 2048
chmod 400 $1.ca.key
openssl req -new -x509 -subj "/CN=$1" -extensions v3_ca -days 3650 -key $1.ca.key -sha256 -out $1.ca.crt -config $1.cnf
openssl genrsa -out $1.key 2048
openssl req -subj "/CN=$1" -extensions v3_req -sha256 -new -key $1.key -out $1.csr
openssl x509 -req -extensions v3_req -days 3650 -sha256 -in $1.csr -CA $1.ca.crt -CAkey $1.ca.key -CAcreateserial -out $1.crt -extfile $1.cnf
openssl x509 -in $1.crt -text -noout
Вызов ./generate.sh example.com
Требуется Python 2
Все кредиты отправляются этой превосходной статье Фабиана Ли.
Создание доверенного сертификата CA и SAN с использованием OpenSSL
- Настройка openssl.cnf
- Создание сертификата CA
- Создание сертификата сервера с SAN, подписанного CA
Предварительное условие
В качестве предварительного условия убедитесь, что установлены пакеты SSL:
$ sudo apt install libssl1.0.0 -y
Настроенный openssl.cnf
Первый шаг - захватить openssl.cnf
шаблон доступен в вашей системе.В Ubuntu это можно найти на /usr/lib/ssl/openssl.cnf
.Вы можете найти это в /System/Library/OpenSSL/
для MacOS и /etc/pki/tls
для вариантов Redhat.
export prefix="mydomain"
cp /usr/lib/ssl/openssl.cnf $prefix.cnf
$prefix.cnf
необходимо изменить, указав конкретную информацию о сертификате, который мы собираемся создать.
В разделе [ v3_ca ]
добавьте следующие значения.Для ЦС это означает, что мы создаем ЦС, который будет использоваться для подписи ключей.
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:TRUE, pathlen:3
keyUsage = critical, cRLSign, keyCertSign
nsCertType = sslCA, emailCA
Затем в разделе [ v3_req ]
задайте следующее вместе со всеми действительными альтернативными именами для этого сертификата.
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
#extendedKeyUsage=serverAuth
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = mydomain.com
DNS.2 = *.dydomain.com
Также раскомментируйте следующую строку в разделе [ req ]
, чтобы запросы сертификатов создавались с расширениями v3.
req_extensions = v3_req
Когда мы генерируем каждый тип ключа, мы указываем, какойраздел расширения, который мы хотим использовать, поэтому мы можем поделиться $prefix.cnf
для создания как CA, так и сертификата SAN.
Создать сертификат CA
Теперь мы начнем использовать OpenSSL длясоздать необходимые ключи и сертификаты.Сначала сгенерируйте пару закрытых / открытых ключей RSA:
openssl genrsa -aes256 -out ca.key.pem 2048
chmod 400 ca.key.pem
Кодирует файл ключа с использованием ключевой фразы на основе AES256.Затем нам нужно создать самозаверяющий сертификат корневого CA.
openssl req -new -x509 -subj "/CN=myca" -extensions v3_ca -days 3650 -key ca.key.pem -sha256 -out ca.pem -config $prefix.cnf
Вы можете проверить этот сертификат корневого CA, используя:
openssl x509 -in ca.pem -text -noout
Это покажет сертификат корневого CA иIssuer
и Subject
будут одинаковыми, поскольку они являются самозаверяющими.Это помечено как CA:TRUE
, что означает, что он будет распознан как сертификат корневого ЦС;Это означает, что браузеры и ОС позволят импортировать его в хранилище доверенных корневых сертификатов.
Issuer: CN=myca
...
Subject: CN=myca
...
X509v3 Basic Constraints:
critical CA:TRUE, pathlen:3
X509v3 Key Usage:
critical Certificate Sign, CRL Sign
Netscape Cert Type:
SSL CA, S/MIME CA
Создать сертификат сервера, подписанный CA
После создания корневого CA мы переключаемся насертификат сервера.Сначала сгенерируйте пару закрытых / открытых ключей RSA:
openssl genrsa -out $prefix.key.pem 2048
Мы не ставили парольную фразу для этого ключа просто потому, что ЦС является более ценной целью, и мы всегда можем восстановить сертификат сервера, но не стесняйтесьпримите дополнительные меры предосторожности.
Затем создайте запрос на подпись сертификата сервера:
openssl req -subj "/CN=$prefix" -extensions v3_req -sha256 -new -key $prefix.key.pem -out $prefix.csr
Затем сгенерируйте сертификат сервера, используя: запрос на подпись сервера, ключ подписи CA и сертификат CA.
openssl x509 -req -extensions v3_req -days 3650 -sha256 -in $prefix.csr -CA ca.pem -CAkey ca.key.pem -CAcreateserial -out $prefix.crt -extfile $prefix.cnf
$prefix.key.pem
- это закрытый ключ сервера, а $prefix.crt
- сертификат сервера.Проверьте сертификат:
openssl x509 -in $prefix.crt -text -noout
Это покажет сертификат, и Issuer
будет именем CA, а Subject является префиксом.Это не установлен как CA, и поле Subject Alternative Name
содержит URL-адреса, которые будут считаться действительными браузерами.
Issuer:
CN=myca
...
Subject:
CN=mydomain
...
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Subject Alternative Name:
DNS:mydomain.com, DNS:*.mydomain.com
Оценка браузера
Когда вы впервые указываете Chrome или Firefoxна сайте с вашим сертификатом SAN с подписью CA он выдаст исключения того же типа, что и самозаверяющий сертификат SAN.Это связано с тем, что сертификат корневого центра сертификации не известен как надежный источник для подписанных сертификатов.
Chrome
Linux В Linux Chrome управляет собственным хранилищем сертификатов и сноваследует импортировать ca.pem
в Authorities
.Теперь значок безопасности должен стать зеленым.
Windows В настройках Chrome (chrome://settings
) найдите certificates
и нажмите Manage Certificates
.В Windows откроется диспетчер сертификатов Windows, и вы должны импортировать файл ca.pem
на вкладке Trusted Root Certification Authorities
.Это эквивалентно добавлению через mmc.exe
в local user
доверенном корневом хранилище (не на уровне компьютера).
Firefox В параметрах Firefox about:preferences
найдите certificates
и нажмите View Certificates
.Перейдите на вкладку Authorities
и импортируйте ca.pem
.Установите флажок, чтобы он доверял веб-сайтам, и теперь значок замка должен становиться зеленым при посещении страницы.