SOAP mit SSL uind eigenem Zertifikat

Alles rund um die Programmierung mit Qt
Antworten
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

SOAP mit SSL uind eigenem Zertifikat

Beitrag 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?
Zuletzt geändert von AuE am 21. Oktober 2009 12:17, insgesamt 1-mal geändert.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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!
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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>
"
Antworten