【发布时间】:2021-11-24 09:18:30
【问题描述】:
我使用 Qt 和 QtQuick 技术开发了一个跨平台应用程序。与后端服务器的通信由 Let's Encrypt SSL 保护。
但是在 2021 年 9 月,Qt 应用程序开始报告“SSL 握手失败”错误,而客户端或服务器没有任何变化。
有什么问题?
【问题讨论】:
标签: c++ qt ssl qtquick2 lets-encrypt
我使用 Qt 和 QtQuick 技术开发了一个跨平台应用程序。与后端服务器的通信由 Let's Encrypt SSL 保护。
但是在 2021 年 9 月,Qt 应用程序开始报告“SSL 握手失败”错误,而客户端或服务器没有任何变化。
有什么问题?
【问题讨论】:
标签: c++ qt ssl qtquick2 lets-encrypt
经过一番研究,我找到了原因:
https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/
DST Root CA X3 将于 2021 年 9 月 30 日到期。这意味着那些不信任 ISRG Root X1 的旧设备将在访问使用 Let's Encrypt 证书的网站时开始收到证书警告。
因此,我必须手动将 ISRG Root X1 证书添加到我的应用程序的受信任 CA 数据库中。为了实现这一点,我使用 FireFox 访问了 Let's Encrypt 站点,并将 ISRG Root X1 证书 PEM 文件保存到我的应用程序资源中(保存到 qrc 文件中)。然后我使用以下代码将其添加到默认 CA 证书数据库中:
//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 良好的架构,您无需再做任何更改。
【讨论】: