QNetworkAccessManager: "SSL handshake failed"
Bonjour,
J'essaye d'accéder à un web service SOAP protégé par certificat (le certificat serveur est auto-signé ; le certificat client doit être présenté).
J'utilise Qt 4.5 de qt-copy (dans kde) mais j'avais le même problème avec Qt 4.4.x
J'utilise le code suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
qDebug() << "setting up SSL configuration: " << m_sslKeyFile;
QSslConfiguration sslConfiguration = request.sslConfiguration();
QFile sslCertificateFile(m_sslKeyFile);
if (sslCertificateFile.open(QIODevice::ReadOnly))
{
QSslCertificate certif(&sslCertificateFile);
sslCertificateFile.close();
if (certif.isNull())
{
qDebug() << "Failed to load certificate";
}
qDebug() << "certif version=" << certif.version() << ", serial=" << certif.serialNumber() << ", issuer=" << certif.issuerInfo(QSslCertificate::Organization) << " and subject=" << certif.subjectInfo(QSslCertificate::CommonName);
sslConfiguration.setLocalCertificate(certif);
sslCertificateFile.close();
sslCertificateFile.open(QIODevice::ReadOnly);
QSslKey key(&sslCertificateFile, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
qDebug() << "key isNull ? " << key.isNull();
sslConfiguration.setPrivateKey(key);
sslConfiguration.setProtocol(QSsl::SslV2);
sslConfiguration.setPeerVerifyMode(QSslSocket::QueryPeer);
request.setSslConfiguration(sslConfiguration);
}
...
qDebug() << "send post";
m_networkReply = m_networkAccessManager->post(request, m_tempFile); // m_networkAccessManager est QNetworkAccessManager
...
void QSoapServiceClient::slotNetworkReplyError(QNetworkReply::NetworkError)
{
qDebug() << "QSoapServiceClient::slotNetworkReplyError: " << m_networkReply->errorString();
m_answer = "";
} |
Et j'obtiens à l'exécution:
Code:
1 2 3 4 5 6 7
| setting up SSL configuration: "/path/to/pem/file"
certif version= "" , serial= "" , issuer= "xxx" and subject= "yyy"
key isNull ? false
send post
connecting reply signals
sent
QSoapServiceClient::slotNetworkReplyError: "SSL handshake failed" |
A noter: en utilisant un QProcess qui lance un curl avec les options -k et -E, ça marche... Donc le certificat est bon. C'est bien son utilisation dans mon code qui est mauvaise...
Une idée ?