Soporte de indicación de nombre de servidor en Net :: HTTP?

Estoy intentando que la implementación de Ruby’s Net::HTTP funcione con SNI.

Tanto mail.google.com como gmail.com viven en la misma dirección IP, por lo que al conectarse a través de SSL, el servidor de Google necesita saber qué certificado usar. De forma predeterminada, devuelve el certificado mail.google.com, que es un problema si está intentando implementar WebFinger.

WebFinger requiere que recupere https://gmail.com/.well-known/host-meta para obtener la información de LRDD; sin embargo, por razones de seguridad, es fundamental verificar la información del certificado SSL.

Dado que Google entrega el certificado predeterminado mail.google.com en este caso, el post_connection_check SSL falla. La solución correcta aquí sería habilitar la Indicación de nombre de servidor para Net::HTTP , pero no me queda claro cómo hacer que eso funcione con los enlaces de Ruby para OpenSSL. Alguien más tiene una idea?

Deberías poder ver el problema ejecutando:

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

También he creado una idea general que muestra el problema con una versión anterior de curl y OpenSSL:

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

Para la compatibilidad con SNI, necesita una versión más reciente de OpenSSL (0.9.8f con --enable-tlsext o 0.9.8j o posterior) y llamar a OpenSSL::SSL::SSLSocket#hostname = 'hostname' antes de que SSLSocket#connect . Net::HTTPS no admite SNI todavía, y open-uri no lo admite.

La comprobación del repository de desarrollo de httpclient debería ser compatible con SNI.

Déjame saber si necesitas una gem liberada muy pronto ahora …

Ruby 2.0 solucionará el problema TLS SNI (Indicación de nombre de servidor):

desde la red / 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 # ... 

Para hacer que esto funcione en 1.9.2 (o superior) aplique un parche similar 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 # ... 

vea también: http://bugs.ruby-lang.org/issues/4351 http://en.wikipedia.org/wiki/Server_Name_Indication