net :: httpでのサーバー名表示サポート?
質問
私はルビーを手に入れようとしています 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証明書を提供するため、この場合、SSL post_connection_check
失敗します。ここでの正しい解決策は、サーバー名の表示を有効にすることです Net::HTTP
, 、しかし、OpenSSLのためにRuby Bindingsでそれを機能させる方法は私には明らかではありません。他の誰かがアイデアを持っていますか?
実行することで問題を確認できるはずです。
require 'open-uri'
open('https://gmail.com/.well-known/host-meta') { |f| f.read }
また、以前のバージョンのCurlとOpenSSLを使用して問題を示す要点を作成しました。
解決
SNIサポートには、新しいOpenSSLリリースが必要です(0.9.8Fで --enable-tlsext
または0.9.8j以降)と電話 OpenSSL::SSL::SSLSocket#hostname = 'hostname'
前 SSLSocket#connect
. Net::HTTPS
まだSNIをサポートしておらず、Open-uriはサポートしていません。
HTTPCLIENT開発リポジトリをチェックすると、SNIがサポートされるはずです。
すぐにリリースされたGem Realが必要かどうか教えてください...
他のヒント
Ruby 2.0は、TLS SNI(サーバー名表示)の問題に対処します。
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
このキャンペーンを作成しました ハントを発行します SNIのRuby 1.8.7にバックポートに資金を提供することを願っています。