跳到主要内容
ecdsa.com
Ruby openssl (Net::HTTP, Faraday, RubyGems)Ruby

错误信息

state=error: certificate verify failed (self-signed certificate in certificate chain)

也可能输出为

  • OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (self-signed certificate in certificate chain)

完整消息是“SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (self-signed certificate in certificate chain)”。基于 OpenSSL 1.1.1 构建的 Ruby 打印的是不带连字符的“self signed”。

Ruby openssl (Net::HTTP, Faraday, RubyGems) — OpenSSL::SSL::SSLError from SSL_connect

含义

服务器的证书链终止于一张 Ruby 的 OpenSSL 不信任的自签名根证书。对于 rubygems.org 这样的公共主机,这意味着执行 TLS 检查的代理或杀毒软件正在对连接重新签名;对于内部主机,则是 Ruby 使用的证书存储中缺少公司根证书。

原因

修复方法

  1. 1.

    确定根证书

    打印某个公共主机的证书链;以你的公司或某家安全厂商命名的根证书,就是需要信任的那一张。

    bash
    openssl s_client -connect rubygems.org:443 -servername rubygems.org -showcerts </dev/null 2>/dev/null \
      | grep -E '^ *[0-9]+ s:|^ *i:'
  2. 2.

    把 SSL_CERT_FILE 指向合并后的证书包

    把公共根证书与代理根证书合并在一起,因为 SSL_CERT_FILE 会替换默认的证书包文件。

    bash
    # Public roots + the proxy root in one bundle
    cat /etc/ssl/certs/ca-certificates.crt corp-proxy-root.pem > ~/.config/corp-ca-bundle.pem
    export SSL_CERT_FILE=~/.config/corp-ca-bundle.pem
  3. 3.

    在系统范围内安装根证书(Linux)

    链接系统 OpenSSL 的 Ruby 在运行 update-ca-certificates 之后就会使用这张根证书。

    bash
    sudo cp corp-proxy-root.pem /usr/local/share/ca-certificates/corp-proxy-root.crt && sudo update-ca-certificates

相关错误

浏览完整的签名错误库