Permitiendo que el público genere un CSR desde su clave privada

10

Como proveedor de alojamiento, me gustaría que el proceso de generación de un certificado para el dominio de un cliente sea lo más conveniente posible.

Estaba pensando en crear una página web donde cualquiera pudiera:

  • generar una CSR para un nombre de host dado desde nuestra clave privada
  • retire ese CSR y envíenoslo con un certificado

¿Existe algún peligro en permitir que alguien genere potencialmente miles de CSR basadas en nuestra clave privada?

Responder a algunas inquietudes / preguntas:

  

Creo que el verdadero peligro aquí es reutilizar la misma clave privada para muchos dominios.

¿Es realmente diferente (desde un punto de vista de seguridad, no de administración) que tener un solo certificado con muchas SAN? Por ejemplo, el certificado presentado por nuestro CDN de Cloudflare tiene estas SAN:

DNS:ssl2917.cloudflare.com, DNS:*.app.com.pk, DNS:*.boldstatementmarketing.com, DNS:*.lacasadivetro.com, DNS:forospyware.com, DNS:*.reportcrowd.com, DNS:*.vladtv.com, DNS:*.1bse.com, DNS:*.discourse.org, DNS:*.forospyware.com, DNS:*.gossipbrigade.com, DNS:*.gsmcodigos.com, DNS:*.is.gl, DNS:*.madepal.co, DNS:*.mejorando.la, DNS:*.oceanvillageresort.com, DNS:*.pinside.com, DNS:*.ratelossprogram.com, DNS:*.soopermexican.com, DNS:*.tequierocali.org, DNS:1bse.com, DNS:app.com.pk, DNS:boldstatementmarketing.com, DNS:discourse.org, DNS:gossipbrigade.com, DNS:gsmcodigos.com, DNS:is.gl, DNS:lacasadivetro.com, DNS:madepal.co, DNS:mejorando.la, DNS:oceanvillageresort.com, DNS:pinside.com, DNS:ratelossprogram.com, DNS:reportcrowd.com, DNS:soopermexican.com, DNS:tequierocali.org, DNS:vladtv.com
  

¿Hay un escenario realista en el que tendría motivos para creer que la clave de un sitio se filtró, mientras que las claves de los otros sitios permanecen seguras?

En realidad no. Si un cliente que utiliza una de estas claves solicite mover su sitio, no entregaríamos la clave.

  

Debería generar una nueva clave privada para cada CSR que genere.

Bien, deberíamos. Este es un caso de cambio de conveniencia (en nuestro extremo) por seguridad. Para la banca, el infierno no. ¿Sitios del foro? Posiblemente valga la pena.

  

Lo que realmente necesita pensar en su configuración es la integridad de la CSR. Los clientes deben estar absolutamente seguros de que la clave pública en la CSR que han firmado es la clave pública correcta.

Ahora que lo pienso, la mejor opción aquí es probablemente renunciar al requisito de generar un CSR ... podríamos entregar un solo CSR a todos y pedirles que lo firmen con el nombre de host que prefieren (similar a lo que startssl : cuando firma el CSR, tira el nombre de host solicitado y utiliza lo que ingresa en su página web.

No sé si todas las CA (¿alguna?) harán eso, pero es una opción.

    
pregunta MikeyB 19.03.2015 - 22:17
fuente

3 respuestas

11

En teoría, siempre que un sistema fuera lo suficientemente seguro y que solo firmara la CSR en un servidor separado, manteniendo la clave maldita segura, no habría ningún problema con esto.

Sin embargo,

  • ¿Qué sucede en caso de que usted haga de alguna manera tenga comprometida esa clave privada?
  • ¿Cuál es su plan en caso de incumplimiento?
  • ¿Tendrá esa clave privada para su certificado TLS en el mismo servidor que el servidor de firma ?

Pregúntese: ¿hay algún beneficio al usar la misma clave para más de 1000 dominios? ¿Puede explicar el único punto de falla a sus clientes?

Además, RSA (al menos) no tiene ningún ataque conocido actualmente sobre el uso de firmas repetidas que revelaría la clave. Ese es reservado para DSA con un PRNG poco fiable.

Aún así, es una mala idea.

Actualizar

El sistema que desea en este caso sería el siguiente:

  1. Cada cliente es encarcelado (a través de chroot() ) en su propio directorio en el servidor
  2. Para cada CSR generado, se genera una clave privada en la cárcel del usuario, pero fuera de webroot.
    • por ejemplo /jail/customername/private/server.key
    • /jail/customername/domains/<domain>/subdomains/<subdomain>/public
    • /jail/customername/domains/<domain>/public
    • /jail/a/domains/a.com/public/ , etc.
  3. El servidor web debe respetar las cárceles, y los lenguajes de script deben ejecutarse como un usuario que no puede acceder a la carpeta privada en la cárcel de todos los usuarios.

No habría ningún problema con este sistema; Supongo que está ejecutando un sistema host compartido y que desea una manera fácil de generar un CSR para que cada cliente habilite TLS.

De esta manera, tiene una separación correcta y forzada de privilegios para cada cliente y en el caso de que un cliente se vea comprometido (salvo cualquier explotación local de privilegios), el resto de su infraestructura es sólida y puede revocar el certificado TLS. el usuario que fue explotado.

    
respondido por el Amelia 19.03.2015 - 22:38
fuente
3

No hay peligro en crear una gran cantidad de CSR para la misma clave privada, aparte de la reutilización de la propia clave privada.

Una CSR contiene:

  • información de solicitud de certificado (asunto, etc.)
  • la clave pública
  • una firma de lo anterior, usando la clave privada

Hasta donde sé, nunca ha habido un caso en el que la firma repetida con una clave privada haya degradado la seguridad de la clave privada. Si hubiera, todos estaríamos en problemas.

Sin embargo . Reutilizar la misma clave privada para muchos dominios es una idea terrible. Debe generar una nueva clave privada para cada CSR que genere. ¡Tan pronto como empieces a hacer esto, podría haber algún problema! Un atacante podría generar muchas claves privadas y esto, a su vez, reduciría la entropía disponible en su sistema, lo que (hipotéticamente) hace que las claves privadas sean más predecibles.

    
respondido por el Tom van der Woerdt 19.03.2015 - 22:36
fuente
3

Originalmente escribí un comentario con dos posibles problemas antes, y luego me di cuenta de que puede haber uno aún más grande que justifique una respuesta.

Supongamos que existe una vulnerabilidad de día cero (hasta ahora, hipotética) en el servidor web, sistema operativo o en algún otro lugar que permita el acceso de una aplicación PHP a la clave privada. Normalmente, esto solo sería explotable insertando un archivo PHP malicioso. Sería una vulnerabilidad grave, pero solo puede ser explotada de forma remota a través de otras vulnerabilidades que permitan la carga no autorizada de un script PHP.

Si comparte la clave privada, dicha vulnerabilidad se volvería catastrófica. Todo lo que un atacante tendría que hacer es registrarse para obtener una cuenta contigo, cargar la vulnerabilidad de PHP e instantáneamente tendría la clave privada de miles de otros sitios web.

De manera similar, en su escenario, algo como Heartbleed no solo comprometería un sitio, sino que revelaría la clave privada para todos sus clientes a la vez, haciendo que este ya grave problema sea completamente catastrófico.

    
respondido por el Kevin Keane 20.03.2015 - 06:44
fuente

Lea otras preguntas en las etiquetas