Seite 1 von 1

QHttp & Client Authentifizierung

Verfasst: 20. April 2008 22:54
von qtagent
Abend

Kann man mit QHttp auch eine Client authentifizierung durch ein Client Zertifikat durchzuführen?

So das es erfolgreich mit Apache Konfiguration (httpd-ssl.conf) arbeitet:

Code: Alles auswählen

SSLVerifyClient require
SSLVerifyDepth 2
Ich verwende zurzeit Qt 4.3.0 auf FreeBSD 6.2 Release.

Gruss
qtagent

Verfasst: 21. April 2008 07:37
von macman
Schau dir mal die configure Optionen an. Du wirst auf jeden Fall Qt neu übersetzen müssen.

Verfasst: 21. April 2008 20:08
von qtagent
Abend

Habe mir die Configure Optionen angeschaut, doch nichts gefunden und glaube auch nicht das dort die Lösung zu finden ist.

Ich habe generell an

Code: Alles auswählen

QSslSocket*sslSocket;
...
QHttp::setSocket(sslSocket);
...
gedacht, wobei dort das setzen eines Client Zertifikates via:

Code: Alles auswählen

sslSocket->setLocalCertificate("/home/User/client.pem",QSsl::Pem);
Leider auch nicht funktioniert hat.
Hat jemand sowas schon mal realisiert? Müsste ja generell irgendwie mit QSslSocket gehen oder?

Gruss
qtagent

Verfasst: 22. April 2008 07:41
von macman
qtagent hat geschrieben:Habe mir die Configure Optionen angeschaut, doch nichts gefunden und glaube auch nicht das dort die Lösung zu finden ist.
-openssl nicht gesehen? Und dann steht da noch was in der Doku zu QSslSocket:
Qt Doku hat geschrieben:This product uses software developed by the OpenSSL Project for use in the OpenSSL Toolkit. You can download the necessary software from http://www.openssl.org/.
Also, OpenSSL downloaden, nach Qt/src/network kopieren, neues configure mit -openssl und dann noch den QtNetwork-Part neu compilieren. Dann sollte es funktionieren, obwohl ich noch auf verzweifelter Suche nach einem Bug bin.

Verfasst: 22. Mai 2008 08:15
von qtagent
Morgen

Es hat nun Funktioniert :D

Gruss
qtagent

Verfasst: 22. Mai 2008 15:33
von macman
qtagent hat geschrieben:Es hat nun Funktioniert :D
Verrätst Du auch woran es gelegen hat?

Verfasst: 9. Juni 2008 05:20
von qtagent
Morgen
macman hat geschrieben:
qtagent hat geschrieben:Es hat nun Funktioniert :D
Verrätst Du auch woran es gelegen hat?
Ich hab Qt 4.4.0 mit "-openssl" compiliert, wobei ich kein OpenSSL Quellcode brauchte.
Das "-openssl" ist auch nur bei Windows nötig, auf FreeBSD ist das per default aktiviert.

Hab dann ein QDialog im Qt-Designer mit einiegen Widgets erstellt:

- QLineEdit für Pass Phrase.
- QPushButton für Download Button.
- ...

Im Konstruktor des Dialogs hab ich folgendes geschrieben:

Code: Alles auswählen

setupUi(this);
QHttp http=new QHttp(this);
QSslSocket sslSocket=new QSslSocket(this);
connect(sslSocket,SIGNAL(sslErrors(const QList<QSslError>&)),this,SLOT(sslSocketSslErrors(const QList<QSslError>&)))
http->setSocket(sslSocket);
...
Beim click Slot für das Download Button clicked SIGNAL hab ich folgendes geschrieben:

Code: Alles auswählen

sslSocket->addCaCertificates("ca-bundle.crt",QSsl::Pem);
sslSocket->setLocalCertificate("client-rsa.crt",QSsl::Pem);
if(!sslSocket->localCertificate().isValid())
	qFatal("Client Zertifikat ungültig.");
sslSocket->setPrivateKey("client-rsa.key",QSsl::Rsa,QSsl::Pem,lineEditPassPhrase->text().toLatin1());
...
Danach konnte ich problemlos mittels QHttp am Server authentifizieren und eine Datei herunterladen.

Die Zertifikate auf der Client Seite:

- Client Zertifikat: "client-rsa.crt".
- Client Private Key: "client-rsa.key".
- Server CA Zertifikat: "ca-bundle.crt".

Auf der Server Seite (Apache 2.2.3), müssen folgende Zertifikate vorhanden sein:

- Client CA Zertifikat.
- Server Zertifikat und Server Private Key.

Gruss
qtagent

P.S. Das schwierigste an der Ganzen sache ist eigentlich nur das Zertifikat und Private Key Chaos :shock:.