Domanda

Sto cercando di ottenere implementazione Net::HTTP di Ruby al lavoro con SNI.

Sia mail.google.com e gmail.com dal vivo sullo stesso indirizzo IP, in modo che quando la connessione tramite SSL, alle esigenze dei server di Google per sapere quale certificato da utilizzare. Per impostazione predefinita, restituisce il certificato mail.google.com, che è un problema se si sta cercando di attuare webfinger.

webfinger richiede di recuperare https://gmail.com/.well-known/host-meta per ottenere le informazioni LRDD, tuttavia, per motivi di sicurezza, è fondamentale per verificare le informazioni del certificato SSL.

Dal momento che Google serve il certificato mail.google.com default in questo caso, il post_connection_check SSL fallisce. La soluzione corretta sarebbe di consentire Server Name Indication per Net::HTTP, ma non è chiaro per me come ottenere che il lavoro con le associazioni di Ruby per OpenSSL. Chiunque altro avere un'idea?

Si dovrebbe essere in grado di vedere il problema eseguendo:

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

Ho anche creato un succo che presenta il problema utilizzando una versione precedente di curl e OpenSSL:

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

È stato utile?

Soluzione

Per il supporto SNI, è necessario una nuova versione OpenSSL (0.9.8f con --enable-tlsext o 0.9.8j o successivo) e la chiamata OpenSSL::SSL::SSLSocket#hostname = 'hostname' prima SSLSocket#connect. Net::HTTPS non supporta SNI ancora, e open-uri non lo fa.

Il check-out httpclient repository di sviluppo dovrebbero sostenere SNI.

Fammi sapere se hai bisogno rilasciato gemma molto presto ora ...

Altri suggerimenti

Rubino 2.0 affronterà il TLS SNI (Server Name Indication) problema:

da rete / 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
#           ...

Per fare questo lavoro a 1.9.2 (o superiore) applicare la patch simile a 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
#        ...

vedi anche: http://bugs.ruby-lang.org/issues/4351 http://en.wikipedia.org/wiki/Server_Name_Indication

Ho fatto questa campagna in caccia problema per finanziare un backport in rubino 1.8.7 di SNI spero che la gente può contribuire con una monetina o la correzione e ottenere tutti i nostri problemi risolti: D

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top