QNetworkRequest con certificado local ssl
Necesito intercambiar datos con el servidor que requiere un certificado local (archivo .crt). Intento esto:
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>)));
Cuando se ejecuta este código, tengo los siguientes mensajes en WireShark (filtro: 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)
Esto se espera: el código para aplicar el certificado está comentado, pero lo extraño es que no recibo ningún error de SSL de mi QNetworkAccessManager y QNetworkReply (ranuras printSslErrors e printSslErrors2).
Si descomento alguna de estas 3 líneas:
//QSslConfiguration::setDefaultConfiguration(sslConf);
//QSslSocket::addDefaultCaCertificate(certs.first());
//loginRequest.setSslConfiguration(sslConf);
No obtengo NADA en wireshark (pocos mensajes SYN, ACK y FIN tcp, pero no hay tráfico http o ssl). Además, todavía no hay errores de QNetworkAccessManager y QNetworkReply, por lo que no tengo idea de lo que está sucediendo mal.
¿Hay alguna posibilidad de hacer que Qt acepte mi certificado local o que exista alguna lib orientada a 3d party qt para ayudarme?
P.S .: btw - ssl y https funcionaron bien hace unos días, antes de que se cambiara el servidor para requerir certificados del lado del cliente.
P.P.S .: el certificado es autofirmado si hace alguna diferencia. También traté de 'instalarlo' (el archivo p12) en el sistema y tanto Chrome como IE7 pueden usarlo y comunicarse con el servidor.