Hostname / IP no coincide con el altname del certificado
Estoy tratando de crear una configuración de servidor / cliente TLS usando Node.js 0.8.8 con un certificado autofirmado.
El código del servidor esencial parece
var tlsServer = tls.createServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
}, function (connection) {
// [...]
});
tlsServer.listen(3000);
Ahora cuando intento conectarme a este servidor, uso el siguiente código:
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());
});
Si quito la linea
ca: [ fs.readFileSync('server-cert.pem') ]
del código del lado del cliente, Node.js lanza un error que me diceDEPTH_ZERO_SELF_SIGNED_CERT
. Según tengo entendido, esto se debe al hecho de que se trata de un certificado autofirmado y no hay otra parte que confíe en este certificado.
Si me quito
rejectUnauthorized: true,
así, el error se ha ido, peroconnection.authorized
es igual afalse
lo que efectivamente significa que mi conexión no está encriptada. De todos modos, utilizandogetPeerCertificate()
Puedo acceder al certificado enviado por el servidor. Como deseo hacer cumplir una conexión encriptada, entiendo que no puedo eliminar esta línea.
Ahora leo que puedo usar elca
propiedad para especificar cualquier CA en la que quiero que Node.js confíe. losDocumentación del módulo TLS. implica que es suficiente para agregar el certificado del servidor a laca
matriz, y entonces todo debería estar bien.
Si hago eso, este error desaparece, pero recibo uno nuevo:
Hostname/IP doesn't match certificate's altnames
Para mí, esto significa que la CA ahora es básicamente confiable, por lo tanto, está bien ahora, pero el certificado se realizó para otro host que no sea el que yo uso.
He creado el certificado utilizando
$ 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
como lo indica la documentación. Al crear la CSR, me hacen las preguntas habituales, como país, estado, ... y nombre común (CN). Como se le dice "en la web" para un certificado SSL que haceno proporcione su nombre como CN, pero el nombre de host que desea utilizar.
Y aquí es probablemente donde yo fracaso.
Lo intenté
localhost
192.168.178.31
eisbaer
eisbaer.fritz.box
donde los dos últimos son el nombre local y el nombre local completo de mi máquina.
¿Alguna idea de lo que estoy haciendo mal aquí?