Forum: Rails-ES Utilización de un certificado SSL en a plicación RoR

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
D4f69cb8f9f4566c158cce3f482e2028?d=identicon&s=25 David González (Guest)
on 2009-06-02 13:03
(Received via mailing list)
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.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-06-02 13:43
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...

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

S2
D4f69cb8f9f4566c158cce3f482e2028?d=identicon&s=25 David González (Guest)
on 2009-06-02 13:50
(Received via mailing list)
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 ;)

El 2 de junio de 2009 13:43, Jose vicente Ribera pellicer <
ruby-forum-incoming@andreas-s.net> escribió:
Fbef10e8904c80c015dce56f3fa09bea?d=identicon&s=25 Sergio Cambra .:: entreCables S.L. ::. (Guest)
on 2009-06-02 14:43
(Received via mailing list)
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/LDA...
D4f69cb8f9f4566c158cce3f482e2028?d=identicon&s=25 David González (Guest)
on 2009-06-02 14:56
(Received via mailing list)
El 2 de junio de 2009 14:42, Sergio Cambra .:: entreCables S.L. ::. <
sergio@entrecables.com> 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/LDA...
>

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.
Fbef10e8904c80c015dce56f3fa09bea?d=identicon&s=25 Sergio Cambra .:: entreCables S.L. ::. (Guest)
on 2009-06-02 17:04
(Received via mailing list)
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.
C98e88f3e69340d27466baadb2b80b4c?d=identicon&s=25 Gunnar Wolf (Guest)
on 2009-06-03 23:14
(Received via mailing list)
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 ;)

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://ghouston.blogspot.com/2006/03/using-ssl-wit...

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

--
Gunnar Wolf - gwolf@gwolf.org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF
C98e88f3e69340d27466baadb2b80b4c?d=identicon&s=25 Gunnar Wolf (Guest)
on 2009-06-03 23:16
(Received via mailing list)
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 Wolf - gwolf@gwolf.org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF
C98e88f3e69340d27466baadb2b80b4c?d=identicon&s=25 Gunnar Wolf (Guest)
on 2009-06-03 23:29
(Received via mailing list)
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í :-)

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 Wolf - gwolf@gwolf.org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF
D4f69cb8f9f4566c158cce3f482e2028?d=identicon&s=25 David González (Guest)
on 2009-06-04 14:12
(Received via mailing list)
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 Wolf <gwolf@gwolf.org> 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:in `new'
    from (irb):5
    from :0
C98e88f3e69340d27466baadb2b80b4c?d=identicon&s=25 Gunnar Wolf (Guest)
on 2009-06-05 19:04
(Received via mailing list)
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 Wolf - gwolf@gwolf.org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF
D4f69cb8f9f4566c158cce3f482e2028?d=identicon&s=25 David González (Guest)
on 2009-06-06 15:49
(Received via mailing list)
El 5 de junio de 2009 19:03, Gunnar Wolf <gwolf@gwolf.org> 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?
C98e88f3e69340d27466baadb2b80b4c?d=identicon&s=25 Gunnar Wolf (Guest)
on 2009-06-09 01:30
(Received via mailing list)
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 Wolf - gwolf@gwolf.org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF
This topic is locked and can not be replied to.