Question

Je suis en train d'obtenir la mise en œuvre de Net::HTTP Ruby au travail avec la SNI.

Les deux mail.google.com et gmail.com en direct sur la même adresse IP, de sorte que lors de la connexion via SSL, les besoins du serveur Google pour savoir le certificat à utiliser. Par défaut, elle renvoie le certificat mail.google.com, ce qui est un problème si vous essayez de mettre en œuvre WebFinger.

WebFinger vous oblige à récupérer https://gmail.com/.well-known/host-meta pour obtenir les informations de LRDD, cependant, pour des raisons de sécurité, il est essentiel de vérifier les informations du certificat SSL.

Étant donné que Google sert le certificat de mail.google.com par défaut dans ce cas, l'échec post_connection_check SSL. La bonne solution serait de permettre ici Nom du serveur Indication pour Net::HTTP, mais ce n'est pas clair pour moi comment obtenir ce travail avec les liaisons Ruby pour OpenSSL. Quelqu'un d'autre a une idée?

Vous devriez être en mesure de voir le problème en exécutant:

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

J'ai aussi créé un fond qui présente le problème en utilisant une version antérieure de boucle et OpenSSL:

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

Était-ce utile?

La solution

Pour le support SNI, vous avez besoin d'une version plus récente de OpenSSL (0.9.8f avec --enable-tlsext ou 0.9.8j ou version ultérieure) et OpenSSL::SSL::SSLSocket#hostname = 'hostname' d'appel avant SSLSocket#connect. Net::HTTPS ne supporte pas encore SNI et open-uri ne fonctionne pas.

Analysant référentiel de développement httpclient devrait soutenir la SNI.

Laissez-moi savoir si vous avez besoin libéré petit bijou dès maintenant ...

Autres conseils

Ruby 2.0 abordera la question TLS SNI (Nom du serveur d'indication):

du filet / 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
#           ...

Pour faire ce travail en 1.9.2 (ou supérieur)   appliquer le correctif similaire à 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
#        ...

voir aussi: http://bugs.ruby-lang.org/issues/4351 http://en.wikipedia.org/wiki/Server_Name_Indication

J'ai fait cette campagne problème chasse pour financer un backport en rubis 1.8.7 de la SNI, espérons les gens peuvent contribuer avec un sou ou le correctif et obtenir tous nos problèmes résolus: D

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top