1

我在 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 中运行此代码。也许当在我的 Mac 上编译 Ruby 时,它从 openssl 或其他什么地方拉入了 CA 证书链的一些默认位置?

4

1 回答 1

1

看起来如果没有设置验证回调,则使用 OpenSSL 库默认回调。请参阅 openssl 模块中的第 217 行验证回调包装器ok参数是默认回调的结果)。

在 OS X 上,Apple 显然已经在其 OpenSSL 库中自定义了默认回调,以连接到 OS X 钥匙串设施。Google 证书的根 CA 是 Equifax Secure Certificate Authority。如果您更改此 CA 的 Keychain 中的信任设置(例如,使用 Keychain Access 实用程序),那么您的 ruby​​ 测试会相应地运行。

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

于 2013-07-03T23:51:53.860 回答