自签名证书不受信任

自签名证书不受信任

我已经创建了自己的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;其安全证书不受您计算机操作系统的信任。这可能是由于配置错误或攻击者拦截您的连接造成的。

我有两个问题:

  1. 为什么安装根证书后,网站在系统范围内不受信任?Chrome 使用的是系统范围的证书,对吗?
  2. 为什么open_ssl s_client无法完成证书验证?

编辑

Curl 正在运行,并且系统范围内安装了证书:

curl https://mysite

为什么 curl 可以工作而 chrome/httpie 却不工作?

答案1

对于 OpenSSLUbuntuupdate-ca-certificates手册页中对此进行了描述来自/usr/share/ca-certificatesAND /usr/local/share/ca-certificates,但写入带有需要 subjhash.num 名称由 OpenSSL/etc/ssl/certs和 中的组合文件组成,/etc/ssl/certs/ca-certificates.crt因此后两者应分别与-CApathand/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。

相关内容