2011-01-13 6 views
8

私はSNIで動作するRubyのNet::HTTP実装を取得しようとしています。サーバー名Net :: HTTPでの表示のサポート?

両方mail.google.comとgmail.com SSL経由で接続するときに、Googleのサーバーが使用する証明書を知る必要があり、同じIPアドレスに住んでいます。デフォルトでは、webFingerを実装しようとしている場合に問題となるmail.google.com証明書が返されます。

WebFingerでは、LRDD情報を取得するためにhttps://gmail.com/.well-known/host-metaを取得する必要がありますが、セキュリティ上の理由から、SSL証明書情報を確認することが重要です。

Googleが、この場合には、デフォルトのmail.google.comの証明書を提供するので、SSL post_connection_checkは失敗します。ここでの正しい解決方法は、サーバー名の表示をNet::HTTPにすることですが、OpenSSL用のRubyバインディングを使用する方法を私には分かりません。他に誰かがアイデアを持っていますか?

あなたが実行することで問題を見ることができるはずです。

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

+0

私はすべてが、確信、一日中、この上で作業した後や、昨日の一部だがこれは無駄をなくすための運動だと言います。私はSNIを稼働させることができたとしても、難しい展開シナリオのために、サルパッチを使用してそれを行う必要があると確信しています。 –

+0

このタイプの問題に対処する他のRuby互換オプションはありますか?例えば、Net :: HTTPSは 'subjectAltName'をサポートしていますか? –

+0

もう一つの提案のオプションは、一般名マッピングのホワイトリストに対してホスト名をチェックし、 'post_connection_check'の私自身の実装を作成することです。これを行った場合、考慮すべきセキュリティ上の影響はありますか? –

答えて

8

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

は、私はまた、カールとOpenSSLの以前のバージョンを使用して問題を呈する要旨を作成しました

は、SNIをサポートするために、あなたは新しいOpenSSLのリリース(--enable-tlsextまたは0.9.8j以降で0.9.8f)が必要とSSLSocket#connectOpenSSL::SSL::SSLSocket#hostname = 'hostname'を呼び出します。 Net::HTTPSはまだSNIをサポートしておらず、open-uriはサポートしていません。

HTTPClientの開発リポジトリがSNIをサポートする必要がありますチェックアウト。

私はあなたが今、本当の間もなくリリースの宝石が必要な場合は...

+0

素晴らしいです、これを確認します。私は 'httpadapter'を使用しているので、私はそれらの呼び出しを行うことができるはずです。 –

+0

'OpenSSL :: SSL :: SSLSocket#hostname'は定義されていませんか? –

+0

これは実際には1.9.2でのみサポートされているように見えますか? –

6

ルビー2.0は、TLS SNI(Serverの名前表示)問題に対処します知ってみましょう:

から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(またはそれ以上)

#   ... 
# 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に似たパッチを適用します。 http://bugs.ruby-lang.org/issues/4351 http://en.wikipedia.org/wiki/Server_Name_Indication

関連する問題