【问题标题】:MQTT TLS session resumption in CC 中的 MQTT TLS 会话恢复
【发布时间】:2017-10-11 10:40:30
【问题描述】:

我正在使用 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 会话恢复来减少开销。我在网上搜索过,但没有找到任何如何以简单方式实现它的示例。

有什么建议吗?

谢谢

【问题讨论】:

    标签: c ssl mqtt tls1.2 paho


    【解决方案1】:

    这最近出现在 mosquitto 开发邮件列表中 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() 以保存 会话结束。

    我有什么办法可以在客户端上保留会话票证,所以他们 重启后仍然有效吗?

    有了以上改动,是的。

    【讨论】:

      【解决方案2】:

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

      会话恢复,第一个数据包传输

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

      会话恢复,为第二个数据包传输截屏

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

      会话恢复时间限制为 7200 秒

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

      【讨论】:

      • MQTT Clean 会话标志与 TLS 会话无关,它与客户端断开连接时如何处理 QOS1/2 订阅有关
      • PAHO mqtt 客户端的清除会话标志与 QoS 之外的会话恢复相关联。只需转到文件“MQTTClient.c”。尝试找出m->c->cleansession == 0,如果这是真的有一个声明,SSL_get1_session(m->c->net.ssl);这个功能有助于会话恢复。这意味着当 clean session 标志设置为 false (0) 时,会话将恢复。
      • 我也通过评论 SSL_get1_session(...) 验证了它,然后在wireshark中没有看到任何优化。
      • 这两个概念真的应该分开。我将不得不在 Paho 邮件列表上找到关于为什么做出这个决定的讨论,因为它似乎是错误的
      • 我觉得这是 PAHO 开发人员做出的一个很好的决定,他们将干净的会话标志与会话恢复联系起来,因为 mosquitto 客户端缺乏会话恢复的内置功能。
      【解决方案3】:

      我觉得 PAHO 的人做出了一个很好的决定,他们将干净的会话标志与会话恢复联系起来,因为 github 中提供的 mosquitto 客户端缺乏会话恢复的内置功能。

      Go through the specification of MQTT v3.1.1

      或参考MQTT specification in their website

      【讨论】:

        猜你喜欢
        • 2020-05-21
        • 2016-09-10
        • 2019-02-16
        • 2019-01-08
        • 2019-11-20
        • 2013-08-26
        • 2017-10-22
        • 2021-04-15
        • 2011-12-08
        相关资源
        最近更新 更多