Seite 1 von 1

SOAP mit SSL uind eigenem Zertifikat

Verfasst: 20. Oktober 2009 15:42
von AuE
Hi,

bin grade dabei mich via QtSoap mit einer Anwendung zu verbinden.

Beimauswerten des Request erhalte ich die folgenden Infos(output durch qDebug):
Network transport error (6): SSL handshake failed
"Unknown error"
"SSL handshake failed"
Ok dachte ich mir ist ja aeindeutig ;-)

Code: Alles auswählen

  QSslConfiguration sslCfg;
     QFile cert ("/gui/cert/cacert.pem", this);
     sslCfg.setCaCertificates(QList<QSslCertificate>() << QSslCertificate( &cert));
     qDebug() << sslCfg.caCertificates();
     QNetworkAccessManager *manager = http.networkAccessManager();


     http.setHost("localhost",true, 50360);
     connect(manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*))
	     ,this, SLOT(authReq(QNetworkReply*,QAuthenticator*)));

     connect( manager,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(on_sslErr(QNetworkReply*,QList<QSslError>)));
     connect(manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), this,SLOT(on_proxyReq(QNetworkProxy,QAuthenticator*)));

     connect(&http, SIGNAL(responseReady()), SLOT(readResponse()));

Das connecten der Slots klappt, wird aber keiner ausserdem readResponse aufgerufen, und das Problem besteht weiter....von euch da jmd. mit einer Idee?

Verfasst: 20. Oktober 2009 17:40
von AuE
Also quasi meine Fragewäre wie gehe ich vor wenn ich ein SSL Zertifikat laden muss?

Code: Alles auswählen

 QFile file(":/cert/cacert.pem");
     if (!file.open(QIODevice::ReadOnly))
	     return;

     QSslCertificate cert(&file, QSsl::Pem);
     
     if(cert.isValid())
    {
	    QSslSocket sock(this);
	sock.setLocalCertificate( cert);
}

    http.setHost("localhost",true, 50360);
...
das bewirkt leider nicht....immernoch de Handshake fehler!

Verfasst: 21. Oktober 2009 09:10
von AuE
Also das Zertifikat kannich laden. Aber wie/wo setzen?

Code: Alles auswählen

void MainWindow::setUpSSL()
{
	QFile file(":/cert/server.pem");
/*QtSoapTransport http*/
	QNetworkReply *request = http.networkReply(); // this fails if this fct is called before first request
	Q_ASSERT(file.open(QIODevice::ReadOnly));
	QSslCertificate cert(&file, QSsl::Pem);

     if(cert.isValid() && !cert.isNull())
    {

	     qDebug() << "SSL proto before theset" << request->sslConfiguration().protocol();
	     QSslConfiguration sslConfiguration = request->sslConfiguration();
	     sslConfiguration.setLocalCertificate(cert);
//	     file.open(QIODevice::ReadOnly);
	     QSslKey key(&file, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
	     qDebug() << "key isNull ? " << key.isNull();
	     sslConfiguration.setPrivateKey(key);
	     sslConfiguration.setProtocol(QSsl::SslV2);
	     sslConfiguration.setPeerVerifyMode(QSslSocket::QueryPeer);
	     request->setSslConfiguration(sslConfiguration);
     }
    file.close();
}
Meine Fragen wären:

Wann soll ich die SSL Sachen setzen (da ich ja erst an den Networkreply nach mind. 1 Anfrage rankomme => den brauch ich ja damit ich nicht alles einstellen muss.
2.) Was muss ich tun damit meine Ssl cfg genutzt wird?


Ich habe im netz folgenden Code gefunden der auch für mich Grundlage war:

Code: Alles auswählen

qDebug() << "setting up SSL configuration: " << m_sslKeyFile;
        QSslConfiguration sslConfiguration = request.sslConfiguration();
        QFile sslCertificateFile(m_sslKeyFile);
        if (sslCertificateFile.open(QIODevice::ReadOnly))
        {
          QSslCertificate certif(&sslCertificateFile);
          sslCertificateFile.close();
          if (certif.isNull())
          {
            qDebug() << "Failed to load certificate";
          }
          qDebug() << "certif version=" << certif.version() << ", serial=" << certif.serialNumber() 
                    << ", issuer=" << certif.issuerInfo(QSslCertificate::Organization) 
                    << " and subject=" << certif.subjectInfo(QSslCertificate::CommonName);
          sslConfiguration.setLocalCertificate(certif);
          sslCertificateFile.close();
          sslCertificateFile.open(QIODevice::ReadOnly);
          QSslKey key(&sslCertificateFile, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
          qDebug() << "key isNull ? " << key.isNull();
          sslConfiguration.setPrivateKey(key);
          sslConfiguration.setProtocol(QSsl::SslV2);
          sslConfiguration.setPeerVerifyMode(QSslSocket::QueryPeer);
          request.setSslConfiguration(sslConfiguration);
        }
 ...
      qDebug() << "send post";
      m_networkReply = m_networkAccessManager->post(request, m_tempFile); // m_networkAccessManager est QNetworkAccessManager
...
void QSoapServiceClient::slotNetworkReplyError(QNetworkReply::NetworkError)
{
  qDebug() << "QSoapServiceClient::slotNetworkReplyError: " << m_networkReply->errorString();
  m_answer = "";
}

Die XML AW sieht wie folgt aus:
"<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" >
<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<Faultcode xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" >SOAP-ENV:Client</Faultcode>
<Faultstring xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" >Network transport error (6): SSL handshake failed</Faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
"