繁体   English   中英

MQTT TLS 连接

[英]MQTT TLS connection

我想将测试 MQTT-Client 作为 MQTT-Broker 连接到我的 Node.js 应用程序。 我正在使用moscajs的 aedes 库

我的 MQTT-Client 是工具“MQTT-Explorer”,这是我的 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}]`);
});

我可以使用const server = require(.net').createServer(aedes.handle)地连接到PORT=1881 ,我也可以使用const server = require('tls').createServer(options, aedes.handle)连接到PORT=8881 const server = require('tls').createServer(options, aedes.handle)

使用工具xca-2.4.0.msi XCA 2.4.0 ,我创建了一个 ca.pem CERTIFICATE 文件和一个 CERTIFICATE server_cert.pem 和一个 server_key.pem PRIVATE KEY(从 ca.pem 签名)作为服务器。 CA 和服务器的密钥不同:

XCA

对于我的 MQTT 客户端,在ADVANCED, CERTIFICATES, SERVER CERTIFICAT (CA)下,我选择了 ca.pem 文件。 如果我 select “加密”,它会起作用。 但如果 select“验证证书”,错误:主机名/IP 与证书的别名不匹配:IP:127.0.0.1 不在证书列表中

MQTT 资源管理器

不幸的是我不知道我做错了什么,在此先感谢:(

MQTT 资源管理器是使用Node.js和 MQTT 库MQTT.js 构建的。 根据这个问题

Node.js 要求 IP 地址位于证书的 subjectAltNames 中,而不是 CN 中。 也许 MQTT.fx 不要求这样做,但它应该这样做。

和:

如果您的服务器证书在主题字段中显示 CN=localhost,请使用 localhost 而不是 127.0.0.1 进行连接,它应该可以工作。 如果显示 CN=127.0.0.1,则必须重新创建一个,因为 Node.js 不会验证 IP 地址,除非它在 SAN 扩展中。 有一种方法可以在代码中解决它(我认为这是一个名为 checkServerIdentity 的选项),但如果遇到此问题,我更愿意修复我的证书。

此答案中阐述了在 Node 中采用的方法的基本原理,其中包括RFC2818 中的以下引述:HTTP Over TLS

在某些情况下,URI 被指定为 IP 地址而不是主机名。 在这种情况下,iPAddress subjectAltName 必须出现在证书中并且必须与 URI 中的 IP 完全匹配。

当您使用 MQTT over TLS(而不是 HTTP Over TLS)时,您可能会争辩说上述内容不适用,但是鉴于 TLS 库的主要用途是 HTTP 流量,它通过以下方式确认 RFC 是有意义的默认。

您有几个选择,包括:

  • 创建证书/连接时使用主机名(例如localhost )而不是 IP。
  • 添加 IP 作为 subjectAltName
  • 修改库以使用 noop checkServerIdentity (请参阅此答案)。
  • 使用另一个应用程序进行测试(不推荐,因为有些应用程序可以工作,有些则不能)。 上面引用的问题提到 MQTT.fx 有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM