Вопрос

Я пытаюсь получить Рубин 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. У кого -нибудь еще есть идея?

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

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

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

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

Это было полезно?

Решение

Для поддержки SNI вам нужен более новый релиз OpenSSL (0.9.8f с --enable-tlsext или 0,9,8 или позже) и звонить OpenSSL::SSL::SSLSocket#hostname = 'hostname' до SSLSocket#connect. Net::HTTPS Еще не поддерживает SNI, а Open-Uri-нет.

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

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

Другие советы

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

Я сделал эту кампанию в выпустить охоту Чтобы финансировать обратный пакет в Ruby 1.8.7 SNI, надеюсь, люди смогут внести свой вклад в копейки или исправление и решить все наши проблемы: D

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top