Utilización de un certificado SSL en a plicación RoR


#1

Hola a todos;
¿Alguien tiene experiencia realizando conexiones seguras utilizando RoR?
Necesito que mi aplicación establezca una conexión segura contra un
servidor
remoto SLDAP pero la información que encuentro en la lista del foro
información sobre como hacerlo, no se si escribo mal lo que necesito.
Puede que sea un problema de concepto, si necesito conectar con un
servidor
seguro, entiendo que tendré que utilizar un certificado, bien, ya tengo
ese
certificado, pero mi duda es, ¿es la aplicación la que tiene que saber
de
ese certificado o la propia instalación de ruby tiene que estar
configurada
para utilizarlo?

Gracias por adelantado.


#2

Hola David, yo peronlmente no tengo mucha idea de esto pero ggogleando
un poco si he podido ver enlaces muy interesantes:

http://www.buildingwebapps.com/articles/6401-using-ssl-in-rails-applications

Pon SSL raisl en el google que de verdad que hay mucha info.

S2


#3

Hola Jose,
Si que hay enlaces, pero lo que tu comentas es como crear un aplicación
que
sea https, mientras lo que yo digo en realidad es que tengo una
aplicación
normal que en uno de sus métodos tiene que conectarse a un servidor de
terceros que funciona con https (se trata de una autenticación).
Por así decirlo, lo que busco no es que mis usuarios se conecten a mi
aplicación utilizando SSL sinó que mi aplicación en su flujo normal
establezca una conexión SSL contra un servidor remoto.

Gracias por la info de cualquier modo :wink:

El 2 de junio de 2009 13:43, Jose vicente Ribera pellicer <
removed_email_address@domain.invalid> escribió:


#4

On Martes, 2 de Junio de 2009 13:49:24 David González escribió:

Hola Jose,
Si que hay enlaces, pero lo que tu comentas es como crear un aplicación
que sea https, mientras lo que yo digo en realidad es que tengo una
aplicación normal que en uno de sus métodos tiene que conectarse a un
servidor de terceros que funciona con https (se trata de una
autenticación).

Para conectarse a un servidor https no necesitas un certificado (lo
necesita el
servidor que da servicio https), en el caso de ldap que yo sepa ocurre
lo
mismo. Según la documentación [1] tienes que usar un puerto diferente al
que
se usa para conexiones no cifradas porque no está implementado STARTTLS
que es
un comando que se usa para pasar una conexión no cifrada a cifrada. Así
que
necesitas que tu servidor soporte eso, si solo soporta conexiones no
cifradas
o con TLS (usando STARTTLS) no podrás conectar con net/ldap.
[1] http://net-ldap.rubyforge.org/rdoc/classes/Net/LDAP.html#M000020


#5

On Martes, 2 de Junio de 2009 14:55:12 David González escribió:

Entonces, si no he entendido mal, ¿tengo que conseguir en este caso es que
webrick soporte la conexión cifrada? cuando configuré la máquina ubuntu que
corre mi aplicación tuve que configurar en el fichero ldap.conf una ruta
para utilizar un certificado sin la cual no puedo acceder al servidor, es a
ese certificado al que me refiero, imaginaba que mi aplicación RoR tendría
que saber de algún modo que aparte de que la conexión la realice contrs
sldap://… por el puerto 636, que también tiene que utilizar ese
certificado que configuraba en el caso de ubuntu.

No, tu puedes tener un servidor web http (sin modo seguro), que a una
peticion
del cliente se conecte a un sldap, cuando tu aplicacion web se conecta
al
sldap este le dara su certificado para que verifique la validez (que la
documentacion de net/ldap dice que no verifica) y para que se cifre la
comunicacion. Es igual que cuando tu conectas a un https, el cliente que
es tu
navegador, no necesita tener en su disco duro el certificado se lo da el
cliente al conectar. Lo que necesitas es tener configurado tu ldap para
que
escuche en el puerto 636 en modo seguro con ese certificado.


#6

El 2 de junio de 2009 14:42, Sergio Cambra .:: entreCables S.L. ::. <
removed_email_address@domain.invalid> escribió:

necesita el servidor que da servicio https), en el caso de ldap que yo sepa
ocurre lo mismo. Según la documentación [1] tienes que usar un puerto
diferente al que se usa para conexiones no cifradas porque no está
implementado STARTTLS que es un comando que se usa para pasar una conexión
no cifrada a cifrada. Así que necesitas que tu servidor soporte eso, si solo
soporta conexiones no cifradas o con TLS (usando STARTTLS) no podrás
conectar con net/ldap.
[1] http://net-ldap.rubyforge.org/rdoc/classes/Net/LDAP.html#M000020

Entonces, si no he entendido mal, ¿tengo que conseguir en este caso es
que
webrick soporte la conexión cifrada? cuando configuré la máquina ubuntu
que
corre mi aplicación tuve que configurar en el fichero ldap.conf una ruta
para utilizar un certificado sin la cual no puedo acceder al servidor,
es a
ese certificado al que me refiero, imaginaba que mi aplicación RoR
tendría
que saber de algún modo que aparte de que la conexión la realice contrs
sldap://… por el puerto 636, que también tiene que utilizar ese
certificado que configuraba en el caso de ubuntu.


#7

David González dijo [Tue, Jun 02, 2009 at 01:49:24PM +0200]:

Hola Jose,
Si que hay enlaces, pero lo que tu comentas es como crear un aplicación que
sea https, mientras lo que yo digo en realidad es que tengo una aplicación
normal que en uno de sus métodos tiene que conectarse a un servidor de
terceros que funciona con https (se trata de una autenticación).
Por así decirlo, lo que busco no es que mis usuarios se conecten a mi
aplicación utilizando SSL sinó que mi aplicación en su flujo normal
establezca una conexión SSL contra un servidor remoto.

Gracias por la info de cualquier modo :wink:

Bueno, entonces tu necesidad escapa del framework Rails — En este
caso, debes buscar, de forma más genérica, cómo hacer conexiones SSL
desde Ruby.

Pero vámonos primero por lo facilito: ¿Requieres únicamente de
conectarte a un servicio Web sobre SSL? Entonces, quédate con
open-uri. Por ejemplo, si quiero poner un sitio de phishing abusando
de mi banco:

require ‘open-uri’
su_pagina_base = open(‘https://www.santander.com.mx/launch.html’)
@res = modifica(su_pagina_base)

Claro, probablemente necesites más — Como validar que realmente estés
hablando con quien quieres hablar: Verificar su certificado. Para
esto, podrías usar http-access2¹ — Copiando directo del tutorial:

require ‘http-access2’
client = HTTPAccess2::Client.new()
client.ssl_config.set_trust_ca(‘ca.cert’)
puts client.get('https://login.yahoo.com/config/login?’).content

Obviamente, aquí podrías poner tu propio certificado, para no confiar
en cualquiera de los canónicos.

Ahora que si tus necesidades van más allá, si vas a trabajar con
protocolos específicos o diseñados a la medida, probablemente lo más
adecuado sea que uses directamente el wrapper de OpenSSL para Ruby²,
que es parte de la biblioteca estándar de Ruby. Especialmente puedes
usar los ejemplos que vienen en la documentación para adecuarlos a tus
necesidades — por poner un ejemplo, en la documentación del módulo
Net::FTPTLS puedes encontrar que éste básicamente deriva de
Net::FTP, agregando sólo la inteligencia para conectarse sobre TLS. La
implementación completa (excluyendo documentación) es:

require ‘socket’
require ‘openssl’
require ‘net/ftp’

module Net
class FTPTLS < FTP
def connect(host, port=FTP_PORT)
@hostname = host
super
end

  def login(user = "anonymous", passwd = nil, acct = nil)
     store = OpenSSL::X509::Store.new
     store.set_default_paths
     ctx = OpenSSL::SSL::SSLContext.new('SSLv23')
     ctx.cert_store = store
     ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
     ctx.key = nil
     ctx.cert = nil
     voidcmd("AUTH TLS")
     @sock = OpenSSL::SSL::SSLSocket.new(@sock, ctx)
     @sock.connect
     @sock.post_connection_check(@hostname)
     super(user, passwd, acct)
     voidcmd("PBSZ 0")
  end
end

end

Espero te sea útil.

Saludos,

¹

² http://www.ruby-doc.org/stdlib/libdoc/openssl/rdoc/index.html


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#8

David González dijo [Tue, Jun 02, 2009 at 02:55:12PM +0200]:

Entonces, si no he entendido mal, ¿tengo que conseguir en este caso es que
webrick soporte la conexión cifrada? cuando configuré la máquina ubuntu que
corre mi aplicación tuve que configurar en el fichero ldap.conf una ruta
para utilizar un certificado sin la cual no puedo acceder al servidor, es a
ese certificado al que me refiero, imaginaba que mi aplicación RoR tendría
que saber de algún modo que aparte de que la conexión la realice contrs
sldap://… por el puerto 636, que también tiene que utilizar ese
certificado que configuraba en el caso de ubuntu.

Ok, entonces quieres conectarte a LDAP — Partamos desde ahí :slight_smile:

No es algo que yo haya hecho, pero hay varios textos al respecto. El
módulo LDAP (también parte de la biblioteca estándar) incluye soporte
de SSL:

http://www.tutorialspoint.com/ruby/ruby_ldap.htm

http://ruby-ldap.sourceforge.net/rdoc/classes/LDAP/Conn.html

$ irb

server=‘server.domain.com
=> “server.domain.com

dn='cn=admin,dc=domain,dc=com
=> “cn=admin,dc=domain,dc=com”

passwd=‘mi_pass’
=> “mi_pass”

require ‘ldap’
=> true

conn = LDAP::Conn.new(server, LDAP::LDAPS_PORT)
=> #LDAP::Conn:0x7ff13b049190

conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)
=> #LDAP::Conn:0x7ff13b049190

conn.bind(dn, passwd)
=> #LDAP::Conn:0x7ff13b049190

Y ya de ahí puedes seguir consultando a gusto.

Saludos,


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#9

Gunnar gracias por la lección tio.

Creo que entre todo lo que me dices debería funcionar, pero hay algo que
tengo que estar haciendo mal, efectivamente quiero acceder a un servidor
LDAP, pero este requiere que yo tenga un certificado.
Y no se como hacer ambas cosas o si es viable, quiero decir, establecer
una
conexión segura que se supone que debería funcionar bien, y que mi
aplicación vaya con el certificado para que el LDAP me deje acceder.
Te indico siguiendo solo los pasos de abajo el error que me suelta y en
que
punto, a ver si se te ocurre algo, yo como novato en este berenjenal
estoy
perdido.

El 3 de junio de 2009 23:29, Gunnar W. removed_email_address@domain.invalid escribió:

que saber de algún modo que aparte de que la conexión la realice contrs

=> true

conn = LDAP::Conn.new(server, LDAP::LDAPS_PORT)

LDAP::ResultError: can’t initialise an LDAP session
from (irb):5:in initialize' from (irb):5:innew’
from (irb):5
from :0


#10

Sergio Cambra .:: entreCables S.L. ::. dijo [Tue, Jun 02, 2009 at
02:42:17PM +0200]:

Para conectarse a un servidor https no necesitas un certificado (lo necesita el
servidor que da servicio https),

Ojo, puede que sí lo requieras — En pocos casos (pero no por eso
menos importantes) las organizaciones distribuyen los certificados
cliente, para tener un factor más de autenticación, adicional (o
incluso suplementario) al login y contraseña.


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#11

El 5 de junio de 2009 19:03, Gunnar W. removed_email_address@domain.invalid escribió:

Te indico siguiendo solo los pasos de abajo el error que me suelta y en
certificados), y LDAP simplemente lo enrutas a través de dicho túnel.
Entiendo que te refieres a hacer todo esto desde ruby no a nivel de
sistema?


#12

David González dijo [Thu, Jun 04, 2009 at 02:11:59PM +0200]:

perdido.
Te escribo rápido, a punto de dar una plática. No te tengo una
respuesta directa, pero asómate a los módulos de SSL — Si quisieras
usar directamente los módulos de LDAP (muy conveniente, porque toda la
codificación relacionada con el protocolo queda hecha), primero montas
un túnel vía SSL (y al establecer ese túnel es que intercambias
certificados), y LDAP simplemente lo enrutas a través de dicho túnel.


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#13

David González dijo [Sat, Jun 06, 2009 at 03:44:27PM +0200]:

Te escribo rápido, a punto de dar una plática. No te tengo una
respuesta directa, pero asómate a los módulos de SSL — Si quisieras
usar directamente los módulos de LDAP (muy conveniente, porque toda la
codificación relacionada con el protocolo queda hecha), primero montas
un túnel vía SSL (y al establecer ese túnel es que intercambias
certificados), y LDAP simplemente lo enrutas a través de dicho túnel.

Entiendo que te refieres a hacer todo esto desde ruby no a nivel de sistema?

Claro, desde Ruby mismo — Podrías montar tus túneles desde el sistema,
pero tendrías problemas de concurrencia y posiblemente de uso indebido
por parte de otros usuarios.

No dí la respuesta completa porque no la conozco, nunca lo he hecho,
pero la lógica es esa: SSL o TLS son sólo un túnel que se hace en la
capa de transporte, dentro del cual va tu protocolo favorito, sin
siquiera preguntar por qué.

Saludos,


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF