ローカル証明書(.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からsslエラーが発生しません(スロットprintSslErrorsとprintSslErrors2)。
これらの3行のいずれかをコメント解除した場合:
//QSslConfiguration::setDefaultConfiguration(sslConf);
//QSslSocket::addDefaultCaCertificate(certs.first());
//loginRequest.setSslConfiguration(sslConf);
Wiresharkでは何も表示されません(SYN、ACK、およびFINのtcpメッセージはほとんどありませんが、httpまたはsslトラフィックはありません)。また、QNetworkAccessManagerとQNetworkReplyからのエラーはまだないので、何が問題になっているのかはわかりません。
Qtに私のローカル証明書を受け入れさせる機会はありますか、それとも私を助けるためのサードパーティのqt指向のライブラリがあるかもしれませんか?
PS:ところで-sslとhttpsは、サーバーがクライアント側の証明書を要求するように変更される前は、数日前は問題なく機能していました。
PPS:違いが生じる場合、証明書は自己署名されます。また、それ(p12ファイル)をシステムに「インストール」しようとしましたが、ChromeとIE7の両方がそれを使用してサーバーと通信できます。