2011-01-13 19 views
8

Sto cercando di ottenere l'implementazione Net::HTTP di Ruby per funzionare con SNI.Supporto indicazione nome server in Net :: HTTP?

Sia mail.google.com sia gmail.com vivono sullo stesso indirizzo IP, quindi quando ci si connette tramite SSL, il server di Google deve sapere quale certificato utilizzare. Per impostazione predefinita, restituisce il certificato mail.google.com, che è un problema se stai cercando di implementare WebFinger.

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

Poiché in questo caso, Google offre il certificato mail.google.com predefinito, lo SSL post_connection_check non riesce. La soluzione corretta sarebbe quella di abilitare l'indicazione del nome del server per Net::HTTP, ma non mi è chiaro come farlo funzionare con i binding Ruby per OpenSSL. Qualcun altro ha 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 precedente versione di curl e OpenSSL:

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

+0

io sono tutto, ma convinto, dopo aver lavorato in questo tutto il giorno e alcuni di ieri , questo è un esercizio di futilità. Sono abbastanza sicuro che anche se riuscissi a far funzionare SNI, dovrei usare le patch di scimmia per farlo, creando uno scenario di distribuzione difficile. –

+0

Esistono altre opzioni compatibili con Ruby per trattare questo tipo di problema? Ad esempio, Net :: HTTPS supporta 'subjectAltName'? –

+0

Un'altra opzione proposta sarebbe scrivere la mia implementazione di 'post_connection_check' che ha verificato i nomi host rispetto a una lista bianca di mappature di nomi comuni. Se lo facessimo, ci sono implicazioni sulla sicurezza da considerare? –

risposta

8

Per il supporto SNI, è necessaria una versione OpenSSL più recente (0.9.8f con --enable-tlsext o 0.9.8j o successiva) e chiamare OpenSSL::SSL::SSLSocket#hostname = 'hostname' prima del SSLSocket#connect. Net::HTTPS non supporta ancora SNI e open-uri no.

Verificare il repository di sviluppo httpclient deve supportare SNI.

Fatemi sapere se avete bisogno rilasciato gemma molto presto ora ...

+0

Fantastico, controllerò questo. Sto usando 'httpadapter', quindi dovrei essere in grado di effettuare quelle chiamate. –

+0

Sembra che 'OpenSSL :: SSL :: SSLSocket # hostname' non sia definito? –

+0

Mi sembra che questo sia supportato solo in 1.9.2? –

6

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

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

Per rendere questo lavoro in 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