【问题标题】:Mosquitto security error: OpenSSL Error: routines:SSL3_GET_RECORD:wrong version numberMosquitto 安全错误:OpenSSL 错误:例程:SSL3_GET_RECORD:错误的版本号
【发布时间】:2015-03-30 23:38:06
【问题描述】:

我正在尝试使用 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

我不是唯一面临此错误的人,但谷歌上提出的解决方案对我不起作用。

我在 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

知道我做错了什么吗?

【问题讨论】:

    标签: node.js security openssl mqtt mosquitto


    【解决方案1】:

    我不能肯定地说,但我怀疑您的 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。

    【讨论】:

    • 确实,如果broker找不到cafile就会弹出这个错误。是的,如果我在 mosquitto 配置中删除 tls_version,我会收到“client_hello”错误。如果我在不使用 TLS 的情况下将 mosquitto 设置为监听,则 nodejs 代码能够建立连接。所以你是对的。感谢您向我指出 TLS 设置。但是我的问题当然没有解决。经纪人在启动时不再要求我输入 pem 密码是否正常?会不会涉及任何所有权问题?
    • 我不认为 mosquitto(代理)有问题,因为它可以与带有 TLS 的 mosquitto_pub 一起正常工作。尽管您告诉它,nodejs 代码并未使用 TLS。抱歉,我帮不上忙。
    【解决方案2】:

    使用“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
    };
    

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2019-04-05
      • 2020-11-28
      • 1970-01-01
      • 2012-10-05
      相关资源
      最近更新 更多