2014-10-14 8 views
8

Ich habe diese Ausgabe in zwei meine Qt-Anwendungen bemerkt, dass QNetworkRequest verwenden, um einige Daten von außen über QNeworkRequest zu laden:QSslSocket Fehler, wenn SSL nicht verwendet wird

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 

Ein Beispiel für die Anforderung, die diese Warnungen verursacht erscheinen ist

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

ich ziemlich sicher bin, dass es keine TLS/SSL in jeder der folgenden Abfragen beteiligt ist, alle Plain-HTTP sind. Die Nachrichten werden immer angezeigt, nachdem die erste Anforderung unabhängig von der URL ausgelöst wurde. Ich habe keine Absicht, SSL überhaupt zu umgehen, es gibt keine Erwähnung von SSL im Code, was bedeutet, dass ich die Warnungen nicht programmatisch ignorieren kann.

Mein Setup ist Windows 7 64 Bit, MSVC2013 und MinGW, Qt 5.3.2. Die Nachrichten werden unabhängig vom verwendeten Compiler angezeigt. Es sind keine OpenSSL- oder andere SSL-Entwicklungsbibliotheken installiert. Die Frage lautet: Wie kann ich diese Warnungen loswerden?

Antwort

15

Diese sind nur von qWarning() aufrufen, wenn OpenSSL-Funktionen aufgelöst werden. Es versucht nicht, diese Funktionen aufzurufen, sondern sie nur zu lösen. Der Aufruf nicht aufgelöster Funktionen würde stattdessen zu einer Warnung QSslSocket: cannot call unresolved function ... führen.

Die Warnung ist das Ergebnis der OpenSSL Funktionen durch einen Aufruf QSslSocket::supportsSsl() statisch in QNetworkAccessManager::supportedSchemesImplementation() zur Laufzeit aufgelöst werden, die Schemata unterstützt zurückgibt --- http und, wenn SSL https unterstützt.

Sie haben einige Optionen über diese Warnungen,

  1. sie ignorieren, weil Sie SSL ohnehin nicht wollen oder müssen OpenSSL
  2. recompile Qt mit -no-openssl weitergegeben configure
  3. Schiff so Funktionen aufgelöst werden und https wird verfügbar - wahrscheinlich nicht das, was Sie wollen
+0

Großartige Erklärung, danke! Normalerweise möchte ich nicht einfach ignorieren, was _my_ Programm ausgibt, aber es sieht hier wie die optimale Lösung aus. – Pavel

+3

Zusätzlich können Sie diese Nachrichten auch deaktivieren, indem Sie die Umgebungsvariable QT_LOGGING_RULES = qt.network.ssl.warning = false setzen –

+0

das ist aber nicht gut, ich sehe die Warnung besser und ignoriere sie, als verstecke ich sie später später vielleicht in Schwierigkeiten und Ich werde nicht wissen, was los ist, Warnungen helfen beim Debuggen. – Xsmael

1

Haben Sie versucht QSslSocket::ignoreSslErrors?

+1

Ich benutze QSslSocket nicht, ich habe keine, es zu benutzen auf Objekt deaktiviert werden. Es gibt keine Absicht, SSL überhaupt zu verwenden. Ich werde das in der ursprünglichen Antwort bearbeiten, um es klar zu machen. – Pavel

+0

Ich habe es versucht, und es behebt das Problem nicht: Warnungen werden immer noch angezeigt, Programm noch eingefroren. – Fylhan

+0

dito. Ich habe es auch versucht. – macetw

4

Wir hatten gelegentlich Kunden sehr sim ähnliche Warnmeldungen, aber auch die Software stürzte ab.

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 

Wir stellten fest, es war, weil, obwohl wir auch nicht die Verwendung von SSL wurden, das Programm eine Kopie von OpenSSL auf dem Computer des Kunden gefunden und versucht, mit ihm eine Schnittstelle. Die Version, die gefunden wurde, war jedoch zu alt (from Qt 5.2 onwards v1.0.0 oder später ist erforderlich).

Unsere Lösung bestand darin, die OpenSSL-DLLs zusammen mit unserer Anwendung zu verteilen (~ 1,65 MB). Die Alternative besteht darin, Qt von Grund auf ohne OpenSSL-Unterstützung zu kompilieren.

4

Kann ähnliche Warnmeldungen mit QLoggingCategory::setFilterRules("qt.network.ssl.w arning=false");

+0

Interessant, dass es sogar mit dem zusätzlichen Platz funktioniert. Und es funktioniert ohne die ".warning" insgesamt. Stelle dir das vor... – Machta