¿La introducción de certificados de cliente para una aplicación móvil mejoraría la seguridad?

4

He desarrollado una API REST que se ha configurado para funcionar solo a través de HTTPS. El único propósito de esta API (al menos por el momento) es operar como el punto de entrada de back-end para una aplicación móvil.

He lanzado mi propio protocolo de autenticación de token ( vea esta pregunta / respuestas ) que se utiliza para la autenticación del cliente. La razón principal detrás de esto fue poder generar tokens seguros / reutilizables que el cliente podría almacenar localmente & reutilizar en las solicitudes posteriores. Como tengo control sobre estos tokens del lado del servidor, tengo la capacidad de expirar / invalidar forzando al cliente a volver a autenticarse (es decir, generar un nuevo token) y también estoy tomando precauciones para evitar ataques como MitM / Replay. Para que esto funcione, tiene que pasar cierta información confidencial a través del cable en texto plano, sin embargo, todo se está ejecutando en SSL, por lo que AFAIK no hay nada de qué preocuparse aquí (?).

Hay un par de partes de esta configuración actual que sí me preocupan:

  1. Para la autenticación del servidor, cuando la aplicación recibe el certificado del servidor (autofirmado) solo estoy comprobando si el asunto del certificado (por ejemplo, CN = nombre de dominio) es el mismo que la dirección API, es decir, si el punto de entrada de la API es api.mydomain.com, entonces debe recibir un certificado con un asunto CN = api.mydomain.com de lo contrario, la sesión de SSL fallará.

  2. No hay protección desde el punto de vista del servidor contra solicitudes anónimas. La autenticación del cliente solo ocurre en el punto donde se inspecciona la información del encabezado / publicación. Creo que esto podría dejar la puerta abierta a los ataques de Dos. Lo ideal sería que el servidor solo acepte solicitudes que provengan de una fuente conocida .

Mi preocupación con el primer problema es que es demasiado fácil de eludir, la dirección de la API es configurable desde la configuración de la aplicación & cualquier persona puede generar un certificado autofirmado, por lo que sería bastante trivial engañar a la aplicación para que piense que está hablando con el servidor correcto. Sin embargo, el segundo problema es más una preocupación general. Sin embargo, si pudiera filtrar cualquier solicitud de cliente no autenticada, ¡sería una ventaja!

Lo único que viene a la mente a resolver (al menos el segundo problema) es presentar certificados de cliente. Mi preocupación con esto es el tiempo de implementación, la complejidad de la implementación y la administración de los certificados en sí mismos. Supongo que lo que estoy buscando es un consejo sobre si (según la configuración actual) la introducción de certificados de cliente en el dispositivo obtendría algo aquí?

    
pregunta James 24.03.2013 - 13:41
fuente

1 respuesta

2

Autenticación se trata de asegurarse de que quien esté al otro lado de la conexión sea quien creas que es. Dado que se trata de criptografía, computadoras y redes, "quién eres" equivale a "lo que puedes calcular" (eso es todo lo que puedes observar desde un servidor remoto), que a su vez proviene de "lo que sabes" (todos pueden comprar una PC, por lo que la capacidad de calcular cualquier cosa es realmente el conocimiento de las entradas para los cálculos). Por ejemplo, para la autenticación basada en contraseña, un usuario se autentica en relación con su conocimiento de la contraseña.

Este conocimiento está vinculado a un registro inicial en el que el valor secreto, sea el que sea, adquiere un significado especial. Aún para el ejemplo de contraseña, este es el procedimiento por el cual el usuario elige su contraseña y el servidor la registra (o un hash de la misma) en sus entrañas.

Los

Certificados son útiles en contextos donde registro y autenticación se llevan a cabo por entidades distintas: el registro se realiza por una Autoridad de Certificación , quien emite (firma) el certificado del cliente, mientras que la verificación la realiza el propio servidor, quien valida el certificado (verifica la firma de la AC) y luego verifica una nueva firma calculada por el cliente (así es como los certificados del cliente se utilizan en SSL).

Si solo tiene un servidor, quien decide quién puede conectarse y luego autentica a estos clientes, entonces los certificados de cliente no le servirán de nada: no brindarán ninguna funcionalidad o seguridad adicional con respecto a una demostración más simple. protocolo de contraseña (siempre que la "contraseña" sea una clave con suficiente entropía y el protocolo se reproduzca dentro de SSL).

    
respondido por el Thomas Pornin 24.03.2013 - 14:55
fuente

Lea otras preguntas en las etiquetas