2011-01-13 7 views
8

Ich versuche Rubys Net::HTTP Implementierung mit SNI zu arbeiten.Server Name Indication Unterstützung in Net :: HTTP?

Sowohl mail.google.com als auch gmail.com haben dieselbe IP-Adresse. Wenn Sie also eine Verbindung über SSL herstellen, muss der Google-Server wissen, welches Zertifikat verwendet werden soll. Standardmäßig wird das mail.google.com-Zertifikat zurückgegeben. Dies ist ein Problem, wenn Sie WebFinger implementieren möchten.

WebFinger erfordert, dass Sie https://gmail.com/.well-known/host-meta abrufen, um die LRDD-Informationen zu erhalten. Aus Sicherheitsgründen ist es jedoch wichtig, die SSL-Zertifikatsinformationen zu überprüfen.

Da Google in diesem Fall das standardmäßige mail.google.com-Zertifikat bereitstellt, schlägt SSL post_connection_check fehl. Die richtige Lösung hier wäre, Server Name Indication für Net::HTTP zu aktivieren, aber es ist mir nicht klar, wie man das mit den Ruby-Bindungen für OpenSSL arbeiten. Hat noch jemand eine Idee?

Sie sollten das Problem zu sehen, indem Sie der Lage sein:

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

ich angelegt habe auch einen Kern, der das Problem mit einer früheren Version von curl und OpenSSL zeigt:

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

+0

Ich bin ganz überzeugt, aber nach dem ganzen Tag daran arbeiten und einige von gestern , dass dies eine Übung in Vergeblichkeit ist. Ich bin mir ziemlich sicher, dass, selbst wenn ich in der Lage wäre, SNI zum Laufen zu bringen, ich dafür Affen-Patches verwenden müsste, um ein schwieriges Einsatzszenario zu schaffen. –

+0

Gibt es noch weitere Ruby-kompatible Optionen, um mit dieser Art von Problem umzugehen? Zum Beispiel, unterstützt Net :: HTTPS 'subjectAltName'? –

+0

Eine andere vorgeschlagene Option wäre, meine eigene Implementierung von 'post_connection_check' zu schreiben, die Hostnamen gegen eine Whitelist mit Common Name Mappings überprüft. Wenn wir das getan haben, gibt es dann irgendwelche Sicherheitsimplikationen? –

Antwort

8

Für die SNI-Unterstützung benötigen Sie eine neuere OpenSSL-Version (0.9.8f mit --enable-tlsext oder 0.9.8j oder höher) und rufen Sie OpenSSL::SSL::SSLSocket#hostname = 'hostname' vor SSLSocket#connect. Net::HTTPS unterstützt SNI noch nicht und open-uri nicht.

Auschecken von httpclient Entwicklung Repository sollte SNI unterstützen.

Lassen Sie mich wissen, wenn Sie gem real soon jetzt veröffentlicht brauchen ...

+0

Ehrfürchtig, ich werde das überprüfen. Ich benutze 'httpadapter', also sollte ich diese Anrufe tätigen können. –

+0

Es scheint, dass "OpenSSL :: SSL :: SSLSocket # hostname" nicht definiert ist? –

+0

Es sieht für mich so aus, wird eigentlich nur in 1.9.2 unterstützt? –

6

Rubin 2.0 wird das TLS-SNI (Server Name Indication) Problem beheben:

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

Um diese Arbeit zu machen 1.9.2 (oder höher) gelten ähnliche Patch 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 
#  ... 

siehe auch: http://bugs.ruby-lang.org/issues/4351 http://en.wikipedia.org/wiki/Server_Name_Indication