Situation
Tenemos una aplicación web de una sola página que le permite al usuario arrastrar y soltar su certificado y clave privada en ella. Estos se utilizan para autenticar en el servicio web.
Aunque los navegadores pueden realizar un protocolo de enlace TLS que incluye la autenticación del cliente a través de HTTPS, solo usan los certificados instalados en el almacén de certificados del sistema operativo (por ejemplo, Chrome en macOS o MS Edge en Windows) o en el almacén de certificados del navegador (por ejemplo, Firefox) .
Sin embargo, no hay forma de suministrar un certificado / clave privada a las API de solicitud proporcionadas por el navegador según lo estandarizado por el W3C. (Por ejemplo, fetch () solo permite especificar si se deben incluir las credenciales instaladas o no.)
Pregunta
¿Es razonable implementar algún tipo de adda; ¿El servicio "TLS bridging" en nuestra situación?
Esto funcionaría de la siguiente manera:
- El servicio de puente acepta el certificado por parte del cliente (por ejemplo, a través de HTTP),
- ... inicia de forma síncrona un protocolo de enlace con el servicio de autenticación de cliente real
- ... y responde transmitiendo el desafío de TLS al cliente.
- El cliente puede resolver el desafío con la clave privada eliminada y enviarla de vuelta mediante una solicitud HTTP adicional
- El servicio de puente puede responder al resultado del protocolo de enlace / solicitud (por ejemplo, el token de autenticación)
ACTUALIZACIÓN 1:
Controles
Las siguientes restricciones técnicas están establecidas por ahora:
- solución solo para JS en la aplicación web (por ejemplo, sin Flash)
- La clave privada del cliente no debe transmitirse a ningún servidor
- La instalación manual del certificado en el sistema operativo / navegador no debe ser necesaria.
ACTUALIZACIÓN 2:
Desde el 20 de marzo de 2018, el W3C enumera el Estándar de autenticación web como "Recomendación del candidato" que resolvería problema descrito al ofrecer API estandarizada para realizar la autenticación del cliente. Los MDN docs también son bastante informativos sobre el uso de esa API en el estado actual.