Поддержка индикации имени сервера в Net :: HTTP? - PullRequest
8 голосов
/ 14 января 2011

Я пытаюсь заставить Net::HTTP реализацию Ruby работать с 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, но мне не ясно, как добиться этого при работе с привязками Ruby для OpenSSL. У кого-нибудь еще есть идея?

Вы должны увидеть проблему, запустив:

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

Я также создал суть, которая демонстрирует проблему, используя более раннюю версию curl и OpenSSL:

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

Ответы [ 2 ]

8 голосов
/ 14 января 2011

Для поддержки SNI вам потребуется более новая версия OpenSSL (0.9.8f с --enable-tlsext или 0.9.8j или более поздней версией) и вызовите OpenSSL::SSL::SSLSocket#hostname = 'hostname' до SSLSocket#connect.Net::HTTPS пока не поддерживает SNI, а open-uri - нет.

Проверка хранилища разработки httpclient должна поддерживать SNI.

Дайте мне знать, если вам нужен очень скоро выпущенный драгоценный камень ...

6 голосов
/ 29 марта 2013

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

...