Me gustaría conectar un MQTT-Client de prueba a mi aplicación Node.js como MQTT-Broker. estoy usando la biblioteca aedes de moscajs
Mi MQTT-Client es la herramienta "MQTT-Explorer" y aquí está mi aplicación Node.js:
const fs = require('fs'); const aedes = require('aedes')(); const options = { key: fs.readFileSync('certs/server_key.pem'), cert: fs.readFileSync('certs/server_cert.pem'), }; // const server = require('net').createServer(aedes.handle); const server = require('tls').createServer(options, aedes.handle); const PORT = 8881; server.listen(PORT, () => { console.log(`server is up and running: PORT [${PORT}] - ID [${aedes.id}]`); });
Puedo conectarme sin problemas a PORT=1881
con const server = require('net').createServer(aedes.handle)
y también puedo conectarme a PORT=8881
con const server = require('tls').createServer(options, aedes.handle)
Con la Herramienta xca-2.4.0.msi
2.4.0 he creado un Archivo de CERTIFICADO ca.pem y un CERTIFICADO server_cert.pem y una CLAVE PRIVADA server_key.pem (firmada desde ca.pem) como Servidor. La clave para CA y el servidor son diferentes:
Para mi cliente MQTT, en ADVANCED, CERTIFICATES, SERVER CERTIFICAT (CA)
, seleccioné el archivo ca.pem. Si selecciono "Cifrado", funciona. Pero si selecciona "validar certificado", error: el nombre de host/IP no coincide con los nombres alternativos del certificado: IP: 127.0.0.1 no está en la lista de certificados
Lamentablemente no se que estoy haciendo mal, gracias de antemano :(
MQTT Explorer está construido usando Node.js y la biblioteca MQTT MQTT.js. Según este problema :
Node.js requiere que la dirección IP esté en subjectAltNames para el certificado y no en el CN. Tal vez MQTT.fx no requiera eso, pero debería.
y:
Si el certificado de su servidor dice CN=localhost en el campo Asunto, conéctese usando localhost y no 127.0.0.1 y debería funcionar. Si dice CN=127.0.0.1, debe crear uno nuevo porque Node.js no validará la dirección IP a menos que esté en la extensión SAN. Hay una manera de evitarlo en el código (creo que es una opción llamada checkServerIdentity), pero preferiría arreglar mi certificado si tuviera este problema.
En esta respuesta se establece una justificación del enfoque adoptado en Node, que incluye la siguiente cita de RFC2818: HTTP Over TLS :
En algunos casos, el URI se especifica como una dirección IP en lugar de un nombre de host. En este caso, el IPAddress subjectAltName debe estar presente en el certificado y debe coincidir exactamente con la IP en el URI.
Como está utilizando MQTT sobre TLS (a diferencia de HTTP sobre TLS), podría argumentar que lo anterior no se aplica pero, dado que el uso principal de la biblioteca TLS es para el tráfico HTTP, tiene sentido que confirme el RFC por defecto.
Tienes algunas opciones que incluyen:
localhost
) en lugar de una IP al crear el certificado o conectarse.checkServerIdentity
(vea esta respuesta ).