SOAP Webservice mit SSL: No certificates could be verified

Alles rund um die Programmierung mit Qt
Antworten
Tuxing
Beiträge: 52
Registriert: 28. Oktober 2009 11:13

SOAP Webservice mit SSL: No certificates could be verified

Beitrag von Tuxing »

Hallo zusammen,

ich habe ein großes Problem bei der Implementierung eines Webservice-Clients mit SSL. Zunächst hatte ich mir einen freien Webservice-Server ohne SSL im Netz gesucht und konnte den auch soweit verwenden. Bei der Verwendung von SSL habe ich allerdings ständig das Problem, dass meine benötigten Zertifikate von Qt nicht gefunden werden können. In meinem Quellcode hole ich mir die aktuelle Default-Konfiguration und erweitere die Liste der caCertificates um die beiden Zertifikate im Ordner "C:/certTest/".

Code: Alles auswählen


// PREPERATIONS
    connect(m_networkAccessManager,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),this,SLOT(slot_sslErrorsSlot(QNetworkReply*,QList<QSslError>)));
    	
    QBuffer *l_buffer = this->prepareRequestBuffer();
    QNetworkRequest l_request = this->prepareRequest();


// SSL CONFIG

    QSslConfiguration l_sslConfig = QSslConfiguration::defaultConfiguration();

    l_sslConfig.setProtocol(QSsl::TlsV1_0OrLater);
    l_sslConfig.setSslOption(QSsl::SslOptionDisableSessionTickets, true);
    l_sslConfig.setSslOption(QSsl::SslOptionDisableCompression, false);

    QList<QSslCertificate> l_certs = l_sslConfig.caCertificates();

    QDir l_caDir("C:/certTest/");
    QStringList l_certFilenames = l_caDir.entryList();

    for( int i=0; i<l_certFilenames.length(); i++)
    {
        if( l_certFilenames.at(i) != "." && l_certFilenames.at(i) != ".." )
        {
            QFile l_fileCert(l_caDir.absolutePath() + "/" + l_certFilenames.at(i));

            if(!l_fileCert.open(QIODevice::ReadOnly))
            {
                qDebug() << "Cannot open CA certificate!";
            }

            QSslCertificate l_cert(&l_fileCert,QSsl::Pem);
            l_fileCert.close();
            l_certs.append(l_cert);
        }
    }

    l_sslConfig.setCaCertificates(l_certs);

    QSslConfiguration::setDefaultConfiguration(l_sslConfig);

// POST MESSAGE

    QNetworkReply *l_reply = m_manager->post(l_request, l_buffer);

Da ich das Signal "sslErrors" vom QNetworkAccessManager mit einem meiner Slots verbunden habe kann ich folgenden SSL Fehler auslesen:

SSL ERROR
"The issuer certificate of a locally looked up certificate could not be found"
"No certificates could be verified"

Scheinbar kann Qt meine Zertifikate nicht finden. In Wireshark sieht das ganze dann so aus:

Code: Alles auswählen

1823	962.621597	172.28.254.191	10.39.5.181	TLSv1.2	571	Client Hello
1824	962.660543	10.39.5.181	172.28.254.191	TCP	54	443 → 61210 [ACK] Seq=1 Ack=518 Win=30336 Len=0
1825	962.664683	10.39.5.181	172.28.254.191	TLSv1.2	1420	Server Hello, Certificate
1826	962.664785	10.39.5.181	172.28.254.191	TLSv1.2	375	Server Key Exchange, Server Hello Done
1827	962.664811	172.28.254.191	10.39.5.181	TCP	54	61210 → 443 [ACK] Seq=518 Ack=1688 Win=16384 Len=0
1828	962.667858	172.28.254.191	10.39.5.181	TLSv1.2	180	Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
1829	962.706037	10.39.5.181	172.28.254.191	TLSv1.2	105	Change Cipher Spec, Encrypted Handshake Message
1830	962.746854	172.28.254.191	10.39.5.181	TCP	54	61210 → 443 [ACK] Seq=644 Ack=1739 Win=16128 Len=0
1831	962.748077	172.28.254.191	10.39.5.181	TCP	54	61210 → 443 [FIN, ACK] Seq=644 Ack=1739 Win=16128 Len=0
1832	962.785958	10.39.5.181	172.28.254.191	TLSv1.2	85	Encrypted Alert
Offensichtlich kann ich die codierte Handshake-Nachricht vom Server nicht decodieren und ich vermute das liegt daran, dass Qt die Zertifikate nicht akzeptiert. Teste ich den gleichen Webservice mit SoapUI (Kommerzielle Software zum testen eine SOAP Schnittstelle) funktioniert alles einwandfrei. Es muss also an meinem Qt Code liegen.

Qt-Version: 5.6.2
OpenSSL Build Version: 1.0.2g
OpenSSL Library Version: 1.0.2l

Zertifikatsname: CompanyEnterpriseCA02.pem , CompandyRootCA02.pem

Da ich kurz vor dem verzweifeln bin, bin ich um jede Hilfe dankbar.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: SOAP Webservice mit SSL: No certificates could be verified

Beitrag von Christian81 »

Kann QSslCertificate sie lesen? Dort gibt es eine Funktion 'bool QSslCertificate::isNull() const' .
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Tuxing
Beiträge: 52
Registriert: 28. Oktober 2009 11:13

Re: SOAP Webservice mit SSL: No certificates could be verified

Beitrag von Tuxing »

Ja die Abfrage auf isNull ergibt false.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: SOAP Webservice mit SSL: No certificates could be verified

Beitrag von Christian81 »

Mhhh
Was mit noch so einfällt - QSslConfiguration::setDefaultConfiguration() sollte vor dem Verbindungsaufbau etc. gesetzt werden - versuche mal es so früh wie möglich aufzurufen wo definitiv noch kein QNetworkAccessManager etwas getan hat.
Andere Ideen habe ich derzeit nicht... :(
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Tuxing
Beiträge: 52
Registriert: 28. Oktober 2009 11:13

Re: SOAP Webservice mit SSL: No certificates could be verified

Beitrag von Tuxing »

Hallo Christian,

besten Dank für deine Antworten. Ich bin letztendlich zum Ziel gekommen. Folgendes habe ich gemacht:

Auf deinen Hinweis hin habe ich die SSL Konfiguration so früh wie möglich gemacht (noch bevor die Instanz vom QNetworkAccessManager erstellt wird). Das hat allerdings noch zur gleichen Fehlermeldung geführt womit der Ansatz ausgeschlossen werden kann.

Dann habe ich mir die Fehlermeldungen nochmal genauer angeschaut:

"The issuer certificate of a locally looked up certificate could not be found"
"No certificates could be verified"

Im Zusammenhang mit dem Wireshark-Auszug kann man darauf schließen, dass der Server ein Zertifikat anfordert, dass ich zwar habe, aber dessen Herausgeberzertifikat besitze ich scheinbar nicht.

Nach einem Blick in die Hilfe von QSslConfiguration bin ich auf diese Funktion gestoßen: void QSslConfiguration::setPeerVerifyMode(QSslSocket::PeerVerifyMode mode)
Sets the verify mode to mode. This mode decides whether QSslSocket should request a certificate from the peer (i.e., the client requests a certificate from the server, or a server requesting a certificate from the client), and whether it should require that this certificate is valid.

The default mode is AutoVerifyPeer, which tells QSslSocket to use VerifyPeer for clients, QueryPeer for servers.
Da mir die Verifikation zunächst egal ist, habe ich die PeerVerifyMode zu "VerifyNone" gesetzt. Jetzt wird keine Verifizierung der Zertifikate mehr durchgeführt und die Kommunikation funktioniert einwandfrei. Ob das der richtige Weg ist und ob das andere Konsequenzen mit sich zieht kann ich noch nicht sagen. Dazu kenne ich mich auch mit Zertifikaten zu wenig aus. Aber für mich ist das Thema zunächst gelöst.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: SOAP Webservice mit SSL: No certificates could be verified

Beitrag von Christian81 »

Schön das es jetzt klappt und danke für die ausführliche Info - ist sicherlich hilfreich für andere :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten