从Chrome 58开始,它不再接受依赖Common Name
自签名证书: https : //productforums.google.com/forum/#! topic/chrome/zVo3M8CgKzQ;context-place = topicsearchin/chrome/category $ 3ACanary% 7Csort:相关%7Cspell:假
相反,它需要使用Subject Alt Name
。 我以前一直在关于如何生成一个自签名的证书的指南: https : //devcenter.heroku.com/articles/ssl-certificate-self哪些工作好,因为我需要server.crt
和server.key
文件我在做什么 我现在需要生成包括SAN
新证书,但是我所有的尝试都没有使用Chrome 58。
这是我所做的:
我遵循上面提到的Heroku文章中的步骤来生成密钥。 然后我写了一个新的OpenSSLconfiguration文件:
[ 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上,所以我用Keychain打开server.crt
文件,将它添加到我的系统证书中。 然后我将它设置为Always Trust
。
除了用于设置SAN值的configuration文件之外,这些是我在以前的Chrome版本中使用的类似步骤,用于生成和信任自签名证书。
不过,在这之后我仍然得到Chrome 58中的ERR_CERT_COMMON_NAME_INVALID
。
我的解决scheme
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
状态:适用于我
在Windows中,将此脚本作为makeCERT.bat保存在SSL文件夹中。 它会创build这些文件: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
我的解决scheme是保持主openssl.cnf
样子,最后添加一个新的部分,如[ cert_www.example.com ]
,其中www.example.com是我要创build证书的网站,在里面,放置subjectAltName
我需要(和其他任何东西)。 当然,这个部分可以任意命名。
之后,我可以像以前一样运行openssl req
命令,只需添加-extensions cert_www.example.com
以获取其内容,并添加-subj
直接添加所有DN信息。
使用openssl x509 -text
,不要忘记在证书创build之后和使用之前validation证书内容
这是一个适合我的解决scheme:
创buildCA密钥和证书
# openssl genrsa -out server_rootCA.key 2048 # openssl req -x509 -new -nodes -key server_rootCA.key -sha256 -days 3650 -out server_rootCA.pem
创buildserver_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
创buildv3.extconfiguration文件
# v3.ext authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = server.berlin
创build服务器密钥
# openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server_rootCA.csr.cnf )
创build服务器证书
# 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'
你们都做完了!
PS而不是创build一个functionCA和服务器证书对(按照上述说明),您可以简单地禁用HTTP服务器configuration中的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上testing
https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58
作为一个shell脚本,应该在bash平台上工作。 假设为shell设置了HOSTNAME
env,或者提供一个你select的主机名,比如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 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"
以上或多或less注入了openssl需要的最低configuration文件信息。
请注意,包含额外的DNS:localhost
作为SAN允许通过本地主机更容易地testing。 如果你不想要的话,从脚本中删除额外的位。
bcardarella的答案是伟大的(不能评论/由于代表不足够的代表)。 然而,答案使用一个现有的平台特定的opensslconfiguration文件位置…因此:
为我工作
显然,你只需要find你自己的平台的opensslconfiguration文件,并replace正确的位置。
要进行testing,请在chrome://settings/certificates
test.cert.pem
导入chrome的权限,以及:
openssl s_server -key test.key.pem -cert test.cert.pem -accept 20443 -www & openssl_pid=$! google-chrome https://localhost:20443
经过testing
kill $openssl_pid