2014-10-14 16 views
8

ho notato questa uscita in due delle mie applicazioni Qt che utilizzano QNetworkRequest caricare alcuni dati dall'esterno oltre QNeworkRequest:errore QSslSocket quando SSL non viene utilizzato

QSslSocket: cannot resolve TLSv1_1_client_method 
QSslSocket: cannot resolve TLSv1_2_client_method 
QSslSocket: cannot resolve TLSv1_1_server_method 
QSslSocket: cannot resolve TLSv1_2_server_method 
QSslSocket: cannot resolve SSL_select_next_proto 
QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb 
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated 

Un esempio della richiesta che provoca queste avvertenze per apparire è

QNetworkReply reply = m_nam->get(QNetworkRequest(QUrl("http://api.openweathermap.org/data/2.5/forecast?id=2835297&mode=xml"))); 

sono ragionevolmente sicuro che non ci sia TLS/SSL coinvolti in una qualsiasi delle query, tutti sono HTTP pianura. I messaggi vengono visualizzati sempre dopo l'invio della prima richiesta, indipendentemente dall'URL. Non ho alcuna intenzione di utilizzare SSL, non vi è alcuna menzione di SSL nel codice, il che significa che non posso ignorare gli avvisi programmaticamente.

La mia configurazione è Windows 7 64 bit, MSVC2013 e MinGW, Qt 5.3.2. I messaggi vengono visualizzati indipendentemente dal compilatore utilizzato. Non sono installate OpenSSL o altre librerie di sviluppo SSL.

E la domanda è: Come sbarazzarsi di questi avvisi?

risposta

15

Questi sono solo dalla chiamata qWarning() quando vengono risolte le funzioni OpenSSL. Non sta cercando di chiamare queste funzioni, ma solo risolverle. Chiamando le funzioni non risolte si otterrebbe invece l'avviso QSslSocket: cannot call unresolved function ....

L'avvertimento è risultato di funzioni OpenSSL essere risolto in fase di esecuzione da una chiamata al QSslSocket::supportsSsl() statica in QNetworkAccessManager::supportedSchemesImplementation() che restituisce supportato schemi --- http e, se SSL supportato https.

Hai alcune opzioni su questi avvertimenti,

  1. ignorarli, perché non si vuole o bisogno di SSL comunque
  2. ricompilazione Qt con -no-openssl passato a configure
  3. nave OpenSSL così le funzioni sono risolti e https diventa disponibile - probabilmente non è quello che desideri
+0

Ottima spiegazione, grazie! Di solito preferisco non ignorare chiaramente quali output del mio programma, ma sembra la soluzione ottimale qui. – Pavel

+3

Inoltre, è possibile disabilitare tali messaggi impostando la variabile ambientale QT_LOGGING_RULES = qt.network.ssl.warning = false –

+0

che non va bene, è meglio vedere l'avviso e ignorarli, piuttosto che nasconderlo, in seguito forse nei guai e Non saprò cosa sta succedendo, gli avvertimenti aiutano a eseguire il debug. – Xsmael

1
+1

io non uso QSslSocket, non ho alcun oggetto per usarlo su. Non vi è alcuna intenzione di utilizzare SSL. Lo modifico nella risposta originale per chiarire. – Pavel

+0

L'ho provato e non risolve il problema: gli avvisi appaiono ancora, il programma si sta ancora congelando. – Fylhan

+0

idem. Ci ho provato anche io. – macetw

4

A volte i clienti ottenevano molto sim i messaggi di avvertimento ilar ma il software stava anche andando in crash.

QSslSocket: cannot resolve TLSv1_1_client_method 
QSslSocket: cannot resolve TLSv1_2_client_method 
QSslSocket: cannot resolve TLSv1_1_server_method 
QSslSocket: cannot resolve TLSv1_2_server_method 
QSslSocket: cannot resolve SSL_select_next_proto 
QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb 
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated 
QMutex: destroying locked mutex 

abbiamo determinato che era perché, anche se non eravamo utilizzando SSL sia, il programma ha trovato una copia di OpenSSL sul computer del cliente e ha cercato l'interfacciamento con esso. La versione trovata era troppo vecchia (è richiesto from Qt 5.2 onwards v1.0.0 o successivo).

La nostra soluzione era distribuire le DLL OpenSSL insieme alla nostra applicazione (~ 1,65 MB). L'alternativa è compilare Qt da zero senza il supporto di OpenSSL.

4

può essere disabilitata messaggi di avviso correlati con QLoggingCategory::setFilterRules("qt.network.ssl.w arning=false");

+0

Interessante che funzioni anche con lo spazio extra. E funziona senza il ".warning" del tutto. Vai a capire... – Machta

Problemi correlati