首页 > 解决方案 > 如何在 ruby​​ 中使用 ca_file 正确使用 Net::HTTP 自签名证书?

问题描述

我试图了解如何使用类的ca_file属性Net::HTTP来允许使用自签名证书连接到主机。

我已经准备了我当前方法的最小示例。检查https://repl.it/repls/ElegantRaggedInstitutes或继续阅读这里:

我已使用此命令获取https://self-signed.badssl.com的证书

openssl s_client -showcerts -verify 5 -connect self-signed.badssl.com:443 < /dev/null

然后我将证书存储在本地文件中并尝试执行以下代码段

require 'net/http'
require 'openssl'

http_conn = Net::HTTP.new('self-signed.badssl.com', 443)
http_conn.use_ssl = true
http_conn.verify_mode = OpenSSL::SSL::VERIFY_PEER
http_conn.ca_file = '/path/to/badssl.cert'
http_conn.start

我希望这能成功打开连接,接受证书。相反,它给了我这个错误:

SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate)

我肯定做错了什么,你能指教吗?

标签: rubyhttpsslself-signed

解决方案


不知何故,证书搞砸了。不确定我是否执行了错误的命令、从错误的 shell 复制或者 self-signed.badssl.com 的证书刚刚更改。包含在原始 repl 中的证书实际上不是自签名的,而是由不包含在链中的不受信任的中间 CA 签名的(即我没有将其添加到 ca_file 中)。

我已经通过运行命令验证了这一点

openssl x509 -text -in /path/to/badssl.crt

并观察输出

...
        Serial Number:
            cd:bc:5a:4a:ec:97:67:b1
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = California, L = San Francisco, O = BadSSL, CN = BadSSL Intermediate Certificate Authority
        Validity
            Not Before: Aug  8 21:17:05 2016 GMT
            Not After : Aug  8 21:17:05 2018 GMT
        Subject: C = US, ST = California, L = San Francisco, O = BadSSL Fallback. Unknown subdomain or no SNI., CN = badssl-fallback-unknown-subdomain-or-no-sni
...

今天又领证了

openssl s_client -showcerts -verify 5 -connect self-signed.badssl.com:443 < /dev/null

在我的(分叉的)repl 中更新证书后,片段通过: https ://repl.it/repls/UnselfishAvariciousDeletions


推荐阅读