Je dois échanger des données avec le serveur qui nécessite un certificat local (fichier .crt). J'essaie ceci:QNetworkRequest avec certificat local 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>)));
Lorsque ce code exécute j'ai les messages suivants dans Wireshark (filtre: 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)
Cela devrait - 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écommenter l'une de ces 3 lignes:
//QSslConfiguration::setDefaultConfiguration(sslConf);
//QSslSocket::addDefaultCaCertificate(certs.first());
//loginRequest.setSslConfiguration(sslConf);
Je ne reçois rien dans Wireshark (quelques SYN, ACK et FIN messages tcp, mais pas le trafic HTTP ou ssl). En outre, il n'y a toujours pas d'erreurs de QNetworkAccessManager et QNetworkReply, donc je n'ai aucune idie ce qui ne va pas.
Y at-il une chance de faire Qt accepter mon certificat local ou peut-être il ya une partie 3d orientée qt-lib pour m'aider? P.S .: btw-ssl et https ont bien fonctionné 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 aussi essayé de 'l'installer' (le fichier p12) dans le système et à la fois Chrome et IE7 sont capables de l'utiliser et de communiquer avec le serveur.
1. Ceci est un QMainWindow, il obtient le signal de bouton de connexion (celui-ci commence connexion séquence) donc je ne vois pas pourquoi d'autres signaux pourraient être ignorés 2. Il n'y a pas d'erreurs avec les signaux/slots. Tbh la seule erreur que je sais (qui est rapportée dans la fenêtre de sortie applicatiion) est sur le signal et le slot n'existe pas ou a des paramètres erronés – DarkWalker
C'est bon si vous obtenez d'autres signaux dans votre classe QMainWindow. La vérification de la macro Q_OBJECT est la première chose que je fais quand j'ai des problèmes. J'espère que vous traquerez le vrai problème. – Matthew