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

时间:2019-02-20 11:04:37

标签: node.js ssl mqtt mosquitto pem

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

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

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

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桥以使用配置文件,并且看起来可以正常工作(重新启动服务时没有错误消息)。

当我使用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 Google给了我很多信息-我不知道从哪里开始:(

1 个答案:

答案 0 :(得分: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')} );