Mosquitto-PHP - 与代理的TLS错误连接

时间:2017-02-14 12:05:27

标签: php

我正在尝试在PHP MQTT客户端和我的代理之间建立连接,但是我收到了这个错误:

  

致命错误:未捕获的异常'Mosquitto \ Exception',消息'A   发生了TLS错误。在/path/testemqtt.php:27堆栈跟踪:#0   /path/testemqtt.php(27):   Mosquitto \ Client-> connect('localhost',9419)#1 {main}引入   第27行的/path/testemqtt.php

我已经使用其他语言(例如JavaAndroidJavascript (w/ node.js)进行了相同的连接,但在PHP我遇到了一些困难...这是代码不起作用:

ini_set('display_errors',1);error_reporting(E_ALL);

    /* Construct a new client instance, passing a client ID of “MyClient” */
$client = new Mosquitto\Client('PHPClient',true);

/* Set the callback fired when the connection is complete */
$client->onConnect(function($code, $message) use ($client) {
    /* Subscribe to the broker's $SYS namespace, which shows debugging info */
    echo $code .' - '.$message;
    $client->subscribe('pedro/php', 1);
});

/* Set the callback fired when we receive a message */
$client->onMessage(function($message) {
    /* Display the message's topic and payload */
    echo $message->topic, "\n", $message->payload, "\n\n";
});

/* Connect, supplying the host and port. */


$client->setCredentials('username', 'password');
$client->setTlsCertificates('ca.crt', 'ca_client.crt', 'client.key', null); //As my TLS/SSL certificate is one way I dont need to use passphrase to connect to the broker
$client->setTlsOptions(Mosquitto\Client::SSL_VERIFY_PEER,"tlsv1",null);
$client->connect('localhost', 8883);

/* Enter the event loop */
$client->loopForever();

以下是node.js中实现的示例(它的工作方式类似于魅力):

var KEY = fs.readFileSync('client.key'); 

var CERT = fs.readFileSync('client.crt'); 

var CAfile = fs.readFileSync('ca.crt');

var MQTToptions = {
                    host: 'localhost',
                    clientId: 'pedroNodeJS',
                    username: 'username',
                    password: 'password',
                    port: 8883,
                    ca: CAfile,
                    keyPath: KEY,
                    certPath: CERT,
                    secureProtocol: 'TLSv1_method',
                    protocol: 'mqtts',
                    protocolId: 'MQIsdp',
                    protocolVersion: 3,
                    rejectUnauthorized: false,
                    connectTimeout: 2000,
                    keepalive:0,
                    reschedulePings: false
                };


var client  = mqtt.connect(MQTToptions);

我不知道是什么问题,因为显然PHP代码是正确的。

我在我的实现中使用了这个引用:

MQTT Client Library Encyclopedia – Mosquitto-PHP

Git - Mosquitto-PHP

Development guide

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我知道这个问题有点旧,但是对于任何来自Google的人来说,我遇到了同样的问题,而问题则与我使用的CA证书有关。

我所做的就是将setTlsCertificates方法的第一个参数设置为指向我系统上的默认信任/ CA存储,在Debian上恰好是/etc/ssl/certs/ca-certificates.crt,并且它有效。

当然,如果您的服务器使用自签名证书,那么这样做是行不通的。验证问题确实存在于CA证书的快速方法是在SSL_VERIFY_ΝΟΝΕ上使用SSL_VERIFY_PEER而不是setTlsOptions,以暂时禁用服务器验证。