2 votos

¿Cómo hacer que Chrome (u otro navegador) presente un certificado de cliente TLS?

He configurado un servidor que acepta conexiones HTTPS con un certificado de CA personalizado. Lo he instalado en mi Samsung Galaxy A50, y ahora puedo acceder al servidor sin avisos en Chrome. Ahora, me gustaría limitar el acceso a clientes autenticados con mTLS, donde envían certificados de cliente.

Hasta ahora, funciona correctamente en navegadores de escritorio, rechazando la conexión TLS cuando no se proporciona un certificado de cliente. Ahora necesito acceder a esto en el teléfono Android.

Suelo usar Firefox en ese teléfono, pero Firefox aún no admite certificados de cliente. Sin embargo, Chrome sí: cuando accedo a https://certauth.idrix.fr con el certificado de cliente instalado, aparece el popup de elección de certificado. Sin embargo, no lo hace para mi servidor: en su lugar, muestra un ERR_BAD_SSL_CLIENT_AUTH_CERT (EL SITIO WEB no aceptó su certificado de inicio de sesión, o es posible que no se haya proporcionado. Intente contactar al administrador del sistema.), y no me pide que seleccione el certificado.

De mis pruebas, el problema no parece ser específico de mi servidor: lo mismo sucede con configuraciones de mTLS para Nginx, Apache HTTPd y Traefik. Sin embargo, el servidor https://certauth.idrix.fr es de alguna manera especial, porque el mTLS funciona para él.

¿Cómo hago que Chrome muestre este popup? Si no puedo hacerlo, ¿qué otros navegadores admiten certificados de cliente? (Parece que muy pocos lo hacen).

4voto

Danya02 Puntos 141

Resulta que cuando un servidor TLS solicita un certificado, envía una lista de autoridades de certificación de las que aceptará un certificado. Los navegadores de escritorio ignoran esa lista o resuelven los certificados de cliente disponibles hasta la root. Sin embargo, en Android, el menú desplegable se filtra por esta lista de certificados aceptados por el servidor. Es crucial que el certificado que se esté referenciando (es decir, confiado directamente) por el servidor debe estar incluido en el paquete .p12 en el Android.

En mi caso, estaba gestionando mi CA con step-cli. Cuando generaba un certificado, en el archivo de salida, solo incluía el certificado hoja y el certificado de la CA intermedia, no el de la CA root. Por lo tanto, al empaquetarlo en un archivo .p12 para importarlo en Android, Android no conocía el certificado root, por lo que no podía determinar que el certificado que tenía disponible podría funcionar con el servidor.

Aquí están las posibles soluciones a este problema:

  1. Hacer que el servidor acepte todos los certificados y verificarlos más tarde: En nginx, existe la opción ssl_verify_client optional_no_ca. Esto envía una solicitud de certificado, pero establece la conexión incluso si no se proporcionó, y no verifica el certificado. Luego, la aplicación puede configurarse para obtener el certificado de una cabecera de proxy y verificarlo manualmente. Esto permite al usuario elegir cualquiera de los certificados que tiene en el archivo, lo cual es malo para la experiencia de usuario ya que le permite elegir el incorrecto.
  2. Agregar la CA intermedia a la lista de verificación en el servidor: al hacer esto, se agrega la firma de la CA intermedia a la lista de CAs aceptadas por el servidor durante el handshake, lo que permitirá a Android presentar el certificado porque el paquete contiene la CA a la que se hace referencia en la solicitud de certificado. Sin embargo, esto significa que revocar la CA intermedia tendrá que hacerse desconfiando manualmente en el servidor.
  3. ¡(¡Mejor opción!) Al crear un paquete de certificado .p12 para importarlo en Android, asegúrese de que el archivo .crt contenga el certificado de la CA root. Entonces, Android volverá a saber que este certificado es el que realmente desea el servidor.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X