2008-08-26 21 views
9

Deseo 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.¿Cómo apoyo la autenticación del certificado de cliente SSL?

Así que mis preguntas son ¿qué se requiere para que esto funcione? ¿Cómo puedo generar certificados? ¿Cómo los valido una vez que se me presentan de nuevo?

Mi pila es Rails en Apache usando Passenger, pero no soy demasiado particular.

Respuesta

8

Normalmente se conocen como certificados del lado del cliente.

No lo he usado, pero una versión modificada de la autenticación restful se puede encontrar aquí here que se parece a lo que buscas.

me encontré por Dr. Nic's post

2

Depende del servidor, pero la solución más simple yo sepa, usando Apache:

FakeBasicAuth

"Cuando esta opción está activada, el 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. El nombre de usuario es solo el Asunto 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 hay ninguna contraseña se obtiene del usuario ... "

No estoy seguro sobre rieles, pero la variable de entorno REMOTE_USER habitual debe ser accesible de alguna manera.

1

Si desea generar certificados, es necesario hacer que el cliente genere un par de claves y enviarle al menos la clave pública. Puede hacerlo en Firefox a través de una llamada de Javascript, es crypto.generateCRMFRequest. Supongo que también hay otros métodos disponibles en otros navegadores. primero, necesita 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á. Por lo tanto, necesitaría escribir algún código para convertir el CRMF a CSR, lo que requerirá algún tipo de capacidad de procesamiento DER & hellip; Estoy arañando 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 le interesa seguir con esto, siga con algunas preguntas específicas de la plataforma en la que le gustaría desarrollar su servicio de CA.

+0

En su lugar, puede usar el elemento keygen, http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#the-keygen-element – hendry

0

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.

configuración

Server es Apache 2 + OpenSSL + Perl (pero se puede reescribir los scripts de Perl en cualquier idioma)

Jonathan

0

Puede generar un certificado en el navegador del cliente utilizando el código específico del navegador. Consulte this question

También puede generar certificados de cliente SSL en el servidor utilizando OpenSSL en Ruby (see this 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 cifrado.)

Cualquiera que sea el método que use para generarlos, necesitará entonces configure su servidor web para requerir los certificados del cliente. Ver the Apache docs para un ejemplo.

+0

generación de CSR (o equivalente) funciona en la mayoría de navegadores populares (IE, FF, Chrome, ...), pero el código tiende a ser específico del navegador. Ver esta respuesta: http://stackoverflow.com/a/9198400/372643 – Bruno

+0

Gran respuesta, Bruno - Creo que es una mejor respuesta a esta q que cualquiera actualmente aquí :-) – Rich

Cuestiones relacionadas