为什么我不需要为Net :: HTTP SSL请求指定CA捆绑包?

时间:2013-07-03 17:49:45

标签: ruby ssl openssl net-http

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

  1. 默认情况下,Net :: HTTP不验证对等SSL证书
  2. 要强制Net :: HTTP验证对等体,您还需要它并提供包含受信任权限的CA证书文件
  3. 但是,我发现这不是完全必要的。在我的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证书链的默认位置?

1 个答案:

答案 0 :(得分:1)

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

在OS X上,Apple显然已经在其OpenSSL库中定制了默认回调以挂接到OS X Keychain工具。 Google证书的根CA是Equifax安全证书颁发机构。如果您更改此CA的Keychain中的信任设置(例如,使用Keychain Access实用程序),那么您的ruby测试会相应地运行。

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