从 Chrome 58 开始,它不再接受依赖于以下内容的自签名证书Common Name
:https://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place=topicsearchin/chrome/category$3ACanary%7C排序:相关性%7C拼写:假
相反,它需要使用Subject Alt Name
。我之前一直按照这个指南来生成自签名证书:https://devcenter.heroku.com/articles/ssl-certificate-self效果很好,因为我需要server.crt
和server.key
文件来完成我的工作。我现在需要生成包含的新证书,SAN
但是我所有的尝试都没有在 Chrome 58 上成功。
这是我所做的:
我按照上述 Heroku 文章中的步骤生成密钥。然后我编写了一个新的 OpenSSL 配置文件:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = san
extensions = san
[ req_distinguished_name ]
countryName = US
stateOrProvinceName = Massachusetts
localityName = Boston
organizationName = MyCompany
[ san ]
subjectAltName = DNS:dev.mycompany.com
然后server.crt
使用以下命令生成:
openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650
我在 Mac 上,所以我server.crt
用 Keychain 打开了文件,并将其添加到我的系统证书中。然后我将其设置为Always Trust
。
除了设置 SAN 值的配置文件之外,这些步骤与我在以前版本的 Chrome 中生成和信任自签名证书的步骤类似。
然而,在此之后,我仍然ERR_CERT_COMMON_NAME_INVALID
在 Chrome 58 中得到这个。
答案1
我的解决方案:
openssl req \
-newkey rsa:2048 \
-x509 \
-nodes \
-keyout server.key \
-new \
-out server.crt \
-subj /CN=dev.mycompany.com \
-reqexts SAN \
-extensions SAN \
-config <(cat /System/Library/OpenSSL/openssl.cnf \
<(printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')) \
-sha256 \
-days 3650
状态:对我有用
答案2
这是一个对我有用的解决方案:
创建 CA 密钥和证书
# openssl genrsa -out server_rootCA.key 2048
# openssl req -x509 -new -nodes -key server_rootCA.key -sha256 -days 3650 -out server_rootCA.pem
创建server_rootCA.csr.cnf
# server_rootCA.csr.cnf
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C=DE
ST=Berlin
L=NeuKoelln
O=Weisestrasse
OU=local_RootCA
[email protected]
CN = server.berlin
创建 v3.ext 配置文件
# v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = server.berlin
创建服务器密钥
# openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server_rootCA.csr.cnf )
创建服务器证书
# openssl x509 -req -in server.csr -CA server_rootCA.pem -CAkey server_rootCA.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile v3.ext
将证书和密钥添加到 Apache2 站点文件的 HTTPS(端口 443)部分
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
将 server_rootCA.pem 从服务器复制到您的机器..
# scp [email protected]:~/server_rootCA.pem .
..并将其添加到 Chromium 浏览器
Chromium -> Setting -> (Advanced) Manage Certificates -> Import -> 'server_rootCA.pem'
您已全部完成!
附言您无需创建可运行的 CA 和服务器证书对(按照上述说明),只需在 HTTP 服务器配置中禁用 HSTS 标头即可。这将阻止 Chromium 强制执行 HTTPS,并允许用户单击“高级 → 继续访问 your.url(不安全)”,而无需获取和安装自定义 CA(server_rootCA.pem)证书。换句话说,禁用 HSTS 将允许您的网站通过 HTTP 和/或不安全的 HTTPS 连接公开查看(小心!)。
对于 Apache2,将以下内容添加到站点文件的 HTTP(端口 80)部分
Header unset Strict-Transport-Security
Header always set Strict-Transport-Security "max-age=0;includeSubDomains"
在 Debian/Apache2.4 + Debian/Chromium 59 上测试
https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58
答案3
在 Windows 中,将此脚本保存在 SSL 文件夹中,名称为 makeCERT.bat。它将创建以下文件:example.cnf、example.crt、example.key
@echo off
REM IN YOUR SSL FOLDER, SAVE THIS FILE AS: makeCERT.bat
REM AT COMMAND LINE IN YOUR SSL FOLDER, RUN: makecert
REM IT WILL CREATE THESE FILES: example.cnf, example.crt, example.key
REM IMPORT THE .crt FILE INTO CHROME Trusted Root Certification Authorities
REM REMEMBER TO RESTART APACHE OR NGINX AFTER YOU CONFIGURE FOR THESE FILES
REM PLEASE UPDATE THE FOLLOWING VARIABLES FOR YOUR NEEDS.
SET HOSTNAME=example
SET DOT=com
SET COUNTRY=US
SET STATE=KS
SET CITY=Olathe
SET ORGANIZATION=IT
SET ORGANIZATION_UNIT=IT Department
SET EMAIL=webmaster@%HOSTNAME%.%DOT%
(
echo [req]
echo default_bits = 2048
echo prompt = no
echo default_md = sha256
echo x509_extensions = v3_req
echo distinguished_name = dn
echo:
echo [dn]
echo C = %COUNTRY%
echo ST = %STATE%
echo L = %CITY%
echo O = %ORGANIZATION%
echo OU = %ORGANIZATION_UNIT%
echo emailAddress = %EMAIL%
echo CN = %HOSTNAME%.%DOT%
echo:
echo [v3_req]
echo subjectAltName = @alt_names
echo:
echo [alt_names]
echo DNS.1 = *.%HOSTNAME%.%DOT%
echo DNS.2 = %HOSTNAME%.%DOT%
)>%HOSTNAME%.cnf
openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout %HOSTNAME%.key -days 3560 -out %HOSTNAME%.crt -config %HOSTNAME%.cnf
答案4
内置配置的 Bash 脚本
作为应与 bash 跨平台运行的 shell 脚本。假设HOSTNAME
为 shell 设置了环境或提供了您选择的主机名,例如self_signed_cert.sh test
set -e
if [ -z "$1" ]; then
hostname="$HOSTNAME"
else
hostname="$1"
fi
local_openssl_config="
[ req ]
prompt = no
distinguished_name = req_distinguished_name
x509_extensions = san_self_signed
[ req_distinguished_name ]
CN=$hostname
[ san_self_signed ]
subjectAltName = DNS:$hostname, DNS:localhost, IP:127.0.0.1, IP:::1
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:true
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign, cRLSign
extendedKeyUsage = serverAuth, clientAuth, timeStamping
"
openssl req \
-newkey rsa:2048 -nodes \
-keyout "$hostname.key.pem" \
-x509 -sha256 -days 3650 \
-config <(echo "$local_openssl_config") \
-out "$hostname.cert.pem"
openssl x509 -noout -text -in "$hostname.cert.pem"
以上内容或多或少注入了 openssl 所需的最低限度的配置文件信息。
注意,额外包含DNS:localhost
SAN 以便更轻松地通过本地主机进行测试。如果您不需要,请从脚本中删除该额外部分。
信用
bcardarella 的回答很棒(由于代表人数不足,无法评论/投票)。但是,答案使用了特定于平台的现有 openssl 配置文件位置...因此:
对我有用
显然,只需要找到您自己的给定平台的 openssl 配置文件并替换正确的位置。
测试
为了进行测试,请将其导入test.cert.pem
chrome 的权限中chrome://settings/certificates
:
openssl s_server -key test.key.pem -cert test.cert.pem -accept 20443 -www &
openssl_pid=$!
google-chrome "https://localhost:20443"
google-chrome "https://127.0.0.1:20443"
google-chrome "https://[::1]:20443"
经过测试
kill $openssl_pid