![自签名证书不受信任](https://linux22.com/image/1556286/%E8%87%AA%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6%E4%B8%8D%E5%8F%97%E4%BF%A1%E4%BB%BB.png)
我已经创建了自己的CA:
openssl genrsa -out private/rootCA.key 2048
openssl req -batch -new -x509 -nodes -key private/rootCA.key -sha256 -days 1024 -config ./openssl.conf -out certs/rootCA.pem
我已经为我的网站创建了证书:
openssl genrsa -out private/$domain.key 2048
openssl req -batch -new -key private/$domain.key -config ./openssl.conf -subj "/commonName=$domain" -out csr/$domain.csr
openssl x509 -req -in csr/$domain.csr -CA certs/rootCA.pem -CAkey private/rootCA.key -CAcreateserial -out certs/$domain.crt -days 500 -sha256
我将站点证书和根证书合并成一个包:
cat certs/$domain.crt certs/rootCA.pem > bundles/$domain.bundle.crt
我将证书/密钥复制到 nginx 配置目录:
cp bundles/$domain.bundle.crt private/$domain.key /etc/nginx/conf/certs
我确保 nginx 为我的网站使用这些证书:
ssl_certificate /etc/nginx/certs/mysite.bundle.crt;
ssl_certificate_key /etc/nginx/certs/mysite.key;
我重新启动了 nginx。
我在我的系统中安装了根证书:
sudo cp certs/rootCA.pem /usr/local/share/ca-certificates/myrootCA.crt
sudo update-ca-certificates
我核实过httpie
:
» httphttps://我的网站
http: error: SSLError: HTTPSConnectionPool(host='mysite', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",),))
我进行验证openssl
(告诉它使用 ca-certificates 目录,该目录似乎默认不被使用):
openssl s_client -host mysite -port 443 -prexit -showcerts -CApath /usr/local/share/ca-certificates
这使:
Verify return code: 19 (self signed certificate in certificate chain)
且验证尚未完成。
使用 Chrome 打开该网站时出现标准错误:
此服务器无法证明它是 mysite;其安全证书不受您计算机操作系统的信任。这可能是由于配置错误或攻击者拦截您的连接造成的。
我有两个问题:
- 为什么安装根证书后,网站在系统范围内不受信任?Chrome 使用的是系统范围的证书,对吗?
- 为什么
open_ssl s_client
无法完成证书验证?
编辑
Curl 正在运行,并且系统范围内安装了证书:
curl https://mysite
为什么 curl 可以工作而 chrome/httpie 却不工作?
答案1
对于 OpenSSLUbuntuupdate-ca-certificates
手册页中对此进行了描述读来自/usr/share/ca-certificates
AND /usr/local/share/ca-certificates
,但写入带有需要 subjhash.num 名称由 OpenSSL/etc/ssl/certs
和 中的组合文件组成,/etc/ssl/certs/ca-certificates.crt
因此后两者应分别与-CApath
and/or一起使用-CAfile
。
curl
显然使用了 OpenSSL 默认值,在这个版本中是/etc/ssl/certs/
,但根据哪个 Ubuntu,OpenSSL 可能足够旧,以至于存在命令行s_client
不会自动使用默认值的错误。
对于 Chrome我帮不上忙;我不在 Ubuntu 上使用 Chrome。留下 CW 以防别人能帮上忙。
虽然我知道一旦你获得 CA 信任,最近的 Chrome 也需要你的服务器证书(在 PKI 术语中,最终实体 = EE = 非 CA)具有带有正确名称的 SAN 扩展(SubjectAlternateNames),而其他两个证书都没有(目前),并且您没有表明是否/如何做到这一点。(扩展:)HTTPS 的 rfc 2818 和 CABforum 标准十多年来一直要求服务器证书包含有效的 SAN,现在所有或几乎所有客户端使用SAN,但据我所知,到目前为止,Chrome 是唯一一个需要SAN 在场。
答案2
看来我自己生成的根 CA 是错误的。它缺少:
basicConstraints = CA:TRUE
解决这个问题后,httpie
运行正常。奇怪的是,curl
没有人抱怨这一点。
但这还没有解决 Chrome 中的问题...我认为 Chrome 不使用系统范围的 CA。