Obsoleto
Esta función ya no se recomienda. Aunque es posible que algunos navegadores aún lo admitan, es posible que ya se haya eliminado de los estándares web relevantes, que esté en proceso de ser eliminado o que solo se conserve por motivos de compatibilidad. Evite usarlo y actualice el código existente si es posible; consulte la tabla de compatibilidad al final de esta página para guiar su decisión. Tenga en cuenta que esta función puede dejar de funcionar en cualquier momento.

Nota: El mecanismo de fijación de clave pública quedó obsoleto en favor de Transparencia del certificado y Expect-CT encabezamiento.

Fijación de claves públicas HTTP (HPKP) era una característica de seguridad que solía decirle a un cliente web que asocie una clave pública criptográfica específica con un determinado servidor web para disminuir el riesgo de MITM ataques con certificados falsificados. Se ha eliminado en los navegadores modernos y ya no es compatible.

Para garantizar la autenticidad de la clave pública de un servidor utilizada en TLS sesiones, esta clave pública está envuelta en un certificado X.509 que generalmente está firmado por una autoridad de certificación (California). Los clientes web, como los navegadores, confían en muchas de estas CA, que pueden crear certificados para nombres de dominio arbitrarios. Si un atacante puede comprometer una sola CA, puede realizar ataques MITM en varias conexiones TLS. HPKP puede eludir esta amenaza para el HTTPS protocolo diciéndole al cliente qué clave pública pertenece a un determinado servidor web.

HPKP es un Confíe en el primer uso (TOFU) técnica. La primera vez que un servidor web le dice a un cliente a través de un encabezado HTTP especial qué claves públicas le pertenecen, el cliente almacena esta información durante un período de tiempo determinado. Cuando el cliente vuelve a visitar el servidor, espera que al menos un certificado de la cadena de certificados contenga una clave pública cuya huella digital ya se conoce a través de HPKP. Si el servidor entrega una clave pública desconocida, el cliente debe presentar una advertencia al usuario.

Firefox y Chrome deshabilitar la validación de pin para hosts anclados cuya cadena de certificados validados termina en un ancla de confianza definida por el usuario (en lugar de un ancla de confianza incorporada). Esto significa que para los usuarios que importaron certificados raíz personalizados, se ignoran todas las infracciones de anclaje.

Habilitando HPKP

Para habilitar esta función en su sitio, debe devolver el Public-Key-Pins Encabezado HTTP cuando se accede a su sitio a través de HTTPS:

Public-Key-Pins: pin-sha256="base64=="; max-age=expireTime [; includeSubDomains][; report-uri="reportURI"]
pin-sha256
La cadena entre comillas está codificada en Base64 Información de clave pública del sujeto (SPKI) huella dactilar. Es posible especificar varios pines para diferentes claves públicas. Algunos navegadores pueden permitir otros algoritmos hash distintos a SHA-256 en el futuro. Vea a continuación cómo extraer esta información de un certificado o archivo de clave.
max-age
El tiempo, en segundos, que el navegador debe recordar que solo se puede acceder a este sitio mediante una de las claves definidas.
includeSubDomainsOpcional
Si se especifica este parámetro opcional, esta regla también se aplica a todos los subdominios del sitio.
report-uriOpcional
Si se especifica este parámetro opcional, las fallas de validación de pines se informan a la URL proporcionada.

Nota: La especificación actual requiere incluir un segundo pin para una clave de respaldo que aún no se usa en producción. Esto permite cambiar la clave pública del servidor sin romper la accesibilidad para los clientes que ya han anotado los pines. Esto es importante, por ejemplo, cuando la clave anterior se ve comprometida.

Extracción de la información de clave pública codificada en Base64

Nota: Si bien el siguiente ejemplo muestra cómo establecer un pin en un certificado de servidor, se recomienda colocar el pin en el certificado intermedio de la CA que emitió el certificado de servidor, para facilitar las renovaciones y rotaciones de certificados.

Primero debe extraer la información de la clave pública de su certificado o archivo de clave y codificarlos usando Base64.

Los siguientes comandos lo ayudarán a extraer la información codificada en Base64 de un archivo de clave, una solicitud de firma de certificado o un certificado.

openssl rsa -in my-rsa-key-file.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
openssl ec -in my-ecc-key-file.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
openssl req -in my-signing-request.csr -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
openssl x509 -in my-certificate.crt -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

El siguiente comando extraerá la información codificada en Base64 para un sitio web.

openssl s_client -servername www.example.com -connect www.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

Ejemplo de encabezado HPKP

Public-Key-Pins: 
  pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="; 
  pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="; 
  max-age=5184000; includeSubDomains; 
  report-uri="https://www.example.org/hpkp-report"

En este ejemplo, pin-sha256 = “cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2 + soZS7sWs =” fija la clave pública del servidor utilizada en producción. La segunda declaración de pin pin-sha256 = “M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE =” también fija la clave de respaldo. edad máxima = 5184000 le dice al cliente que almacene esta información durante dos meses, que es un límite de tiempo razonable según el IETF RFC. Esta fijación de clave también es válida para todos los subdominios, que se indica en el includeSubDomains declaración. Finalmente, report-uri = “https://www.example.net/hpkp-report” explica dónde informar las fallas de validación de pines.

Encabezado de solo informe

En lugar de usar un Public-Key-Pins encabezado también puede usar un Public-Key-Pins-Report-Only encabezamiento. Este encabezado solo envía informes al report-uri especificado en el encabezado y aún permite que los navegadores se conecten al servidor web incluso si se viola la fijación.

Configuración de su servidor web para incluir el encabezado HPKP

Los pasos concretos necesarios para entregar el encabezado HPKP dependen del servidor web que utilice.

Nota: Estos ejemplos utilizan una edad máxima de dos meses e incluyen todos los subdominios. Se recomienda verificar que esta configuración funcione para su servidor.

¡HPKP tiene el potencial de bloquear a los usuarios durante mucho tiempo si se usa incorrectamente! Se recomienda el uso de certificados de respaldo y / o anclar el certificado de CA.

apache

Agregar una línea similar a la siguiente a la configuración de su servidor web habilitará HPKP en su Apache. Esto requiere mod_headers activado.

Header always set Public-Key-Pins "pin-sha256="base64+primary=="; pin-sha256="base64+backup=="; max-age=5184000; includeSubDomains"

Nginx

Añadiendo la siguiente línea e insertando el apropiado pin-sha256="..." Los valores habilitarán HPKP en su nginx. Esto requiere ngx_http_headers_module.

add_header Public-Key-Pins 'pin-sha256="base64+primary=="; pin-sha256="base64+backup=="; max-age=5184000; includeSubDomains' always;

Lighttpd

La siguiente línea con su información clave relevante (pin-sha256 = campos “…”) habilitará HPKP en lighttpd.

setenv.add-response-header  = ( "Public-Key-Pins" => "pin-sha256="base64+primary=="; pin-sha256="base64+backup=="; max-age=5184000; includeSubDomains")

Nota: Esto requiere el mod_setenv server.module cargado que puede ser incluido por lo siguiente si aún no está cargado.

server.modules += ( "mod_setenv" )

IIS

Agregue la siguiente línea al archivo Web.config para enviar el Public-Key-Pins encabezamiento:

<system.webServer>
  ...

  <httpProtocol><customHeaders><addname="Public-Key-Pins"value="pin-sha256="base64+primary=="; pin-sha256="base64+backup=="; max-age=5184000; includeSubDomains"/>customHeaders>httpProtocol>

  ...
system.webServer>

Especificaciones

Especificación Título
RFC 7469, sección 2.1: Claves públicas Extensión de fijación de clave pública para HTTP

Compatibilidad del navegadorActualizar datos de compatibilidad en GitHub

Escritorio
Cromo Borde Firefox explorador de Internet Ópera Safari
Public-Key-Pins ? – 72 No 35 – 72

35 – 72
72Discapacitado
Deshabilitado a partir de la versión 72: esta función está detrás del security.cert_pinning.hpkp.enabled preferencia (debe establecerse en true). Para cambiar las preferencias en Firefox, visite about: config.
No ? – 60 No
report-uri 46 – 72 No No

No
Ver error 1091176.
No 33 – 60 No
Móvil
Vista web de Android Chrome para Android Firefox para Android Opera para Android Safari en iOS Internet de Samsung
Public-Key-Pins No ? – 72 35 ? – 51 No ? – 11,0
report-uri No ? – 72 No 33 – 51 No ? – 11,0

Ver también

  • Public-Key-Pins
  • Public-Key-Pins-Report-Only
  • Sitio de prueba del navegador: Prueba HSTS y HPKP
  • Expect-CT

© 2005–2020 Mozilla y colaboradores individuales.
Con licencia de Creative Commons Attribution-ShareAlike License v2.5 o posterior.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Public_Key_Pinning