【发布时间】:2015-05-19 22:40:14
【问题描述】:
我直接从我的 qml 视图发出一些 https 请求,例如图像源。由于我有一个自签名证书服务器端,我需要告诉 qt 忽略一些 ssl 错误(我同时控制服务器和客户端应用程序,所以这应该不是问题)。
我创建了一个 QQmlNetworkAccessManagerFactory 来创建 NAM,我在其中连接到 sslErrors 信号。
UltraQmlAccessManagerFactory.h:
#ifndef FACKFACKTORy_H
#define FACKFACKTORy_H
#include <QQmlNetworkAccessManagerFactory>
#include <QObject>
#include <QNetworkReply>
#include <QList>
#include <QSslError>
#include <QNetworkAccessManager>
#include <QDebug>
#include <QSslCertificate>
class UltraQmlNetworkAccessManagerFactory : public QObject,
public QQmlNetworkAccessManagerFactory {
Q_OBJECT
private:
QNetworkAccessManager* nam;
QList<QSslError> expectedSslErrors;
public:
explicit UltraQmlNetworkAccessManagerFactory();
~UltraQmlNetworkAccessManagerFactory();
virtual QNetworkAccessManager* create(QObject* parent);
public slots:
void onIgnoreSslErrors(QNetworkReply* reply, QList<QSslError> errors);
};
#endif
UltraQmlNetworkAccessManagerFactory.cpp:
#include "UltraQmlNetworkAccessManagerFactory.h"
UltraQmlNetworkAccessManagerFactory::UltraQmlNetworkAccessManagerFactory() {
}
UltraQmlNetworkAccessManagerFactory::~UltraQmlNetworkAccessManagerFactory() {
delete nam;
}
QNetworkAccessManager* UltraQmlNetworkAccessManagerFactory::create(QObject* parent) {
QNetworkAccessManager* nam = new QNetworkAccessManager(parent);
QObject::connect(nam, SIGNAL(sslErrors(QNetworkReply*, QList<QSslError>)),
this, SLOT(onIgnoreSslErrors(QNetworkReply*,QList<QSslError>))
);
return nam;
}
void UltraQmlNetworkAccessManagerFactory::onIgnoreSslErrors(QNetworkReply *reply, QList<QSslError> errors) {
for (int i = 0; i < errors.size(); i++) {
qDebug() << "e: " << errors.at(i) << endl;
}
reply->ignoreSslErrors(errors);
}
main.cpp 中还有一些胶水可以设置这个工厂被使用,我怀疑这部分是错误的来源,因为 qDebug 打印在输出中是可见的。
从函数/槽 onIgnoreSslErrors 中的 .cpp 文件中可以看出,我尝试忽略收到的每个错误(作为测试),但在输出中我没有得到预期的结果。
输出
e: "The certificate is self-signed, and untrusted"
qrc:/qml/file/ImageView.qml:16:5: QML Image: SSL handshake failed
我已经成功地从 C++ 直接使用 QSslConfiguration 创建了 QNetworkRequests,并指定了 TLSV1_0 和证书。由于我怀疑握手失败是因为一侧需要 SSL,而另一侧需要 TLS,因此我还尝试通过 QNetworkRequest 对象设置 QSslConfiguration reply->request();,但这并没有改变。
【问题讨论】:
-
尝试使用QSslConfiguration::setDefaultConfiguration()设置默认的SSL配置。