我需要與需要本地證書(.crt文件)的服務器交換數據。 我試試這個:QNetworkRequest與SSL本地證書
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的NOTHING(幾SYN,ACK和FIN TCP消息,但沒有HTTP或SSL流量)。 QNetworkAccessManager和QNetworkReply仍然沒有錯誤,所以我沒有idia出了什麼問題。
是否有任何機會讓Qt接受我的本地證書或者可能是有一些3d方面的QT導向的lib來幫助我?
P.S .: btw - ssl和https在前幾天工作得很好,在服務器更改爲需要客戶端證書之前。
P.P.S .:證書是自簽名的,如果它有任何區別。另外我試圖將它(p12文件)「安裝」到系統中,並且Chrome和IE7都能夠使用它並與服務器進行通信。
1.這是一個QMainWindow的,它從登錄按鈕信號(這一個開始登錄序列),所以我不明白爲什麼其他信號可能會被忽略2.信號/插槽沒有錯誤。 Tbh我知道的唯一錯誤(在應用程序輸出窗口中報告)是關於信號並且插槽不存在或者參數錯誤 – DarkWalker
如果您將其他信號傳入QMainWindow類,這很好。在遇到問題時,檢查Q_OBJECT宏是我做的第一件事。希望你追蹤真正的問題。 – Matthew