Je dois échanger des données avec un serveur qui nécessite un certificat local (fichier .crt). J'essaie ceci :
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>)));
Lorsque ce code s'exécute, j'ai les messages suivants dans WireShark (filter : 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)
C'est attendu - le code pour appliquer le certificat est commenté, mais la chose étrange - je ne reçois aucune erreur ssl de mon QNetworkAccessManager et QNetworkReply (slots printSslErrors et printSslErrors2).
Si je décommente une de ces 3 lignes :
//QSslConfiguration::setDefaultConfiguration(sslConf);
//QSslSocket::addDefaultCaCertificate(certs.first());
//loginRequest.setSslConfiguration(sslConf);
Je n'obtiens RIEN dans wireshark (quelques messages tcp SYN, ACK et FIN, mais aucun trafic http ou ssl). De plus, il n'y a toujours pas d'erreurs de QNetworkAccessManager et QNetworkReply, donc je n'ai aucune idée de ce qui ne va pas.
Existe-t-il une possibilité de faire en sorte que Qt accepte mon certificat local ou peut-être existe-t-il une librairie tierce orientée Qt pour m'aider ?
P.S. : btw - ssl et https fonctionnaient très bien il y a quelques jours, avant que le serveur ne soit modifié pour exiger des certificats côté client.
P.P.S. : le certificat est auto-signé si cela fait une différence. J'ai également essayé de l'installer (le fichier p12) dans le système et Chrome et IE7 sont capables de l'utiliser et de communiquer avec le serveur.