Problemi con SSL e richieste HTTPS
-
Ragazzi buonasera!
Sto affrontando un grosso problema con OpenSSL e QNetworkAccessManager.
Non che sia complicato, ma perchè proprio non riesco ad superarlo.Ho provato a creare una piccola applicazione per le richieste HTTPS, e quindi anche gestire eventuali errori, di comunicazione o di SSL.
Questo è il codice:
manager = new QNetworkAccessManager(); manager->setProxy(QNetworkProxy::NoProxy); connect(manager,&QNetworkAccessManager::finished,this,&alfro::managerFinished); connect(manager,&QNetworkAccessManager::sslErrors,this,&alfro::ignorsa); QSslConfiguration cfg(QSslConfiguration::defaultConfiguration()); cfg.setProtocol(QSsl::AnyProtocol); request.setSslConfiguration(cfg); request.setUrl(url); manager->get(request);
Dove "Ignorsa" è lo slot che cattura il segnale "sslErrors" e invece "managerFinished" è lo slot che cattura il segnale "finished" quando è tutto ok.
Il problema nasce quando l'unica risposta che mi ritorna è "QNetworkReply::SslHandshakeFailedError" con l'errorString "Handshake SSL non riuscito", ma proviene dallo slot managerFinished, sslErrors non viene emesso.
Ho provato alcuni URL, alcuni presi proprio da badssl per cercare di farmi visualizzare gli errori, ma anche il mio server locale che ha il certificato scaduto mi ritorna la stessa risposta, con nessuna indicazione di quale sia precisamente l'errore SSL.
Ad ogni modo, la cosa che mi fa uscire pazzo è che secondo la Documentazione quando la risposta va in "SSL Handshake failed error" il segnale sslErrors dovrebbe essere emesso, ma nel mio caso mai!
Sto utilizzando Qt 5.12.6 LTS con OpenSSL 1.1.1b (Feb 2019).
Idee?
Grazie mille!!
-
Invece di connettere il manager, connetti la singola risposta cosi' puoi gestire anche il segnale
error()
che ti permette di catturare la fattispecie che ti interessamanager = new QNetworkAccessManager(); manager->setProxy(QNetworkProxy::NoProxy); connect(manager,&QNetworkAccessManager::finished,this,&alfro::managerFinished); connect(manager,&QNetworkAccessManager::sslErrors,this,&alfro::ignorsa); QSslConfiguration cfg(QSslConfiguration::defaultConfiguration()); cfg.setProtocol(QSsl::AnyProtocol); request.setSslConfiguration(cfg); request.setUrl(url); QNetworkReply* reply = manager->get(request); // signature alfro::managerFinished(QNetworkReply*) connect(reply,&QNetworkReply::finished,this,std::bind(&alfro::managerFinished,this,reply)); // signature alfro::ignorsa(QNetworkReply*,const QList<QSslError>&) connect(reply,&QNetworkReply::sslErrors,this,std::bind(&alfro::ignorsa,this,reply, std::placeholders::_1)); // signature alfro::manageErrors(QNetworkReply*,QNetworkReply::NetworkError) connect(reply,&QNetworkReply::error,this,std::bind(&alfro::manageErrors,this,reply, std::placeholders::_1));