C中的MQTT TLS会话恢复

时间:2017-10-11 10:40:31

标签: c ssl mqtt tls1.2 paho

我使用Eclipse Paho MQTT C客户端使用openssl通过TLS连接到mosquitto代理。这是我的代码的一部分:

MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_SSLOptions sslOptions = MQTTClient_SSLOptions_initializer;
MQTTClient_deliveryToken token;

int rc;

MQTTClient_create(&client, ADDRESS, CLIENTID,
    MQTTCLIENT_PERSISTENCE_NONE, NULL);

conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;

/* TLS */
sslOptions.enableServerCertAuth = 0;
sslOptions.trustStore = "ca_rsp.crt";
conn_opts.ssl = &sslOptions;


if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
    printf("Failed to connect, return code %d\n", rc);
    exit(EXIT_FAILURE);
}

实际上每次重新连接到代理时,客户端都会进行完全握手。我想使用TLS会话恢复来减少开销。我在网上搜索但我还没有找到任何以简单的方式实现这一点的例子。

有什么建议吗?

由于

3 个答案:

答案 0 :(得分:0)

最近出现在这里的蚊子邮件列表https://dev.eclipse.org/mhonarc/lists/mosquitto-dev/msg01606.html

下面的摘录表示可能无法使用代码。

  
    

如何使用Mosquitto / OpenSSL C API来利用会话票据     MQTT C客户端?

  
     

目前还不需要代码更改   涉及 - 看起来我们需要使用SSL_set_session()来应用   保存会话到您的客户端和SSL_CTX_sess_set_new_cb()以保存   会议结束。

     
    

有没有办法可以在客户端上保留会话票,所以他们     重启后会保持有效吗?

  
     

通过以上更改,是的。

答案 1 :(得分:0)

使conn_opts.cleansession = 0; 在PAHO客户端程序中禁用cleansession标志可以恢复会话。 我已经用Wireshark进行了验证。

具有会话恢复功能,第一个数据包传输

1

1图像中,我们可以看到服务器和客户端之间进行了4次通信,甚至证书也已转移。

具有会话恢复功能,该屏幕快照用于传输第二个数据包

2 仔细观察两个图像,2图像中服务器和客户端之间只有3次通信,因此服务器协商不执行完整的握手。

会话恢复时间限制为 7200秒

但是将cleansession标志设置为1将始终执行完整的握手,这意味着不会恢复会话。

答案 2 :(得分:0)

我认为这是由PAHO人做出的一个很好的决定,他们将干净的会话标志与会话恢复链接在一起,因为github中提供的mosquitto客户端缺少会话恢复的内置功能。

Go through the specification of MQTT v3.1.1

或参考MQTT specification in their website