gpt4 book ai didi

c++ - 带有 ssl 本地证书的 QNetworkRequest

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:19 25 4
gpt4 key购买 nike

我需要与需要本地证书(.crt 文件)的服务器交换数据。我试试这个:

loginRequest = QNetworkRequest(QUrl("https://somesite.com/login"));

QSslConfiguration sslConf = loginRequest.sslConfiguration();
QList<QSslCertificate> certs = QSslCertificate::fromPath(Preferences::certificatePath());
qDebug() << certs.first().issuerInfo(QSslCertificate::Organization); // prints name
sslConf.setLocalCertificate(certs.first());
qDebug() << "is valid " << sslConf.localCertificate().isValid(); // true
qDebug() << "is null " << sslConf.localCertificate().isNull(); // false
qDebug() << "protocol " << sslConf.protocol(); // 0
sslConf.setProtocol(QSsl::SslV3); // i also tried Qssl::AnyProtocol
qDebug() << "protocol " << sslConf.protocol(); // 0

// if i uncomment these i expect everithing to work
//QSslConfiguration::setDefaultConfiguration(sslConf);
//QSslSocket::addDefaultCaCertificate(certs.first());
//loginRequest.setSslConfiguration(sslConf);

QObject::connect(connectionManager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(printSslErrors2(QNetworkReply*,QList<QSslError>)));

m_reply = connectionManager->get(loginRequest);
QObject::connect(m_reply, SIGNAL(readyRead()), this, SLOT(getCookie()));
QObject::connect(m_reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(printSslErrors(QList<QSslError>)));

执行此代码时,我在 WireShark 中收到以下消息(过滤器:tcp && ssl && ip.addr == my_addr):

Client Hello
ServerHello, Certificate
Server Key Exchange, Certificate request, Server Hello Done
Alert (level: Warning, Description: no certificate), client key exchange, change cipher spec, encrypted handshake message
Alert (level: Fatal, Description: Handshake failure)

这是预期的 - 应用证书的代码被注释掉了,但奇怪的是 - 我没有从我的 QNetworkAccessManager 和 QNetworkReply(插槽 printSslErrors 和 printSslErrors2)中收到任何 ssl 错误。

如果我取消注释这 3 行中的任何一行:

 //QSslConfiguration::setDefaultConfiguration(sslConf);
//QSslSocket::addDefaultCaCertificate(certs.first());
//loginRequest.setSslConfiguration(sslConf);

我在 wireshark 中一无所获(很少有 SYN、ACK 和 FIN tcp 消息,但没有 http 或 ssl 流量)。此外,QNetworkAccessManager 和 QNetworkReply 仍然没有错误,所以我不知道出了什么问题。

有没有机会让 Qt 接受我的本地证书,或者可能有一些 3d party 面向 qt 的库可以帮助我?

P.S.:顺便说一句 - 在服务器更改为需要客户端证书之前,几天前 ssl 和 https 工作得很好。

P.P.S.:证书是自签名的,如果有任何区别的话。我还尝试将它(p12 文件)“安装”到系统中,Chrome 和 IE7 都可以使用它并与服务器通信。

最佳答案

在黑暗中完成拍摄并继续假设 Qt 实际上可能报告错误但您没有收到信号。

您正在连接来自 connectionManager 的信号至 this你包括了Q_OBJECTthis header 中的宏?

在运行应用程序时还要检查输出,因为 Qt 可能会报告连接信号/槽的问题(如果确实如此)。

关于c++ - 带有 ssl 本地证书的 QNetworkRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7506223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com