我使用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会话恢复来减少开销。我在网上搜索但我还没有找到任何以简单的方式实现这一点的例子。
有什么建议吗?
由于
答案 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图像中,我们可以看到服务器和客户端之间进行了4次通信,甚至证书也已转移。
具有会话恢复功能,该屏幕快照用于传输第二个数据包
仔细观察两个图像,2图像中服务器和客户端之间只有3次通信,因此服务器协商不执行完整的握手。
会话恢复时间限制为 7200秒。
但是将cleansession标志设置为1将始终执行完整的握手,这意味着不会恢复会话。
答案 2 :(得分:0)
我认为这是由PAHO人做出的一个很好的决定,他们将干净的会话标志与会话恢复链接在一起,因为github中提供的mosquitto客户端缺少会话恢复的内置功能。