ruby - 为什么我不需要为 Net::HTTP SSL 请求指定 CA bundle ?

标签 ruby ssl openssl net-http

我在 SO 和博客文章中看到的很多内容都是这样的

  1. 默认情况下,Net::HTTP 不验证对等 SSL 证书
  2. 要强制 Net::HTTP 验证对等点,您也需要提供包含可信机构的 CA 证书文件

但是,我发现这并不是完全必要的。在我的 Mac 上,我有以下代码

http = Net::HTTP.new('www.google.com', 443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.start do
  http.request_get('/') do |response|
    puts response.body
  end
end

这有效。但是 Ruby 使用什么来验证对等点呢?当我查看 http.ca_pathhttp.ca_file 的输出时,它们都是空白的。

我在 Ruby 1.9.3p374 中运行此代码。也许当 Ruby 在我的 Mac 上编译时,它从 openssl 或其他东西中提取了 CA 证书链的某个默认位置?

最佳答案

看起来如果没有设置验证回调,则使用 OpenSSL 库默认回调。请参阅 the openssl module verify callback wrapper 中的第 217 行(ok 参数是默认回调的结果)。

在 OS X 上,Apple 显然在其 OpenSSL 库中自定义了默认回调,以 Hook OS X 钥匙串(keychain)设施。 Google 证书的根 CA 是 Equifax 安全证书颁发机构。如果您更改此 CA 的钥匙串(keychain)中的信任设置(例如,使用钥匙串(keychain)访问实用程序),则您的 ruby​​ 测试会相应地表现。

我相信您问题的答案是,当需要对等证书验证但未配置时,OS X 附带的 ruby​​ 将使用 Keychain 进行验证。

关于ruby - 为什么我不需要为 Net::HTTP SSL 请求指定 CA bundle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17454912/

相关文章:

Apache2 和 HeartBleed SSL 问题

php - 从保存的私钥 PHP 生成公钥

c - Openssl:在 SSL_CTX_load_verify_locations API 中使用 CApath 参数时证书验证失败

ruby-on-rails - Ruby 单词数组作为哈希?

java - Play WS 异常 : javax.net.ssl.SSLException: Received fatal alert: internal_error

ssl - 如何在 Go ReverseProxy 中使用 TLS?

python - 在 Python 中下载带有 "urllib.request.urlretrieve"的图像失败

ruby-on-rails - 为什么是:if not being recognised by ActiveRecord validations?

ruby-on-rails - 如何在 ruby​​ 中对我的模型进行全局验证(仅接受字母数字)

ruby - RestClient.get 返回证书验证失败