Ошибка «SSL-рукопожатие не удалось» для Let’s Encrypt в сентябре 2021 года

#c #qt #ssl #qtquick2 #lets-encrypt

Вопрос:

Я разработал кроссплатформенное приложение с использованием технологий Qt и QtQuick. Связь с внутренним сервером защищена с помощью протокола SSL Let’s Encrypt.
Но в сентябре 2021 года приложение Qt начинает сообщать об ошибке «SSL-квитирование не удалось» без каких-либо изменений в клиенте или сервере. В чем проблема?

Ответ №1:

После некоторых исследований я выясняю причину:

https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/

Срок действия корневого ЦС X3 истекает 30 сентября 2021 года. Это означает, что те старые устройства, которые не доверяют ISRG Root X1, начнут получать предупреждения о сертификатах при посещении сайтов, использующих сертификаты Let’s Encrypt.

Итак, я должен вручную добавить корневой сертификат ISRG X1 в базу данных доверенного центра сертификации моего приложения. Для достижения этой цели я посетил сайт Let’s Encrypt с помощью FireFox и сохранил файл PEM сертификата ISRG Root X1 в свой ресурс приложения (в qrc файл). Затем я добавил это в базу данных сертификатов ЦС по умолчанию, используя следующий код:

 //Adding CA root certificate of the Let'sEncrypt into default CA DB
//for Qt 5.15 
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
qDebug() << "loading embedded "ISRG Root X1" CA cert:" << QSslConfiguration::defaultConfiguration().addCaCertificates(":/ca_certs/isrg_root_x1.pem");
#else
qDebug() << "loading embedded "ISRG Root X1" CA cert:" << QSslSocket::addDefaultCaCertificates(":/ca_certs/isrg_root_x1.pem");
#endif
 

Обратите внимание, что для Qt 5.15 есть новый способ сделать это, в то время как старый способ устарел. Я использовал Qt 5.12, поэтому мне нужно добавить оба способа (чтобы сделать мое приложение более готовым к Qt 5.15 ), как вы можете видеть.

Благодаря хорошей архитектуре Qt вам больше не нужно ничего менять.