从 Chrome 58 开始,它不再接受依赖于Common Name
:https ://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place= topicsearchin/chrome/category $3ACanary%7Csort 的自签名证书:相关性%7Cspell:false
相反,它需要使用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
用钥匙串打开了文件,将它添加到我的系统证书中。然后我将其设置为Always Trust
.
除了用于设置 SAN 值的配置文件之外,这些步骤与我在以前版本的 Chrome 中用于生成和信任自签名证书的步骤类似。
但是,在此之后,我仍然可以使用ERR_CERT_COMMON_NAME_INVALID
Chrome 58。
我的解决方案:
状态:为我工作
这是一个适合我的解决方案:
创建 CA 密钥和证书
创建 server_rootCA.csr.cnf
创建 v3.ext 配置文件
创建服务器密钥
创建服务器证书
将证书和密钥添加到 Apache2 站点文件、HTTPS(端口 443)部分
将 server_rootCA.pem 从服务器复制到您的计算机。
.. 并将其添加到 Chromium 浏览器
你已经完成了!
PS您可以简单地在 HTTP 服务器配置中禁用 HSTS 标头,而不是创建功能 CA 和服务器证书对(按照上面的说明)。这将阻止 Chromium 强制执行 HTTPS,并允许用户单击“高级 → 继续访问 your.url(不安全)”,而无需获取并安装您的自定义 CA (server_rootCA.pem) 证书。换句话说 - 必须禁用 HSTS 将允许通过 HTTP 和/或不安全的 HTTPS 连接公开查看您的网站(当心!)。
对于 Apache2,将以下内容添加到站点文件 HTTP(端口 80)部分
在 Debian/Apache2.4 + Debian/Chromium 59 上测试
https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58
在 Windows 中,将此脚本作为 makeCERT.bat 保存在 SSL 文件夹中。它将创建这些文件:example.cnf、example.crt、example.key
有几个很好的答案提供了如何让这个工作的例子,但没有一个可以解释你的尝试出了什么问题。OpenSSL 有时可能非常不直观,因此值得一试。
首先,顺便说一句,OpenSSL 默认忽略您在配置中提供的任何专有名称值。如果你想使用它们,你必须添加
prompt = no
到你的配置中。此外,所写的命令只生成证书 请求而不是证书本身,因此该-days
命令什么也不做。如果您使用您提供的此命令生成证书请求并检查结果,则主题替代名称存在:
但是,如果您使用 heroku 链接中的命令生成证书并检查结果,则缺少主题替代名称:
原因是默认情况下 OpenSSL 不会将扩展名从请求复制到证书。通常,证书将由 CA 根据客户的请求创建/签名,如果某些扩展程序盲目信任请求中定义的扩展程序,则某些扩展程序可能会授予证书比 CA 预期的更多的权力。
有一些方法可以告诉 OpenSSL 复制扩展名,但恕我直言,这不仅仅是在生成证书时在配置文件中提供扩展名。
如果您要尝试使用现有的配置文件,它将不起作用,因为顶级部分已标记
[req]
,因此这些设置仅适用于 req 命令而不是 x509 命令。没有必要拥有顶级部分标记,因此您可以删除第一行,然后它可以正常用于生成请求或证书。或者,您可以使用命令的
-x509
参数req
在单个命令中生成自签名证书,而不是先创建请求然后再创建证书。在这种情况下,不需要删除[req]
节行,因为该节由 req 命令读取和使用。回顾一下,这是上述命令中使用的修改后的配置文件:
带有配置的 Bash 脚本
作为一个可以跨平台使用 bash 的 shell 脚本。假设
HOSTNAME
为 shell 设置环境或提供您选择的主机名,例如self_signed_cert.sh test
以上或多或少注入了 openssl 所需的最低配置文件信息。
请注意,包含额外
DNS:localhost
的 SAN 以允许更轻松地通过 localhost 进行测试。如果您不想要它,请从脚本中删除多余的部分。信用
bcardarella 的回答很棒(由于代表不足,无法评论/投票)。但是,答案使用特定于平台的现有 openssl 配置文件位置......因此:
显然,您只需要为您自己的给定平台找到 openssl 配置文件并替换正确的位置。
测试
要进行测试,请在 中导入
test.cert.pem
chrome 的权限chrome://settings/certificates
,并且:并且经过测试
我的解决方案是保持主要
openssl.cnf
内容不变,并在最后添加一个新部分[ cert_www.example.com ]
,例如 www.example.com 是我要为其创建证书的网站,并在其中放入subjectAltName
我需要的(和还要别的吗)。当然,该部分可以任意命名。之后,我可以
openssl req
像以前一样运行命令,只需添加-extensions cert_www.example.com
要获取的内容,然后-subj
添加直接添加所有 DN 信息。不要忘记在证书创建后和使用前验证证书内容,使用
openssl x509 -text