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(‘Yahoo’).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. - [email protected] - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF