Я создаю корневой CA и сертификат, используя следующий скрипт:
#! /bin/bash
set -e
base_folder="$HOME/.acme-development-certs"
start_dir=$PWD
if test -f "$base_folder/leaf_cert/acme.pem"; then
echo "ACME development certs already created: skipping CA and cert creation."
exit 0
fi
mkdir -p $base_folder
cd $base_folder
# create root cert
mkdir -p root_ca/certs root_ca/crl root_ca/newcerts root_ca/private
echo 1000 > root_ca/serial
touch root_ca/index.txt root_ca/index.txt.attr
echo '
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = root_ca # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
private_key = $dir/private/ca.key # The private key
nameopt = default_ca
certopt = default_ca
policy = policy_match
default_days = 3650
default_md = sha512
copy_extensions = copy
[ policy_match ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req]
utf8 = yes
string_mask = utf8only
x509_extensions = v3_req
distinguished_name = req_distinguished_name
prompt = no
[req_distinguished_name]
CN = ACME Development Root CA
O = ACME
OU = ACME Engineering
[v3_req]
basicConstraints = critical,CA:TRUE
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
' > root_ca/openssl.conf
openssl genrsa -out root_ca/private/ca.key 2048
openssl req -config root_ca/openssl.conf -new -x509 -days 3650 -key root_ca/private/ca.key -sha256 -extensions v3_req -out root_ca/certs/ca.crt
openssl x509 -in root_ca/certs/ca.crt -out root_ca/certs/ca.pem -outform PEM
# create leaf cert
mkdir leaf_cert
echo '
[ req ]Development
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
CN = ACME
O = ACME
OU = ACME Engineering
[ req_ext ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = acme.com
DNS.2 = *.acme.com
DNS.3 = *.sub.acme.com
DNS.4 = acme2.com
DNS.5 = *.acme2.com
DNS.6 = *.sub.acme2.com
' > leaf_cert/openssl.conf
openssl req -new -keyout leaf_cert/acme.key -out leaf_cert/acme.csr -days 3650 -nodes -newkey rsa:2048 -config leaf_cert/openssl.conf
openssl ca -batch -config root_ca/openssl.conf -keyfile root_ca/private/ca.key -cert root_ca/certs/ca.crt -out leaf_cert/acme.crt -infiles leaf_cert/acme.csr
openssl x509 -in leaf_cert/acme.crt -out leaf_cert/acme-leaf.pem -outform PEM
cat leaf_cert/acme-leaf.pem root_ca/certs/ca.pem > leaf_cert/acme.pem
# trust new CA at the OS level
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain $base_folder/root_ca/certs/ca.pem
# serve HTTPS using the new cert
NGINX_PATH="/usr/local/etc/nginx"
cp leaf_cert/acme.pem $NGINX_PATH/star_acme_com.pem
cp leaf_cert/acme.key $NGINX_PATH/star_acme_com.key
sudo brew services restart nginx
Я пробовал различные комбинации параметров для двух файлов конфигурации, а также пытался добавить сертификат вручную в цепочку для ключей, но ничегосделать:
Chrome отклоняет его с помощью:
Этот сайт не может обеспечить безопасное соединение
sub.acme.com не соответствует стандартам безопасности.
ERR_SSL_SERVER_CERT_BAD_FORMAT
Примечания:
- Safari и curl в порядкес сертификатом.Firefox имеет свой собственный список CA и все в порядке после того, как я добавляю корневой CA
.pem
в раздел Authorities своего внутреннего списка. - Nginx настроен на использование сертификата
$NGINX_PATH/star_acme_com.key
, и это, вероятно, не проблемакак он отлично работает с платным. - В инструментах разработчика Chrome на вкладках безопасности отображается
Certificate - valid and trusted