如何在 ruby 中使用 Net::HTTP 正确使用 ca_file 自签名证书?
How to properly use ca_file for self-signed certificates with Net::HTTP in ruby?
我正在尝试了解如何使用 Net::HTTP
class 的 ca_file
属性 来允许连接到具有自签名证书的主机。
我已经为我当前的方法准备了一个最小的例子。检查 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)
我肯定做错了什么,你能指教吗?
证书不知何故弄乱了。不确定我是否执行了错误的命令,从错误的 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
我正在尝试了解如何使用 Net::HTTP
class 的 ca_file
属性 来允许连接到具有自签名证书的主机。
我已经为我当前的方法准备了一个最小的例子。检查 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)
我肯定做错了什么,你能指教吗?
证书不知何故弄乱了。不确定我是否执行了错误的命令,从错误的 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