MQTT客户端连接警告:TLS ServerName设为IP不符合RFC 6066如何解决?
解决MQTT客户端连接IP代理时的TLS警告问题
问题原因
这个警告来自Node.js的DEP0123弃用提示,RFC 6066明确规定TLS的ServerName(SNI扩展)不能设置为IP地址,当前版本仅抛出警告,未来版本会直接忽略该设置。
代码修正与警告解决
1. 修复客户端配置错误
你的代码存在两处基础配置错误:
options.host字段错误添加了mqtts://前缀,host仅需填写纯IP地址options.port使用了字符串类型,应改为数字类型
2. 禁用SNI扩展消除警告
在连接选项中显式设置servername: ''(或undefined),阻止Node.js将IP作为ServerName发送,完全符合RFC规范:
修改后的完整代码:
var mqtt = require('mqtt') var fs = require('fs'); var certFile = fs.readFileSync("./client.crt"); var keyFile = fs.readFileSync("./client.key"); var caFile = fs.readFileSync("./ca.crt"); console.log("connecting...") var client = mqtt.connect("mqtts://172.27.224.1:8883", { host: '172.27.224.1', port: 8883, cert: certFile, key: keyFile, ca: caFile, connectTimeout: 5000, username: "user", password: "xxx", servername: '' // 关键配置:禁用SNI扩展,消除警告 }) client.on('connect', function () { console.log("Connected") client.subscribe('test', function (err) { if (!err) { console.log("subscribed") } else { console.log(err); } }) }) client.on('message', function (topic, message) { // message is Buffer console.log(message.toString()) }) client.on('error', function (err) { console.log(err) client.end(); setTimeout(() => { client.reconnect() }, 20000); }) client.on('reconnect', function () { console.log("reconnecting") }) client.on('disconnect', function () { console.log("disconnected") }) client.on('offline', function () { console.log("offline") }) client.on('end', function () { console.log("end") })
证书匹配补充说明
结合你之前的证书问题,需要确保MQTT代理的证书Subject Alternative Name(SAN)字段包含该IP地址,否则会触发证书验证失败错误。若证书未包含IP,需重新生成证书,例如使用OpenSSL时添加-addext "subjectAltName=IP:172.27.224.1"参数。
测试环境临时调试可添加rejectUnauthorized: false关闭证书验证,但生产环境绝对禁止,会引发严重安全风险。
内容的提问来源于stack exchange,提问作者sirzento
相关产品推荐
相关产品推荐

