使用 pem 证书向远程代理发送消息

Posted

技术标签:

【中文标题】使用 pem 证书向远程代理发送消息【英文标题】:Sending a message to a remote broker using a pem-certificate 【发布时间】:2019-02-20 11:04:37 【问题描述】:

我正在编写一个脚本来使用 MQTT 获取一些传感器数据,将传入的值转换为一种特定的方式,并将其转发到使用加密通信的云。 该脚本在 RaspberryPi 3 (Raspbian) 上运行,其中 Mosquitto 作为 MQTT 代理运行(传感器将数据发送到该代理)

到目前为止,我从传感器获取信息,并且可以根据需要转换内容。

问题是当我尝试连接到远程代理时,我收到以下错误消息

Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
at Error (native)
at Object.createSecureContext (_tls_common.js:67:17)
at Object.TLSSocket._init.ssl.onclienthello.ssl.oncertcb.exports.connect (_tls_wrap.js:1015:46)
at Object.buildBuilder (/home/pi/node_modules/mqtt/lib/connect/tls.js:13:20)
at MqttClient.wrapper [as streamBuilder] (/home/pi/node_modules/mqtt/lib/connect/index.js:135:36)
at MqttClient._setupStream (/home/pi/node_modules/mqtt/lib/client.js:246:22)
at new MqttClient (/home/pi/node_modules/mqtt/lib/client.js:227:8)
at Object.connect (/home/pi/node_modules/mqtt/lib/connect/index.js:138:10)
at Object.<anonymous> (/home/pi/GATT_server/MQTT_module.js:3:25)

我尝试将 Mosquitto 配置为 MQTT-bridge 以使用配置文件,它看起来可以工作(重新启动服务时没有错误消息)。

当我使用 Mosquitto 作为桥梁时,脚本无法订阅传感器发布的主题。

我不熟悉这些证书,但通过阅读文件“client-options.cs”的文档,我写了以下几行:

var mqtt = require('mqtt')
var client = mqtt.connect('mqtt://localhost', 'port:1883');
var remoteBroker = mqtt.connect('mqtts://xxx.xxx.io', 
	port:8883,
	protocol:'ssl', 
	username:'username', 
	password:'123password123', 
	cert:'/etc/mosquitto/certs/ca.pem' );
                
/*....
.... many lines later
....*/
remoteBroker.publish(topicToUseOnRemoteMqttBroker, PayloadToForward); 

我做得对吗?还是我错过了什么?

如果 Mosquitto-Bridge 的证书可以,那么远程代理也应该可以。 - 对吗?

如果您有关于此主题的其他链接/论文 - 我喜欢学习;P 谷歌给了我很多信息 - 我不知道从哪里开始:(

【问题讨论】:

【参考方案1】:

cert 的条目不应该是证书文件的路径,而是它自己的实际证书。你需要读入文件并传递它。

类似这样的:

var remoteBroker = mqtt.connect('mqtts://xxx.xxx.io', 
    port:8883,
    protocol: 'ssl', 
    username: 'username', 
    password: '123password123', 
    cert: fs.readFileSync('/etc/mosquitto/certs/ca.pem') );

【讨论】:

非常感谢。现在可以了。现在我看到了解决方案,很清楚为什么。 :lol: 再次感谢您

以上是关于使用 pem 证书向远程代理发送消息的主要内容,如果未能解决你的问题,请参考以下文章

如何从网站向不支持 Websockets 的 MQTT 代理发送消息?

使用 Python 向 Apple 通知服务发送消息

Firebase 消息:由于所需的 APNs SSL 证书已过期或未上传,无法向 iOS 设备发送消息

在erlang中向远程节点端口发送消息

使用 .pem 证书注册 Apple 服务

如何将公钥从字符串类型转换为 PEM