¿Cómo debo almacenar las claves SSL en el servidor?

21

Tengo un servidor web Node.JS HTTPS instanciado de la siguiente manera:

var privateKey = fs.readFileSync('./../ssl/localhost.key').toString();
var certificate = fs.readFileSync('./../ssl/localhost.crt').toString();

https.createServer({
    key: privateKey,
    cert: certificate
}, server).listen(80, 'localhost');

Mi clave privada está en mi servidor que Node.JS lee para crear el servidor web HTTPS. Si un pirata informático tiene acceso de lectura a los archivos del servidor, puede acceder a la clave privada y hacerse pasar por el servidor web.

¿Debe almacenarse la clave privada en el servidor? ¿Debería ser destruido una vez que el servidor HTTPS haya sido instanciado?

    
pregunta Randomblue 11.01.2013 - 20:33
fuente

2 respuestas

22

No desea destruir su clave privada: la necesitará de nuevo si el servidor se reinicia. Los reinicios ocurren a veces ...

Esa es una observación genérica: usted quiere que su servidor pueda reiniciarse de manera desatendida. Por lo tanto, debe contener la clave privada, y esa clave privada debe estar disponible para el software del servidor.

Si un atacante secuestra su máquina completa, obtiene una copia de su clave. Eso es un hecho de la vida. Vive con ello. Sin embargo, hay mitigaciones:

  • Puede usar los conjuntos de cifrado "DHE" para SSL. Con estas suites de cifrado, la clave del servidor se utiliza para las firmas, no para el cifrado. Esto significa que el atacante que roba su clave puede, posteriormente, suplantar su servidor (es decir, ejecutar un servidor falso), pero no descifrar las sesiones SSL que registró anteriormente. Esta es una buena propiedad conocida como Perfect Forward Secrecy .

  • Si almacena la clave en un Hardware Security Module , no se robará la clave. El atacante puede jugar con la clave siempre que tenga un control efectivo del servidor, pero no la extraiga. Esto disminuye su poder de molestia (pero los HSM son caros).

En la práctica, solo se asegurará de que el archivo que contiene la clave privada sea legible solo para la cuenta del sistema que ejecuta el servidor ( chown y chmod en sistemas similares a Unix, derechos de acceso NTFS en Windows).

    
respondido por el Thomas Pornin 11.01.2013 - 20:46
fuente
2

Probablemente está buscando un proxy inverso como nginx. Se considera la mejor práctica ™.

  

Las aplicaciones que se ejecutan en producción generalmente necesitan ejecutarse en el puerto 80 (HTTP), el puerto 443 (HTTPS), o ambos. Esto puede ser un desafío si varios componentes de su aplicación interactúan con el usuario o si está utilizando un servidor web en el puerto 80 para entregar otros activos. Esto hace que sea necesario llegar al servidor Socket.IO, y NGINX es la mejor manera de hacerlo.    - Usando NGINX y NGINX Plus con Node.js y Socket.IO, la API de WebSocket - nginx blog

o HARDENING NODE. JS PARA LA PRODUCCIÓN PARTE 3: CERO DESPLIEGUE LOS APLICACIONES CON NGINX

Básicamente, lo más probable es que esté buscando una solución estable para equilibrar la carga, limitar las solicitudes, etc. mientras intenta almacenar la clave privada de forma segura.

    
respondido por el bessbd 11.09.2015 - 00:44
fuente

Lea otras preguntas en las etiquetas