我在 SO 和博客文章中看到的很多内容都是这样的
- 默认情况下,Net::HTTP 不验证对等 SSL 证书
- 要强制 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_path
和 http.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/