Sto tentando di creare un'installazione server/client TLS utilizzando Node.js 0.8.8 con un certificato autofirmato.Nome host/IP non corrisponde al nome alternativo del certificato
Il codice del server essenziale sembra
var tlsServer = tls.createServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
}, function (connection) {
// [...]
});
tlsServer.listen(3000);
Ora, quando provo a connettermi al server io uso il seguente codice:
var connection = tls.connect({
host: '192.168.178.31',
port: 3000,
rejectUnauthorized: true,
ca: [ fs.readFileSync('server-cert.pem') ]
}, function() {
console.log(connection.authorized);
console.log(connection.authorizationError);
console.log(connection.getPeerCertificate());
});
Se rimuovo la linea
ca: [ fs.readFileSync('server-cert.pem') ]
dal codice lato client, Node.js genera un errore che mi dice DEPTH_ZERO_SELF_SIGNED_CERT
. Per quanto ne so, questo è dovuto al fatto che si tratta di un certificato autofirmato e che non esiste un'altra parte che si fida di questo certificato.
Se rimuovo
rejectUnauthorized: true,
così, l'errore è andato - ma connection.authorized
è uguale a false
che significa efficacemente che la mia connessione non è crittografata. Ad ogni modo, usando getPeerCertificate()
posso accedere al certificato inviato dal server. Poiché voglio applicare una connessione crittografata, capisco che non posso rimuovere questa linea.
Ora ho letto che posso usare la proprietà ca
per specificare qualsiasi CA di cui voglio che Node.js consideri attendibile. Il numero documentation of the TLS module implica che è sufficiente aggiungere il certificato del server all'array ca
e quindi tutto dovrebbe andare bene.
Se lo faccio, questo errore è andato, ma ho uno nuovo:
Hostname/IP doesn't match certificate's altnames
Per me questo significa che il CA è ormai sostanzialmente attendibile, quindi va bene ora, ma il certificato è stato fatto per un host diverso da quello che uso.
ho creato il certificato utilizzando
$ openssl genrsa -out server-key.pem 2048
$ openssl req -new -key server-key.pem -out server-csr.pem
$ openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem
come suggerisce la documentazione. Quando creo il CSR mi vengono poste le solite domande, come per paese, stato, ... e nome comune (CN). Come ti viene detto "on the web" per un certificato SSL che fai non inserisci il tuo nome come CN, ma il nome host che desideri utilizzare.
E questo è probabilmente il punto in cui non riesco.
ho cercato
localhost
192.168.178.31
eisbaer
eisbaer.fritz.box
in cui gli ultimi due sono il nome locale e il nome locale completo della mia macchina.
Qualche idea su cosa sto facendo male qui?
Nota importante: questo è 'Nodo v0.8.8'. 'rejectUnauthorized' ora è impostato su' true'. – Breedly
La connessione è [ancora crittografata] (https://stackoverflow.com/a/16311147/4068278) per impostazione predefinita se si utilizza 'rejectUnauthorized: false'. Semplicemente non verifica l'identità dell'host a cui ti stai connettendo, il che potrebbe renderti vulnerabile agli attacchi MITM su SSL. –