ruby on rails - rails - ¿Cómo apoyo la autenticación SSL Client Certificate?
nginx ruby on rails (5)
Quiero hacer lo que hace myopenid: una vez que haya iniciado sesión, puede hacer clic en un botón que le genere un certificado SSL; el navegador luego descarga este certificado y lo almacena. Cuando más tarde regresa a yourid.myopenid.com, su navegador puede usar su certificado almacenado para autenticación, por lo que nunca necesitará una contraseña.
¿Entonces mis preguntas son lo que se requiere para que esto funcione? ¿Cómo puedo generar certificados? ¿Cómo los valido una vez que se me presentan de nuevo?
Mi stack es Rails en Apache usando Passenger, pero no soy muy particular.
Depende del servidor, pero la solución más simple que conozco, usando Apache:
"Cuando esta opción está habilitada, el nombre distinguido del sujeto (DN) del certificado del cliente X509 se traduce a un nombre de usuario de autorización básica HTTP. Esto significa que los métodos de autenticación estándar de Apache se pueden usar para el control de acceso. del certificado X509 del cliente (puede determinarse ejecutando el comando openssl x509 de OpenSSL: openssl x509 -noout -subject -in certificate.crt). Tenga en cuenta que no se obtiene contraseña del usuario ... "
No estoy seguro acerca de los rieles, pero la variable de entorno REMOTE_USER habitual debe estar accesible de alguna manera.
Estos se conocen generalmente como certificados del lado del cliente.
Realmente no lo he usado, pero aquí se puede encontrar una versión modificada de la autenticación restful que se parece a lo que buscas.
Lo encontré a través de la publicación del Dr. Nic
He estado trabajando en una solución a este problema. Quería hacer lo mismo y sé que muchos otros propietarios de sitios web quieren esta característica, con o sin un proveedor externo.
Creé la configuración necesaria del servidor y un complemento de Firefox para manejar la autenticación basada en certificados. Vaya a mypassfree.com para obtener el complemento gratuito de Firefox. Envíeme un correo electrónico (enlace en esa página) para la configuración del servidor, ya que aún no lo he empaquetado con un buen instalador.
La configuración del servidor es Apache2 + OpenSSL + Perl (pero podría reescribir los scripts Perl en cualquier idioma)
Jonathan
Puede generar un certificado en el navegador del cliente utilizando un código específico del navegador. Ver esta pregunta
También puede generar certificaciones de clientes SSL en el servidor usando OpenSSL en Ruby ( vea esto q ). (Esto funcionará en cualquier navegador sin código específico del navegador, pero su servidor habrá generado la clave privada del cliente, que no es ideal para los puristas de la criptografía).
Cualquiera que sea el método que use para generarlos, necesitará configurar su servidor web para requerir los certificados del cliente. Vea los documentos de Apache para un ejemplo.
Si desea generar certificados, debe hacer que el cliente genere un par de claves y enviarle al menos la clave pública. Puedes hacer esto en Firefox a través de una llamada de Javascript, es crypto.generateCRMFRequest . Supongo que hay métodos específicos del navegador disponibles en otros navegadores también. Pero primero, debe averiguar cómo emitir un certificado una vez que obtiene una clave pública.
Puede escribir algo en el servidor con OpenSSL, pero tiene soporte integrado para CSR, no el formato CRMF que Firefox le enviará. Entonces necesitarías escribir un código para convertir el CRMF a CSR, lo que requerirá algún tipo de capacidad de procesamiento DER ... Solo estoy rascando la superficie aquí-operar una CA, incluso para una aplicación de juguete, no es trivial.
Las soluciones SSO como las soluciones OpenId y PKI se superponen, y hay una elegancia en PKI. Pero el diablo está en los detalles, y hay buenas razones por las cuales este enfoque ha existido por mucho tiempo, pero solo ha despegado en aplicaciones gubernamentales y militares.
Si está interesado en continuar con esto, realice un seguimiento con algunas preguntas específicas de la plataforma en la que le gustaría desarrollar su servicio de CA.