Возобновление сеанса MQTT TLS в C

Я использую клиент Eclipse Paho MQTT C для подключения к брокеру mosquitto с помощью TLS с помощью openssl. Это часть моего кода:

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, чтобы уменьшить накладные расходы. Я искал в Интернете, но не нашел ни одного примера того, как реализовать это простым способом.

Любое предложение?

Спасибо


person natan_95    schedule 11.10.2017    source источник


Ответы (3)


Это недавно появилось в списке рассылки разработчиков mosquitto здесь https://dev.eclipse.org/mhonarc/lists/mosquitto-dev/msg01606.html.

Следующий отрывок подразумевает, что это еще не возможно с исходным кодом.

Как я могу использовать API Mosquitto / OpenSSL C для использования билетов сеанса в клиенте MQTT C?

На данный момент нет, для этого нужны изменения кода, которые немного сложнее - похоже, нам нужно использовать SSL_set_session (), чтобы применить сохраненный сеанс к вашему клиенту, и SSL_CTX_sess_set_new_cb (), чтобы сохранить сеанс.

Есть ли способ сохранить билеты сеанса на клиентах, чтобы они оставались действительными после перезагрузки?

С учетом вышеуказанных изменений, да.

person hardillb    schedule 11.10.2017

Сделайте conn_opts.cleansession = 0; Отключение флага очистки в клиентских программах PAHO позволяет возобновить сеанс. Я уже проверял это с помощью wirehark.

С возобновлением сеанса, передача 1-го пакета

1

На изображении 1 мы видим 4 раза связь между сервером и клиентом, и даже сертификаты передаются .

При возобновлении сеанса, снимок экрана сделан для передачи 2-го пакета

2Внимательно наблюдайте за обоими изображениями, связь между сервером и клиентом происходит только 3 раза в 2 image, следовательно, сервер соглашается не выполнять полное рукопожатие.

Ограничение по времени возобновления сеанса составляет 7200 секунд.

Но установка флага cleansession в 1 всегда будет выполнять полное рукопожатие, что означает отсутствие возобновления сеанса.

person sachinrj    schedule 11.10.2018
comment
Флаг сеанса MQTT Clean не имеет ничего общего с сеансами TLS, он касается того, как обрабатываются подписки QOS1 / 2, когда клиент отключен. - person hardillb; 11.10.2018
comment
Флаг очистки сеанса клиента PAHO mqtt связан с возобновлением сеанса помимо QoS. Просто зайдите в файл MQTTClient.c. Попытайтесь выяснить m->c->cleansession == 0, если это правда, есть ли утверждение, SSL_get1_session(m->c->net.ssl); Эта функция помогает в возобновлении сеанса. Это означает, что если для флага чистого сеанса установлено значение false (0), сеанс возобновляется. - person sachinrj; 12.10.2018
comment
Я также проверил это, просто прокомментировав SSL_get1_session (...), тогда в wirehark нет оптимизации. - person sachinrj; 12.10.2018
comment
Эти две концепции действительно следовало разделить. Мне нужно будет найти обсуждение в списке рассылки Paho о том, почему было принято это решение, поскольку оно кажется неправильным. - person hardillb; 12.10.2018
comment
Я считаю, что это хорошее решение, принятое разработчиками PAHO, которые связали флаг чистой сессии с возобновлением сеанса, потому что в клиенте mosquitto отсутствует эта встроенная функция возобновления сеанса. - person sachinrj; 17.10.2018

Я считаю, что это было хорошее решение, принятое людьми из ПАОЗ, которые связали флаг чистой сессии с возобновлением сеанса, потому что клиент mosquitto, предоставленный в github, не имеет этой встроенной функции возобновления сеанса.

Ознакомьтесь со спецификацией MQTT v3.1.1

Или обратитесь к спецификации MQTT в их сайт

person Sachin Joshi    schedule 13.10.2018