2011-01-13 18 views
8

Estoy intentando que la implementación de Ruby Net::HTTP funcione con SNI.Soporte de indicación de nombre de servidor en Net :: HTTP?

Tanto mail.google.com como gmail.com viven en la misma dirección IP, por lo que cuando se conecta 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 obtenga https://gmail.com/.well-known/host-meta para obtener la información LRDD, sin embargo, por razones de seguridad, es fundamental verificar la información del certificado SSL.

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

Usted debe ser capaz de ver el problema ejecutando:

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

También he creado una esencia que presenta el problema utilizando una versión anterior de rizo y OpenSSL:

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

+0

Estoy convencido, pero, después de trabajar en esto todo el día y algunas de ayer , que esto es un ejercicio inútil. Estoy bastante seguro de que incluso si pudiera hacer que SNI funcionara, tendría que usar parches de mono para hacerlo, lo que lo convertiría en un escenario de implementación difícil. –

+0

¿Hay otras opciones compatibles con Ruby para tratar este tipo de problema? Por ejemplo, ¿admite Net :: HTTPS 'subjectAltName'? –

+0

Otra opción propuesta sería escribir mi propia implementación de 'post_connection_check' que verifica los nombres de host con una lista blanca de asignaciones de nombres comunes. Si hiciéramos esto, ¿hay alguna implicación de seguridad a considerar? –

Respuesta

8

Para obtener asistencia de SNI, necesita una versión más reciente de OpenSSL (0.9.8f con --enable-tlsext o 0.9.8j o posterior) y llame al OpenSSL::SSL::SSLSocket#hostname = 'hostname' antes de SSLSocket#connect. Net::HTTPS aún no es compatible con SNI, y open-uri no.

La comprobación del repositorio de desarrollo de httpclient debe ser compatible con SNI.

Déjeme saber si usted necesita liberado joya muy pronto ahora ...

+0

Impresionante, verifico esto. Estoy usando 'httpadapter', así que debería poder hacer esas llamadas. –

+0

Parece que 'OpenSSL :: SSL :: SSLSocket # hostname' no está definido? –

+0

Me parece que esto solo es compatible con 1.9.2? –

6

Rubí 2.0 se dirigirá a la TLS SNI (Nombre Indicación Server) tema:

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

para hacer este trabajo en 1.9.2 (o superior) aplicar el parche similar al 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 
#  ... 

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