2011-01-13 3 views
8

Я пытаюсь получить реализацию Ruby's Net::HTTP для работы с SNI.Поддержка имени сервера в Net :: HTTP?

И 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 } 

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

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

+0

Я все, но убежден, после работы над этим весь день напролет, а некоторые из вчерашнего , что это упражнение бесполезно. Я уверен, что даже если бы мне удалось заставить SNI работать, мне пришлось бы использовать патчи для обезьян, чтобы сделать это для сложного сценария развертывания. –

+0

Есть ли другие возможности, совместимые с Ruby, для решения этой проблемы? Например, поддерживает ли Net :: HTTPS 'subjectAltName'? –

+0

Другой предложенный вариант заключается в том, чтобы написать собственную реализацию 'post_connection_check', которая проверила имена хостов против белого списка общих имен. Если мы это сделаем, есть ли какие-либо последствия для безопасности? –

ответ

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.

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

+0

Удивительно, я проверю это. Я использую 'httpadapter', поэтому я должен иметь возможность делать эти вызовы. –

+0

Похоже, что 'OpenSSL :: SSL :: SSLSocket # hostname' не определен? –

+0

Мне кажется, что на самом деле это поддерживается только в 1.9.2? –

6

рубин 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 (или выше) применить аналогичный патч для чистой/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