it-swarm.dev

Come devo archiviare le chiavi SSL sul server?

Ho un server web HTTPS Node.JS istanziato come segue:

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');

La mia chiave privata è sul mio server che Node.JS legge per creare il server web HTTPS. Se un hacker ha accesso in lettura ai file del server, può accedere alla chiave privata e impersonare il server web.

La chiave privata deve essere archiviata sul server? Dovrebbe essere distrutto dopo aver istanziato il server HTTPS?

21
Randomblue

Non vuoi distruggere la tua chiave privata: ti servirà di nuovo se il server si riavvia. I riavvii a volte avvengono ...

Questa è un'osservazione generica: tu vuoi il tuo server per poter riavviare in modo incustodito. Pertanto deve contenere la chiave privata e quella chiave privata deve essere deve essere disponibile per il software server.

Se un attaccante dirotta la tua macchina completa, ottiene una copia della tua chiave. Questo è un dato di fatto. Convivici. Ci sono mitigazioni, tuttavia:

  • È possibile utilizzare le suite di crittografia "DHE" per SSL. Con queste suite di crittografia, la chiave del server viene utilizzata per le firme, non per la crittografia. Ciò significa che l'attaccante che ruba la chiave può successivamente impersonare il tuo server (ovvero eseguire un server falso) ma non decodificare le sessioni SSL che ha precedentemente registrato. Questa è una buona proprietà nota come Perfect Forward Secrecy .

  • Se si memorizza la chiave in un Hardware Security Module la chiave non verrà rubata. L'attaccante può giocare con la chiave purché abbia un controllo efficace del server, ma non estrarlo. Ciò riduce il suo potere di disturbo (ma HSM sono costosi).

In pratica, ti assicurerai che il file contenente la chiave privata sia leggibile solo per l'account di sistema che esegue il server (chown e chmod su sistemi simili a Unix, diritti di accesso NTFS su Finestre).

22
Thomas Pornin

Probabilmente stai cercando un proxy inverso come nginx. È considerata la migliore pratica ™.

Le applicazioni in esecuzione in produzione devono in genere essere eseguite sulla porta 80 (HTTP), sulla porta 443 (HTTPS) o su entrambi. Ciò può rappresentare una sfida se diversi componenti dell'applicazione interagiscono con l'utente o se si utilizza un server Web sulla porta 80 per consegnare altre risorse. Ciò rende necessario eseguire il proxy sul server Socket.IO e NGINX è il modo migliore per farlo. - tilizzando NGINX e NGINX Plus con Node.js e Socket.IO, l'API WebSocket - blog nginx

oppure HARDENING NODE.JS PER LA PRODUZIONE PARTE 3: IMPOSTAZIONI IN TEMPO REALE DI ZERO CON NGINX

Fondamentalmente, molto probabilmente stai cercando una soluzione stabile anche per il bilanciamento del carico, la limitazione delle richieste, ecc. Mentre stai cercando di archiviare la chiave privata in modo sicuro.

2
bessbd