2012-04-10 6 views
4

Ich versuche, eine Ruheanforderung an einen Webservice zu senden, wo das Zertifikat selbstsigniert ist. Im Moment erstelle ich eine Anfrage, setze die URL und die Auth. Schlüssel als Kopfzeilen. Dann sage ich die Antwort dieses ssl Fehler zu ignorieren:QSslError: Das Zertifikat ist selbstsigniert und nicht vertrauenswürdig

QSslError error(QSslError::SelfSignedCertificate); 
QList<QSslError> expectedSslErrors; 
expectedSslErrors.append(error); 

QNetworkReply *reply = _accessManager.put(request, ""); // no requestbody 
reply->ignoreSslErrors(expectedSslErrors); 

Wenn ich es laufen bekomme ich folgende ssl Fehler:

9 - The certificate is self-signed, and untrusted

gefolgt von Netzwerkfehler nr 6:

Request failed with message: SSL handshake failed

Im Moment ignoriere ich ALLE Fehler, da es das einzige zu sein scheint, was funktioniert. Fühle dich schmutzig.

Wäre wirklich dankbar, wenn jemand weiß, was ich falsch mache!

EDIT:

geändert:

QList<QSslError> expectedSslErrors; 
expectedSslErrors.append(QSslError::SelfSignedCertificate); 
expectedSslErrors.append(QSslError::CertificateUntrusted); 
reply->ignoreSslErrors(expectedSslErrors); 

aber immer noch die gleichen Fehler ...

Antwort

3

The certificate is self-signed, and untrusted

Das Problem ist die "nicht vertrauenswürdig" -Teil. Sie müssen das selbstsignierte Zertifikat als zweiten Parameter von QSslError angeben.

Edit: Basierend auf den Quellcode, der Vergleich zwischen den tatsächlich empfangenen SSL-Fehler und die zu ignoreSslErrors weitergegeben Fehler durch den Vergleich sowohl den Fehlercode durchgeführt wird, und das Zertifikat.
Wenn also der von OpenSSL zurückgegebene Fehler ein Zertifikat enthält, wie bei QSslError::SelfSignedCertificate, müssen Sie immer ein Zertifikat an den Konstruktor QSslError übergeben, sonst würde der Vergleich fehlschlagen.

Sie können aber auch den Fehler manuell ignorieren, indem das Signal sslError() an einen Steckplatz, in dem Sie überprüfen, dass die Fehlerliste nur ein selbst enthält Zertifikat Fehler unterzeichnet und ignoreSslErrors() rufen Sie dann (ohne Parameter).

+0

was meinst du mit der Bereitstellung des Cert? Es ist eine Base64-codierte Zeichenfolge, die Teil der Auth ist. Header. nicht sicher, wie man das als ein Zertifikat zur Verfügung stellt – chikuba

+0

@chikuba Was Sie beschreiben, sieht eher wie die Basis-Authentifizierung, kein Zertifikat. Das Dokument zeigt, wie Sie das Zertifikat an 'QSslError' aus einer Datei übergeben können, [hier] (http://qt-project.org/doc/qt-4.8/qnetworkreply.html#ignoreSslErrors-2), und um das zu bekommen Datei, gehen Sie mit Ihrem Browser auf dem Server, und wenn Sie auf das Vorhängeschloss klicken, sollten Sie in der Lage sein, das Zertifikat herunterzuladen/zu exportieren. – alexisdm

+0

gibt es kein Zertifikat, das Vorhängeschloss ist überkreuzt. Die Site ist nicht vertrauenswürdig. dachte, dass, wenn Sie selbstsigniert verwendeten, Sie kein Zertifikat brauchten – chikuba