¿Puedo usar pines de clave pública con LetsEncrypt?

10

¿Puedo configurar Public-Key-Pins cuando configuro un cronjob para renovar el certificado LetsEncrypt cada 30 días?

Si se renueva el certificado, también se renueva el Public-Key-Pin, ¿verdad?

Bob Ortiz
fuente

Respuestas:

12

Algunas palabras de precaución para comenzar:

  • Sepa lo que está haciendo, si planea implementar HPKP.
  • Si no lo hace bien, o "si suceden cosas malas", que no están bajo su control, podría inutilizar su dominio.
  • Asegúrese de probar su configuración con un dominio que no sea tan importante, o con un tiempo de caché muy corto, como diez segundos, por ejemplo.
  • Piensa en los certificados que te gustaría fijar: raíz, intermedio, hoja ...
  • Piense si tiene sentido fijar otra autoridad de certificación (de respaldo), son certificados intermedios y su certificado hoja.
  • Mejor prevenir que curar: piense si tiene sentido anclar otra CA / cert de respaldo para tener dos.
  • Si estos puntos y preguntas le parecen "nuevos": lea de qué se trata HPKP y las trampas y advertencias comunes, antes de implementar esto.

¿Puedo usar pines de clave pública con LetsEncrypt?

  • Si.

Si se renueva el certificado, también se renueva el Public-Key-Pin, ¿verdad?

  • Esto depende del certificado al que se refiera y de los certificados que fije.
gf_
fuente
9

Haría eco de todo lo que dijo gf_.

Sin embargo, para responder la pregunta, sí puedes.

De forma predeterminada, Let's Encrypt recrea la clave y el certificado en la renovación. Esto dificulta la implementación de HPKP si desea fijar en la hoja, lo que probablemente debería hacer en caso de cambios intermedios ( como lo hizo en marzo de 2016 ).

Entonces, tiene varias opciones en torno a esto si aún desea hacer HPKP:

  1. Use su propia CSR fija en lugar del cliente estándar que crea la CSR para usted cada vez para que la clave de hoja no cambie. Esta publicación de blog explica cómo hacer esto específicamente porque el autor usa HPKP.
  2. Use vencimientos cortos de HPKP y renueve dentro de ese tiempo de vencimiento y cambie la política para tener claves antiguas y nuevas antes de cambiar realmente el certificado, con tiempo suficiente para que cualquier visitante pueda recoger una nueva política.
  3. Fije la raíz Let's Encrypt en lugar de la hoja o el certificado.
Barry Pollard
fuente
1
Buenas adiciones, +1.
gf_
¿Es seguro fijar la raíz? Para un MITM es realmente fácil usar su propio certificado Let's Encrypt.
melbic
2
¿Cómo es "realmente fácil" para un atacante obtener un certificado para su nombre de dominio usando Let's Encrypt? No conozco ninguna forma de hacerlo. Sin embargo, puede ser posible con cualquier CA si tienen errores en sus procedimientos de validación de dominio. Al fijar LE root, ha reducido enormemente su superficie de ataque a Let's Encrypt en comparación con todas las CA del mundo. Todavía no es tan seguro como fijar la hoja, estoy de acuerdo, pero eso introduce sus propios riesgos, por lo que depende de su definición de "seguro".
Barry Pollard
Al decir que creo que existen riesgos MASIVOS para HPKP, principalmente desde una perspectiva de suicidio, no soy fanático. Si decide cambiar CA, o cambios en la ruta del certificado (por ejemplo, debido a la depreciación SHA-256), o si tiene que volver a emitir el certificado urgentemente, o la clave de respaldo se ve comprometida / perdida o la persona que lo configuró se va y la siguiente persona no se da cuenta usan HPKP y / o no lo saben. HPKP tampoco protege contra raíces locales como Superfish. Por lo tanto, para la mayoría de los sitios, HPKP es demasiado complejo y, en mi humilde opinión, no merece la protección adicional por la poca ganancia de seguridad adicional. Pero esa es solo mi opinión.
Barry Pollard
Ok, solo pregunté porque pensé que todos los certificados LE tienen el mismo certificado raíz. Entonces, si fija la raíz a otra persona con otro certificado LE, puede usar un MITM y falsificar su propio certificado. ¿Sabes lo que quiero decir?
melbic
5

Acabo de implementar esto usando el cliente deshidratado con validación dns01. El enlace dns01 es certzure porque nuestro DNS está alojado en Azure.

Editar: cuando hablo de claves privadas, obviamente siempre quiero decir que solo conviertes las partes de la clave pública en pines. Las claves privadas, como su nombre indica, siempre deben permanecer privadas. Vea mi propio gancho para detalles de implementación.


Necesita una renovación de clave privada para que esto sea posible. Es decir, siempre tiene a mano la clave privada actual (llámela A) y la clave privada futura (llámela B), para que pueda agregarlas a sus pines. Entonces, en este punto, sus pines son A y B. Cuando llega el día de la renovación del certificado, la clave privada A se vuelve obsoleta y B se activa. Al mismo tiempo que obtiene una nueva clave privada futura, llámela C. Regenera su lista de pines para que ahora contenga B y C. Así es como se vuelcan sus claves privadas. deshidratado apoya esto ahora .

Además, necesita un gancho que se llama cada vez que renueva sus certificados y, por lo tanto, pasa sobre sus claves privadas. Implementé esto por mi cuenta .

Finalmente, si hago esto bien, debes asegurarte de que:

HPKP age x 2 < days between cert renewals

Por ejemplo, si su edad de HPKP es de 50 días y renueva certificados cada 30 días, un cliente que visitó su sitio el primer día se quedará con las claves privadas A y B, y usted pasará a B y C el día 31. Su el servidor tiene B y C, el cliente tiene A y B, hay una coincidencia incluso en el día 50 y el cliente abre el sitio correctamente.

PERO veamos si la edad de HPKP es de 70 días. Renuevas los certificados cada 30 días, y el cliente visitó tu sitio el primer día, así que nuevamente, solo tiene las claves privadas A y B. Pasaste a B y C el día 31, y pasaste a C y D el día 61 Su servidor tiene C y D, el cliente tiene A y B, no hay coincidencia y el cliente recibe el dedo medio desde el día 61 hasta el día 71, cuando expira su política de HPKP.


Otra opción, probablemente más segura y ciertamente mucho más simple, es usar la misma clave privada cada vez y generar una o varias claves privadas de respaldo, luego codificarlas en su configuración HPKP y terminar con eso.


Sí, es complicado y puede haber advertencias en las que no he pensado, pero a la larga veremos. Obviamente lo implementé en un subdominio acrítico con una corta (15 días) de edad de HPKP para que no cause grandes problemas.


Editar: he escrito algunos scripts para ayudarlo a configurar HPKP con Let's Encrypt y deshidratarlo usando Nginx:

HPKPinx

bviktor
fuente
3
Decidí tener lo mejor de ambos mundos. Rollover automatizado de clave privada + una clave privada estática. Podría escribir una publicación de blog sobre eso si alguien está interesado.
bviktor
1
Si haces esto, edita tu publicación e inserta el enlace. ¡Gracias!
gf_
Gracias, voy a tratar mi mejor para terminar que esta o la próxima semana
bviktor
2
Enlace agregado. La documentación aún es escasa, pero el código está allí para que pueda probarlo y piratearlo.
bviktor