Mosquitto security error: OpenSSL Error: routines:SSL3_GET_RECORD:wrong version number
Mosquitto security error: OpenSSL Error: routines:SSL3_GET_RECORD:wrong version number
我正在尝试使用 NodeJS 将 MQTT 有效负载存储在 MongoDB 数据库中。
当我 运行 我的代码时,Mosquitto 服务器弹出以下错误:
1427756032: Socket error on client <unknown>, disconnecting.
1427756033: New connection from 146.175.138.141 on port 8883.
1427756033: OpenSSL Error: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
我不是唯一遇到此错误的人,但 google 上提出的解决方案对我不起作用。
我在 Ubuntu14.04 TLS(可信)服务器环境中工作。我用来制作自己的密钥和证书的 OpenSSL 版本是:
OpenSSL 1.0.1f 6 Jan 2014
为了制作这些键,我遵循了 Mosquitto 的 manual。
nodejs的版本是:
v0.10.25
mosquitto的配置文件:
port 8883
cafile /etc/keys/ca.crt
certfile /etc/keys/server.crt
keyfile /etc/keys/server.key
tls_version tlsv1
require_certificate true
nodejs 文件:
var mqtt=require('mqtt')
var mongodbClient=require('mongodb').MongoClient;
var deviceRoot="demo/device/"
var mqtthost = '146.175.138.141';
var KEY = '/etc/keys/client.key';
var CERT = '/etc/keys/client.crt';
var CAfile = '/etc/keys/ca.crt';
var options = {
host: mqtthost,
port: 8883,
protocolId: 'MQIsdp',
ca: CAfile,
keyPath: KEY,
certPath: CERT,
secureProtocol: 'TLSv1_method',
protocolId: 'MQIsdp',
protocolVersion: 3
};
var collection,client;
mongodbClient.connect("mongodb://localhost:27017/exampleDb", function(err,db){
if(err){return console.dir(err);}
collection=db.collection("test_mqtt");
client=mqtt.connect(options);
client.subscribe("#");
client.publish(deviceRoot, '21');
client.on('message', function(topic,payload){
str = payload.toString();
console.log(str);
var key=topic.replace(deviceRoot,'');
collection.update(
{ _id:key },
{ $push: { events: { event: { value:str, when:new Date() } } } },
{ upsert:true }
)})})
密钥应该可以使用,因为使用以下命令发布不是问题:
mosquitto_pub -h 146.175.138.141 -p 8883 -t Server -m helloworld --cafile /etc/keys/ca.crt --cert /etc/keys/client.crt --key /etc/keys/client.key --tls-version tlsv1
知道我做错了什么吗?
我不能肯定地说,但我怀疑你的 nodejs 连接没有使用 TLS。您可以通过连接 mosquitto_pub 而不传递 --cafile
:
来验证这一点
mosquitto_pub -h 146.175.138.141 -p 8883 -t Server -m helloworld
这应该会在代理上产生与您在 nodejs 连接中看到的相同的错误。
下一步是从您的 mosquitto 配置中删除 tls_version tlsv1
行并重复上述命令。在那种情况下,我希望在代理上收到以下错误消息:
Client connection from ::1 failed: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol.
如果您现在用您的 nodejs 客户端重复测试并收到相同的错误消息,那么我敢打赌我说的是正确的。恐怕我不知道如何解决它!
一个更简单的测试是保持您的 nodejs 代码不变,但将 mosquitto 设置为在不使用 TLS 的情况下进行侦听。如果节点连接正常,则确认情况。
相关说明,如果您使用的是 mosquitto 1.4,最好的选择是不要强制使用特定版本的 TLS,因为默认行为是允许 TLS v1.0、v1.1 和 v1.2。早期版本只为每个侦听器提供一个 TLS 版本。
使用 "fs" 保证对文件的访问
var fs = require('fs');
var mongodbClient=require('mongodb').MongoClient;
var deviceRoot="demo/device/"
var mqtthost = '146.175.138.141';
var KEY = fs.readFileSync('/etc/keys/client.key');
var CERT = fs.readFileSync('/etc/keys/client.crt');
var CAfile = [fs.readFileSync('/etc/keys/ca.crt')];
var options = {
host: mqtthost,
port: 8883,
protocol: 'mqtts', //also add this
protocolId: 'MQIsdp',
ca: CAfile,
key: KEY,
cert: CERT,
secureProtocol: 'TLSv1_method',
protocolId: 'MQIsdp',
protocolVersion: 3
};
我正在尝试使用 NodeJS 将 MQTT 有效负载存储在 MongoDB 数据库中。 当我 运行 我的代码时,Mosquitto 服务器弹出以下错误:
1427756032: Socket error on client <unknown>, disconnecting.
1427756033: New connection from 146.175.138.141 on port 8883.
1427756033: OpenSSL Error: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
我不是唯一遇到此错误的人,但 google 上提出的解决方案对我不起作用。
我在 Ubuntu14.04 TLS(可信)服务器环境中工作。我用来制作自己的密钥和证书的 OpenSSL 版本是:
OpenSSL 1.0.1f 6 Jan 2014
为了制作这些键,我遵循了 Mosquitto 的 manual。
nodejs的版本是:
v0.10.25
mosquitto的配置文件:
port 8883
cafile /etc/keys/ca.crt
certfile /etc/keys/server.crt
keyfile /etc/keys/server.key
tls_version tlsv1
require_certificate true
nodejs 文件:
var mqtt=require('mqtt')
var mongodbClient=require('mongodb').MongoClient;
var deviceRoot="demo/device/"
var mqtthost = '146.175.138.141';
var KEY = '/etc/keys/client.key';
var CERT = '/etc/keys/client.crt';
var CAfile = '/etc/keys/ca.crt';
var options = {
host: mqtthost,
port: 8883,
protocolId: 'MQIsdp',
ca: CAfile,
keyPath: KEY,
certPath: CERT,
secureProtocol: 'TLSv1_method',
protocolId: 'MQIsdp',
protocolVersion: 3
};
var collection,client;
mongodbClient.connect("mongodb://localhost:27017/exampleDb", function(err,db){
if(err){return console.dir(err);}
collection=db.collection("test_mqtt");
client=mqtt.connect(options);
client.subscribe("#");
client.publish(deviceRoot, '21');
client.on('message', function(topic,payload){
str = payload.toString();
console.log(str);
var key=topic.replace(deviceRoot,'');
collection.update(
{ _id:key },
{ $push: { events: { event: { value:str, when:new Date() } } } },
{ upsert:true }
)})})
密钥应该可以使用,因为使用以下命令发布不是问题:
mosquitto_pub -h 146.175.138.141 -p 8883 -t Server -m helloworld --cafile /etc/keys/ca.crt --cert /etc/keys/client.crt --key /etc/keys/client.key --tls-version tlsv1
知道我做错了什么吗?
我不能肯定地说,但我怀疑你的 nodejs 连接没有使用 TLS。您可以通过连接 mosquitto_pub 而不传递 --cafile
:
mosquitto_pub -h 146.175.138.141 -p 8883 -t Server -m helloworld
这应该会在代理上产生与您在 nodejs 连接中看到的相同的错误。
下一步是从您的 mosquitto 配置中删除 tls_version tlsv1
行并重复上述命令。在那种情况下,我希望在代理上收到以下错误消息:
Client connection from ::1 failed: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol.
如果您现在用您的 nodejs 客户端重复测试并收到相同的错误消息,那么我敢打赌我说的是正确的。恐怕我不知道如何解决它!
一个更简单的测试是保持您的 nodejs 代码不变,但将 mosquitto 设置为在不使用 TLS 的情况下进行侦听。如果节点连接正常,则确认情况。
相关说明,如果您使用的是 mosquitto 1.4,最好的选择是不要强制使用特定版本的 TLS,因为默认行为是允许 TLS v1.0、v1.1 和 v1.2。早期版本只为每个侦听器提供一个 TLS 版本。
使用 "fs" 保证对文件的访问
var fs = require('fs');
var mongodbClient=require('mongodb').MongoClient;
var deviceRoot="demo/device/"
var mqtthost = '146.175.138.141';
var KEY = fs.readFileSync('/etc/keys/client.key');
var CERT = fs.readFileSync('/etc/keys/client.crt');
var CAfile = [fs.readFileSync('/etc/keys/ca.crt')];
var options = {
host: mqtthost,
port: 8883,
protocol: 'mqtts', //also add this
protocolId: 'MQIsdp',
ca: CAfile,
key: KEY,
cert: CERT,
secureProtocol: 'TLSv1_method',
protocolId: 'MQIsdp',
protocolVersion: 3
};