Lanzamiento de la fijación de claves públicas con los informes de HPKP

El uso de SSL en tu sitio es una forma importante de preservar la seguridad y la privacidad de tus usuarios. Sin embargo, habilitar SSL no es el final de la historia: hay muchos pasos que puedes seguir para mejorar aún más la seguridad que proporciona tu sitio, desde configurar el atributo Secure en tus cookies hasta activar la Seguridad de Transporte Estricta (HSTS) de HTTP o usar la política de seguridad del contenido para bloquear los privilegios de tu sitio. Sin embargo, a veces, implementar estas funciones potentes puede ser complicado. Para ayudarte a implementar una forma más estricta de SSL, Chrome 46 incluye una función llamada informes HPKP.

¿Qué significan todas estas siglas?

Actualmente, la seguridad en la Web se basa en certificados SSL: firmas criptográficas que demuestran que un sitio web es quien dice ser. Cuando tu navegador envía una solicitud a una URL como https://developers.google.com, el servidor proporciona un certificado SSL y, si es válido, el navegador permite que la solicitud continúe y muestra la URL del sitio web con un candado verde en la barra de direcciones.

Pero, ¿qué es un certificado válido? Para que se considere válido, un certificado debe estar firmado por una AC o por otro certificado firmado por una AC (conocida como AC intermedia). Los navegadores y los sistemas operativos se entregan con una lista de varios cientos de AC de confianza para emitir certificados. Sin embargo, el problema es que, de forma predeterminada, cualquiera de estas AC puede emitir certificados para cualquier sitio web. Si alguno de ellos está comprometido o funciona de forma incorrecta, eso podría ser devastador para toda la Web.

Ingresa la fijación de claves públicas de HTTP o HPKP. Este estándar permite que los sitios web envíen un encabezado HTTP que le indique al navegador que recuerde (o “fije”) partes de su cadena de certificados SSL. Luego, el navegador rechazará las conexiones posteriores que no coincidan con los pines que recibió anteriormente. Este es un ejemplo de un encabezado de HPKP:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

Este encabezado especifica dos hashes de certificados como pines. Uno es un hash de un certificado en la cadena de certificados del sitio y el otro es un PIN de respaldo o un hash de un certificado que el sitio puede usar en caso de que necesite rotar su certificado. El encabezado también incluye un valor max-age. Después de que transcurra esa cantidad de segundos, el navegador olvidará el pin.

Para obtener más información sobre HPKP en general, consulta la especificación o la excelente entrada de blog de Chris Palmer, otro desarrollador de Chrome.

¿Debo activar HPKP ahora?

No necesariamente. Cuando implementas HPKP, es muy fácil cometer un error y realizar un ataque DoS en tu sitio por accidente. Si fijas tu sitio a un conjunto de certificados y, luego, tienes que implementar uno nuevo, los usuarios que vieron el pin no podrán acceder a tu sitio hasta que venza (según el valor de max-age en el encabezado).

Debido a que es difícil hacerlo correctamente, en la actualidad, la HPKP es utilizada principalmente por algunos sitios de alto perfil y sensibles a la seguridad. Si decides activar HPKP, deberías comenzar con un valor de max-age muy corto y aumentarlo gradualmente si no tienes ningún problema.

¿Qué son los informes de HPKP y cómo ayudan?

Los informes de HPKP, que se envían en Chrome 46, son una función que puedes usar para detectar configuraciones incorrectas mientras implementas HPKP.

Primero, puedes comenzar por enviar el encabezado Public-Key-Pins-Report-Only en lugar del encabezado Public-Key-Pins:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

Cuando tu sitio envíe un encabezado de este tipo, Chrome verificará si la conexión actual coincide con los pines y, de no ser así, enviará un informe a report-uri. Chrome nunca bloqueará las solicitudes según los pines de un encabezado de solo informe, por lo que esta es una forma segura de probar HPKP y ver si causa problemas a tus usuarios sin correr el riesgo de que se DoS tu sitio.

Ten en cuenta que un encabezado de solo informe solo se aplica a la solicitud en la que se recibe. El navegador no recuerda los pines solo para informes como lo hace con los pines reales. Esto te permite probar tu configuración sin preocuparte por almacenar en caché valores incorrectos en los navegadores de los usuarios, y puedes realizar el lanzamiento de forma incremental (por ejemplo, solo en un solo recurso) para evitar que se inunde tu servidor con informes.

Cuando lances el encabezado Public-Key-Pins real para comenzar a aplicar tus pines, también puedes incluir un valor de report-uri en ese encabezado para que sigas recibiendo informes si se produce algún problema.

¿Qué se incluye en un informe de incumplimiento de HPKP?

Un informe de incumplimiento de HPKP es un mensaje JSON que se envía en una solicitud HTTP POST a tu report-uri configurado. La lista de campos se encuentra en la especificación, pero destacaré dos de ellos aquí: served-certificate-chain y validated-certificate-chain. served-certificate-chain es el certificado exactamente como Chrome lo recibió cuando configuró la conexión SSL para la solicitud. Por otro lado, validated-certificate-chain es la cadena que Chrome volvió a compilar cuando intentó validar el certificado del servidor, que, sorprendentemente, puede ser diferente de served-certificate-chain. Los diferentes clientes realizan la validación de certificados de diferentes maneras, y esto puede ser una causa común de parámetros de configuración incorrectos de HPKP. Asegúrate de revisar este campo si recibes informes inesperados.

Un último "problema"

Si implementas informes de HPKP, recuerda que Chrome realiza la validación de pines para todas las solicitudes, incluidas las de envío de informes. Por lo tanto, si implementaste HPKP para tu sitio, es probable que desees enviar informes de HPKP a un dominio diferente que no hayas fijado. De lo contrario, un incumplimiento de pines en tu sitio activará un informe en el mismo dominio, que también fallará en el incumplimiento de pines, por lo que no recibirás el informe.

Si no tienes otro dominio a mano, puedes probar un servicio como report-uri.io, que controla los informes de incumplimiento por ti.