Frage

Ich versuche, Rubys Net::HTTP Umsetzung der Arbeit mit SNI zu erhalten.

Sowohl mail.google.com und gmail.com live auf der gleichen IP-Adresse, so dass, wenn über SSL verbinden, der Google-Server muss wissen, welches Zertifikat verwenden soll. Standardmäßig gibt es das mail.google.com Zertifikat, das ein Problem ist, wenn Sie versuchen, Webfinger zu implementieren.

Webfinger Sie erfordert https://gmail.com/.well-known/host-meta abzurufen die LRDD Informationen zu erhalten, aber aus Gründen der Sicherheit, es ist wichtig, die SSL-Zertifikat Informationen zu überprüfen.

Da Google das Standard-mail.google.com Zertifikat dient in diesem Fall nach oben, schlägt die SSL post_connection_check. Die richtige Lösung wäre hier Server Name Indication für Net::HTTP zu ermöglichen, aber es ist mir nicht klar, wie mit den Ruby-Bindings für OpenSSL, dass die Arbeit zu bekommen. Noch jemand eine Idee?

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

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

Ich habe auch einen Kern geschaffen, dass Exponate das Problem mit einer früheren Version von curl und OpenSSL:

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

War es hilfreich?

Lösung

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

Httpclient Entwicklungs-Repository heraus überprüfen sollte SNI unterstützen.

Lassen Sie mich wissen, wenn Sie gem real soon jetzt ...

freigegeben brauchen

Andere Tipps

Ruby-2.0 wird den TLS-SNI (Server Name Indication) Problem beheben:

von 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 in 1.9.2 (oder höher) zu machen 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

Ich habe diese Kampagne in Ausgabe Jagd eine Rückeinbindung in Rubin zu finanzieren 1.8.7 von SNI hoffentlich Menschen mit einem Cent oder dem Update beitragen können und alle unsere Probleme bekommen gelöst: D

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top