Entiendo PKI razonablemente bien desde un punto de vista conceptual, es decir, claves privadas / claves públicas, las matemáticas detrás de ellas, el uso de hash y cifrado para firmar un certificado, la firma digital de transacciones o documentos, etc. También he trabajado en proyectos donde openssl Las bibliotecas C se utilizaron con certs para asegurar la comunicación y la autenticación. También estoy extremadamente familiarizado con las herramientas de línea de comandos de openssl.
Sin embargo, tengo muy poca experiencia con proyectos habilitados para PKI basados en web y, por lo tanto, estoy tratando de diseñar y codificar un proyecto personal para comprenderlo mejor.
Los requisitos
Este es el sitio web de un banco. Todos los usuarios de la Banca por Internet pueden usar cualquier certificado emitido por algunas CA conocidas (verisign, Thawte, confían, etc.). El Banco no es responsable de obtener certificados para el usuario. Estos certificados se utilizarán para la autenticación en el sitio web del banco. Las plataformas / SO, etc., aún no están reparadas.
Diseño
Me preguntaba cuál es la mejor manera de hacer la autenticación.
Vi que Apache tiene una forma de habilitar ssl de 2 vías; en este caso, creo que navegar al sitio web solicitaría automáticamente un certificado al usuario. Pero no estoy seguro de si esto es suficiente porque parece que todo lo que verifica es si un certificado está firmado por una CA confiable y también puede ser si está en una lista blanca de líneas de asunto de los certificados, etc. Pero esto no es suficiente para un caso bancario porque necesita poder asociar un ID de usuario bancario con un certificado.
IIS parece tener una manera por la cual puedo tener un certificado almacenado para cada usuario en Active Directory. Esto es lo que entendí al leer algunos artículos de MSDN. Active el SSL de 2 vías en IIS y luego, cuando el usuario intente navegar al sitio web, IIS enviará una solicitud al navegador con una lista de CA aprobadas y el navegador permitirá que el usuario elija un certificado apropiado de su almacén de certificados y lo envíe para backend. Supongo que IIS hará 2 cosas
- Asegúrese de que el usuario tenga la clave privada correspondiente al certificado (según las negociaciones de la cubierta)
- Según el mapeo AD User-Cert, IIS informará el nombre de usuario a la aplicación.
Realice la autenticación explícitamente llamando a funciones criptográficas en lugar de depender del servidor web que lo haga.
- Muestre una pantalla de usuario donde carga un certificado y la aplicación garantiza que el usuario tenga la clave privada correspondiente al certificado (pidiéndole al front-end que firme alguna cadena usando el certificado).
- La aplicación tiene una base de datos que almacena algunos datos, lo que permite que cada usuario se asigne a su ID de usuario. Esto podría ser
- el certificado completo correspondiente a cada ID de usuario
- La CA y el número de serie del certificado correspondiente a cada ID de usuario.
Me preguntaba cuál es el método comúnmente utilizado? ¿Cuáles son las mejores prácticas? Si debo ir con el # 3, ¿cuáles son las mejores formas de hacer esto?
Algo que también puede funcionar fácilmente con aplicaciones de teléfonos inteligentes será una ventaja adicional.
Actualizar
Permítanme aclarar mi afirmación "codifique la parte de autenticación yo mismo" porque algunas de las respuestas parecen indicar que se ha entendido mal, lo que es malo por no ser claro.
Esto no significa que yo mismo escriba cosas criptográficas. Simplemente significa que en realidad llamaré explícitamente a las rutinas criptográficas en lugar de depender de IIS o cualquier otro servidor web lo hará implícitamente.