8

我正在尝试让 Ruby 的Net::HTTP实现与 SNI 一起工作。

mail.google.com 和 gmail.com 都使用同一个 IP 地址,因此当通过 SSL 连接时,Google 服务器需要知道要使用哪个证书。默认情况下,它会返回 mail.google.com 证书,如果您尝试实现 WebFinger,这是一个问题。

WebFinger 要求您检索https://gmail.com/.well-known/host-meta以获取 LRDD 信息,但是,出于安全原因,验证 SSL 证书信息至关重要。

由于 Google 在这种情况下提供了默认的 mail.google.com 证书,因此 SSLpost_connection_check失败。这里正确的解决方案是为 启用服务器名称指示Net::HTTP,但我不清楚如何使用 OpenSSL 的 Ruby 绑定。还有人有想法吗?

您应该能够通过运行看到问题:

require 'open-uri'
open('https://gmail.com/.well-known/host-meta') { |f| f.read }

我还创建了一个要点,使用早期版本的 curl 和 OpenSSL 来展示问题:

https://gist.github.com/7936ef38787092a22897

4

2 回答 2

8

对于 SNI 支持,您需要更新的 OpenSSL 版本(0.9.8f--enable-tlsext或 0.9.8j 或更高版本)并OpenSSL::SSL::SSLSocket#hostname = 'hostname'SSLSocket#connect. Net::HTTPS还不支持 SNI,open-uri 也不支持。

签出 httpclient 开发存储库应该支持 SNI。

让我知道您是否需要立即发布真正的宝石...

于 2011-01-14T05:29:46.277 回答
6

Ruby 2.0 将解决 TLS SNI(服务器名称指示)问题:

来自网络/http..

#        ...
#           s.session = @ssl_session if @ssl_session
#           # Server Name Indication (SNI) RFC 3546
#           s.hostname = @address if s.respond_to? :hostname=
#           Timeout.timeout(@open_timeout, Net::OpenTimeout) { s.connect }
#           if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE
#             s.post_connection_check(@address)
#           end
#           ...

要在 1.9.2(或更高版本)中进行这项工作,请对 net/http 应用类似的补丁

#         ...
# BEGIN:  SNI PATCH http://bugs.ruby-lang.org/issues/4351
#          s.hostname = @address if s.respond_to? :hostname=
# END:   SNI PATCH http://bugs.ruby-lang.org/issues/4351
#          timeout(@open_timeout) { s.connect }
#          if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE
#            s.post_connection_check(@address)
#          end
#        ...

另见: http ://bugs.ruby-lang.org/issues/4351 http://en.wikipedia.org/wiki/Server_Name_Indication

于 2013-03-29T19:41:35.693 回答