簡體   English   中英

C語言中的MQTT TLS會話恢復

[英]MQTT TLS session resumption in C

我正在使用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會話恢復來減少開銷。 我已經在網上搜索過,但是還沒有找到如何以簡單的方式實現該功能的示例。

有什么建議嗎?

謝謝

這是最近在mosquitto dev郵件列表上出現的,這里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()來保存會話。

有什么辦法可以在客戶端上保留會話票證,以便它們在重新啟動后仍然有效?

通過上述更改,可以。

使conn_opts.cleansession = 0; 在PAHO客戶端程序中禁用cleansession標志可以恢復會話。 我已經用Wireshark驗證了它。

使用會話恢復,第一個數據包傳輸

1個

我們可以在1張圖片中看到服務器與客戶端之間的4次通信,甚至證書也已轉移。

使用會話恢復時,截屏為第二個數據包傳輸

2 仔細觀察兩個圖像,存在在服務器和客戶端之間只有3次通信2圖像,因此服務器協商不執行完整的握手。

會話恢復時間限制為7200秒

但是將cleansession標志設置為1將始終執行完整的握手,這意味着不會恢復會話。

我認為這是由PAHO員工做出的一個不錯的決定,他們將干凈的會話標志與會話恢復鏈接在一起,因為github中提供的mosquitto客戶端缺少會話恢復的內置功能。

通過MQTT v3.1.1的規范

在其網站上參考MQTT規范

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM