2015-03-30 4 views
0

Я пытаюсь хранить полезные данные MQTT в базе данных MongoDB с помощью NodeJS. Когда я запускаю мой код я получаю следующее сообщение об ошибке выскочил на сервере Mosquitto:Ошибка безопасности Mosquitto: ошибка OpenSSL: процедуры: SSL3_GET_RECORD: неправильный номер версии

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 (trusty). Версия OpenSSL, которые я использовал, чтобы сделать свои собственные ключи и сертификаты является:

OpenSSL 1.0.1f 6 Jan 2014 

Для изготовления этих ключей я следовал manual из Mosquitto.

Версия 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 

Любая идея, что я делаю неправильно?

ответ

0

Использование «фс» гарантирует доступ к файлам

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 
}; 
1

Я не могу сказать точно, но я подозреваю, что ваше соединение nodejs не использует TLS. Вы можете проверить это, соединяясь с mosquitto_pub без прохождения --cafile:

mosquitto_pub -h 146.175.138.141 -p 8883 -t Server -m helloworld 

Это должно производить ту же ошибку на брокера, который вы видите с nodejs связи.

Следующим шагом является удаление линии 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 для каждого слушателя.

+0

Действительно, эта ошибка появляется, если брокер не может найти cafile. И да, если я удалю tls_version в конфигурации mosquitto, я получаю ошибку «client_hello».Если я установил mosquitto для прослушивания без использования TLS, код nodejs сможет установить соединение. Итак, вы правы. Благодарим вас за указание на настройки TLS. Но моя проблема не решена. Это нормально, что брокер больше не спрашивает меня о парольной фразе? Могут ли быть какие-либо проблемы с владением? –

+1

Я не думаю, что москит (брокер) виноват, потому что он работает правильно с mosquitto_pub с TLS. Код nodejs не использует TLS, несмотря на то, что вы рассказываете об этом. Извините, я не могу с этим поделать. – ralight