我使用以下命令使用 OpenSSL 1.1.1b(2019 年 2 月 26 日)创建了自签名证书:
openssl req -nodes -new --days 900 -subj /CN=192.168.0.104:8080 -x509 -keyout server.key -out server.crt
然后我用窗户多媒体计算机将生成的 server.crt 导入到控制台根目录 -> 证书 - 当前用户 -> 受信任的根证书颁发机构 -> 证书
当我在 chrome 中访问 192.168.0.104:8080 上的页面时,它告诉我该页面“不安全”(但如果我查看证书信息,认证路径下的证书状态会显示“此证书没问题”。)
我在我的 Android 手机上做了类似的过程,将其上传到我的手机,并在加密和凭据设置部分添加证书。
但是,当我转到该页面时,它告诉我“服务器的证书与 URL 不匹配”。
我在这里做错了什么?
更新:
我现在正在使用 req.conf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = CA
L = Belmont
O = N/A
OU = N/A
CN = 192.168.0.104
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.0 = localhost
IP.0 = 192.168.0.104
并使用以下命令创建证书和密钥:
openssl req -x509 -nodes -days 999 -newkey rsa:2048 -keyout server.key -out server.crt -config req.conf
然后我重新启动 Chrome在 Windows 上(我不敢相信在 2019 年仍然需要重新启动程序才能使设置生效)。然后 Windows Chrome 可以正常识别它。
但是在 Android 上,我甚至无法安装此证书 - 它告诉我“安装证书需要私钥”。这更令人困惑。
答案1
- Chrome 需要 SAN。两年来,Chrome 一直在证书中使用主题备用名称 (SAN) 扩展,而不是上个世纪使用的主题中的 CommonName (CN) 属性。(其他浏览器、TTBOMK 以及当今几乎所有客户端更喜欢SAN,但必要时会回退到主题 CN;Chrome 不会。)您没有告诉我们您的 OpenSSL 配置文件中有什么,或者您使用的是什么版本。OpenSSL 1.1.1 现在有一个命令行选项
-addext
,req -new -x509
但除此之外,您至少需要在配置文件中逻辑地设置 SAN——尽管在 Unix 上,我相信WSL,你可以让 shell 使用<(commands)
(或在 zsh 中=(commands)
) 将该配置文件创建为自动临时文件。请参阅:
使用 openssl 生成可在 Chrome 58 中使用的自签名证书
无法使用自签名证书摆脱 Chrome 中的 `net::ERR_CERT_COMMON_NAME_INVALID` 错误
https://security.stackexchange.com/questions/172440/generate-x509-err-cert-common-name-invalid
https://security.stackexchange.com/questions/74345/provide-subjectaltname-to-openssl-directly-on-command-line
https://security.stackexchange.com/questions/158632/burp-suite-although-my-configurations-are-correct-still-chrome-doesnt-allows
但请注意,这些问题是关于域名的证书,它使用 SAN 条目类型 DNS;对于 IP 地址,您需要使用 IP。
- 省略端口。即使对于仍然使用主题 CN 的浏览器/客户端,它也应该是主机名或 IP 地址没有端口。(对于 SAN,您不能出错,因为 SAN 语法仅有的允许 DNS:dommainname 或 IP:IPv4or8addr 且无端口。)
PS:8080 通常用于备用 HTTP,8443 用于备用 HTTPS。将 8080 用于 HTTPS 会造成混淆。