QML中使用XMLHttpRequest如何忽略或信任自签名HTTPS证书
解决方案
注意:QML 层面的
XMLHttpRequest没有暴露 SSL 证书错误处理的相关接口,所有证书相关的配置都需要在 C++ 侧修改 Qt 网络模块的全局配置完成。
以下是两种适配方案:
方案1:配置信任自签名证书(生产环境推荐)
将你生成的自签名证书加入 Qt 全局信任证书列表,不会影响其他请求的安全性,操作步骤如下:
- 将你的自签名证书(如PEM格式的crt文件)放入项目资源目录
- 在 main 函数加载 QML 前添加如下代码:
#include <QCoreApplication> #include <QQmlApplicationEngine> #include <QSslConfiguration> #include <QSslCertificate> #include <QFile> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); // 加载自定义自签名证书 QFile certFile(":/资源路径/你的证书文件名.crt"); if (certFile.open(QIODevice::ReadOnly)) { QSslCertificate customCert(&certFile, QSsl::Pem); QSslConfiguration defaultConfig = QSslConfiguration::defaultConfiguration(); QList<QSslCertificate> trustedCerts = defaultConfig.caCertificates(); // 将自定义证书加入信任列表 trustedCerts.append(customCert); defaultConfig.setCaCertificates(trustedCerts); QSslConfiguration::setDefaultConfiguration(defaultConfig); certFile.close(); } QQmlApplicationEngine engine; engine.load(u"qrc:/你的主QML文件路径.qml"_qs); return app.exec(); }
配置完成后原有 QML 代码无需修改即可正常请求接口。
方案2:临时忽略SSL证书错误(本地测试专用,类似浏览器跳过警告效果)
如果仅用于本地调试,不需要考虑安全性,可以全局忽略所有SSL证书校验错误,代码如下:
#include <QCoreApplication> #include <QQmlApplicationEngine> #include <QSslSocket> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); // 全局忽略SSL证书错误,*生产环境绝对禁止使用* QSslSocket::ignoreSslErrors(); QQmlApplicationEngine engine; engine.load(u"qrc:/你的主QML文件路径.qml"_qs); return app.exec(); }
无C++工程直接用qml命令运行的处理方式
如果你只是用qml命令直接运行测试脚本,不需要打包应用,可以直接将自签名证书导入操作系统的信任根证书列表:
- Windows:双击证书文件,选择安装证书,存储位置选「本地计算机」,导入到「受信任的根证书颁发机构」存储区
- macOS:双击证书文件打开钥匙串访问,找到对应证书右键选「显示简介」,在信任设置中将「使用此证书时」修改为「始终信任」
- Linux:将证书文件复制到
/usr/local/share/ca-certificates/目录,执行sudo update-ca-certificates命令生效
系统信任证书后,Qt 网络模块会自动读取系统信任证书列表,你的测试代码即可正常请求接口。
内容的提问来源于stack exchange,提问作者jimav
相关产品推荐
相关产品推荐

