Пользовательский корневой центр сертификации не доверяет Chrome на MacOS даже после вставки в цепочку для ключей - PullRequest
0 голосов
/ 06 июня 2019

Я создаю корневой 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
...