8

Net::HTTPRubyの実装を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#connectNet::HTTPSはまだ SNI をサポートしておらず、open-uri もサポートしていません。

httpclient 開発リポジトリをチェックアウトすると、SNI がサポートされるはずです。

すぐにリリースされた宝石が必要な場合はお知らせください...

于 2011-01-14T05:29:46.277 に答える
6

Ruby 2.0 は TLS SNI (Server Name Indication) の問題に対処します。

net/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 に答える