Seite 1 von 1

QSslSocket Hilfe

Verfasst: 31. Oktober 2007 04:18
von qtagent
Morgen

Ich hab mit QSslSocket von Qt 4.3 ein Client und Server programmiert. Es funktionierte problemlos. Danach hab ich den Threaded Fortune Server aus den Qt Bsp. abgeschrieben um QSslSocket auf basis dieses Bsp. Thread fähig zu machen. Leider hat das nicht geklappt, bzw. der Server arbeitet mit "startServerEncryption" im Thread nicht korrekt. Kennt jemand ein Tutorial, Bsp. Code etc. für QSslSocket für Client und Server mit Thread support auf Qt 4.3 beim Server?

Im Internet hab ich bisher noch kein einzigen Bsp. Code für QSslSocket für Qt 4.3 mit Thread support für Server gefunden :(.

Gruss
qtagent

Verfasst: 31. Oktober 2007 07:22
von macman
Einer muss den Anfang machen, viel Glück :-)

Verfasst: 31. Oktober 2007 22:22
von qtagent
Abend

Ich bin nun ein bischen weiter gekommen, im folgend ist der Code für Client und Server:

Client:
- clientMain.cpp

Code: Alles auswählen

#include<myClient>
#include<myException>
#include<iostream>
#include<QCoreApplication>
#include<QSettings>

int main(int argc,char*argv[]){
	QCoreApplication coreApplication(argc,argv);
	try{
		static myClient client;
		if(false==coreApplication.connect(&client, SIGNAL(connected()),&client,SLOT(connected())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client, SIGNAL(disconnected()),&client,SLOT(disconnected())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client, SIGNAL(encrypted()),&client,SLOT(encrypted())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client, SIGNAL(error(QAbstractSocket::SocketError)),&client,SLOT(error(QAbstractSocket::SocketError))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client, SIGNAL(hostFound()),&client,SLOT(hostFound())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client, SIGNAL(modeChanged(QSslSocket::SslMode)),&client,SLOT(modeChanged(QSslSocket::SslMode))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*)),&client,SLOT(proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client,SIGNAL(readyRead()),&client,SLOT(readyRead())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client,SIGNAL(sslErrors(const QList<QSslError>&)),&client,SLOT(sslErrors(const QList<QSslError>&))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==coreApplication.connect(&client,SIGNAL(stateChanged(QAbstractSocket::SocketState)),&client,SLOT(stateChanged(QAbstractSocket::SocketState))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		client.connectToHostEncrypted("127.0.0.1",12345);
		if(false==client.waitForEncrypted())
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Warten auf Verschlüsselung fehlgeschlagen."));
	}catch(myException exception){
		exception.output();
		return 0;
	}
	return coreApplication.exec();
}
- myClient.h

Code: Alles auswählen

#ifndef MYCLIENT_H
#define MYCLIENT_H

#ifndef BUILD_DLL
	#define EXPORT_DLL
#else
	#define EXPORT_DLL Q_DECL_EXPORT
#endif

#include<QSslSocket>

class EXPORT_DLL myClient:public QSslSocket{
	Q_OBJECT
public slots:
	void connected();
	void disconnected();
	void encrypted();
	void error(QAbstractSocket::SocketError);
	void hostFound();
	void modeChanged(QSslSocket::SslMode);
	void proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*);
	void readyRead();
	void sslErrors(const QList<QSslError>&);
	void stateChanged(QAbstractSocket::SocketState);
};

#endif
- myClient.cpp

Code: Alles auswählen

#include<myClient>
#include<myException>
#include<QTranslator>
#include<iostream>
void myClient::connected(){
	std::cout<<"myClient::connected()"<<std::endl;
}

void myClient::disconnected(){
	std::cout<<"myClient::disconnected()"<<std::endl;
}

void myClient::encrypted(){
	std::cout<<"myClient::encrypted()"<<std::endl;
}

void myClient::error(QAbstractSocket::SocketError socketError){
	try{
		switch(socketError){
		case QAbstractSocket::UnknownSocketError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! An unidentified error occurred."));
		case QAbstractSocket::ConnectionRefusedError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The connection was refused by the peer (or timed out)."));
		case QAbstractSocket::RemoteHostClosedError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The remote host closed the connection. Note that the client socket (i.e., this socket) will be closed after the remote close notification has been sent."));
		case QAbstractSocket::HostNotFoundError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The host address was not found."));
		case QAbstractSocket::SocketAccessError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The socket operation failed because the application lacked the required privileges."));
		case QAbstractSocket::SocketResourceError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The local system ran out of resources (e.g., too many sockets)."));
		case QAbstractSocket::SocketTimeoutError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The socket operation timed out."));
		case QAbstractSocket::DatagramTooLargeError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The datagram was larger than the operating system's limit (which can be as low as 8192 bytes)."));
		case QAbstractSocket::NetworkError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! An error occurred with the network (e.g., the network cable was accidentally plugged out)."));
		case QAbstractSocket::AddressInUseError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The address specified to QUdpSocket::bind() is already in use and was set to be exclusive."));
		case QAbstractSocket::SocketAddressNotAvailableError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The address specified to QUdpSocket::bind() does not belong to the host."));
		case QAbstractSocket::UnsupportedSocketOperationError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The requested socket operation is not supported by the local operating system (e.g., lack of IPv6 support)."));
		case QAbstractSocket::ProxyAuthenticationRequiredError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The socket is using a proxy, and the proxy requires authentication."));
		default:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error!"));
		}
	}catch(myException exception){
		myException(exception.filename(),exception.line(),exception.message()+QTranslator::tr(" %1.").arg(errorString())).output();
	}
}

void myClient::hostFound(){
	std::cout<<"myClient::hostFound()"<<std::endl;
}

void myClient::modeChanged(QSslSocket::SslMode mode){
	std::cout<<"myClient::modeChanged(QSslSocket::SslMode)"<<std::endl;
}

void myClient::proxyAuthenticationRequired(const QNetworkProxy&proxy,QAuthenticator*authenticator){
	std::cout<<"myClient::proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*)"<<std::endl;
}

void myClient::readyRead(){
std::cout<<"myServerThread::readyRead()"<<std::endl;
	if(1>bytesAvailable()){
		myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Daten nicht verfügbar.")).output();
		return;
	}
	QByteArray byteArray=readAll();
	std::cout<<QString(byteArray).toStdString()<<std::endl;
}

void myClient::sslErrors(const QList<QSslError>&errors){
std::cout<<"myClient::sslErrors()"<<std::endl;
	for(int i=0;i<errors.size();i++)
		try{
			switch(errors.at(i).error()){
			case QSslError::NoError:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! No Error."));
			case QSslError::UnableToGetIssuerCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to get issuer certificate."));
			case QSslError::UnableToDecryptCertificateSignature:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to decrypt certificate signature."));
			case QSslError::UnableToDecodeIssuerPublicKey:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to decode issuer public key."));
			case QSslError::CertificateSignatureFailed:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate signature failed."));
			case QSslError::CertificateNotYetValid:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate not yet valid."));
			case QSslError::CertificateExpired:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate expired."));
			case QSslError::InvalidNotBeforeField:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Invalid not before filed."));
			case QSslError::InvalidNotAfterField:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Invalid not after field."));
			case QSslError::SelfSignedCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Self signed certificate."));
			case QSslError::SelfSignedCertificateInChain:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Self signed certificate in chain."));
			case QSslError::UnableToGetLocalIssuerCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to get local issuer certificate."));
			case QSslError::UnableToVerifyFirstCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to verify first certificate."));
			case QSslError::CertificateRevoked:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate revoked."));
			case QSslError::InvalidCaCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Invalid CA Certificate."));
			case QSslError::PathLengthExceeded:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Path length exceeded."));
			case QSslError::InvalidPurpose:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Invalid purpose."));
			case QSslError::CertificateUntrusted:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate untrusted."));
			case QSslError::CertificateRejected:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate rejected."));
			case QSslError::SubjectIssuerMismatch:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Subject issuer mismatch."));
			case QSslError::AuthorityIssuerSerialNumberMismatch:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Authority issuer serial number missmatch."));
			case QSslError::NoPeerCertificate:
				ignoreSslErrors();
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! No peer certificate."));
			case QSslError::HostNameMismatch:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Host name mismatch."));
			case QSslError::UnspecifiedError:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unspecified error."));
			case QSslError::NoSslSupport:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! No ssl support."));
			default:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error!").arg(errors.at(i).errorString()));
			}
		}catch(myException exception){
			myException(exception.filename(),exception.line(),exception.message()+QTranslator::tr(" %1.").arg(errors.at(i).errorString())).output();
		}
}

void myClient::stateChanged(QAbstractSocket::SocketState socketState){
	std::cout<<"myClient::stateChanged(QAbstractSocket::SocketState)"<<std::endl;
}
Server:
- serverMain.cpp

Code: Alles auswählen

#include<myException>
#include<myServer>
#include<QCoreApplication>
#include<QSettings>
#include<QStringList>
#include<QTranslator>

int main(int argc,char*argv[]){
	QCoreApplication coreApplication(argc,argv);
	try{
		static myServer server;
		if(false==server.listen(QHostAddress::Any,12345))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! %1.").arg(server.errorString()));
	}catch(myException exception){
		exception.output();
		return 0;
	}
	return coreApplication.exec();
}
- myServer.h

Code: Alles auswählen

#ifndef MYSERVER_H
#define MYSERVER_H

#ifndef BUILD_DLL
	#define EXPORT_DLL
#else
	#define EXPORT_DLL Q_DECL_EXPORT
#endif

#include<QTcpServer>

class EXPORT_DLL myServer:public QTcpServer{
	Q_OBJECT
public:
	myServer(QObject*parent=0);
protected:
	virtual void incomingConnection(int);
};

#endif
- myServer.cpp

Code: Alles auswählen

#include<myException>
#include<myServer>
#include<myServerThread>
#include<QTranslator>

myServer::myServer(QObject*parent):QTcpServer(parent){
}
#include<iostream>
void myServer::incomingConnection(int socketDescriptor){
std::cout<<"myServer::incomingConnection("<<QString::number(socketDescriptor).toStdString()<<")"<<std::endl;
	myServerThread*serverThread=new myServerThread(socketDescriptor,this);
	if(false==connect(serverThread,SIGNAL(finished()),serverThread,SLOT(deleteLater()))){
		myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen.")).output();
		return;
	}
	serverThread->start();
}
- myServerThread.h

Code: Alles auswählen

#ifndef myServerTHREAD_H
#define MYSERVERTHREAD_H

#ifndef BUILD_DLL
	#define EXPORT_DLL
#else
	#define EXPORT_DLL Q_DECL_EXPORT
#endif

#include<QThread>
#include<QSslSocket>

class EXPORT_DLL myServerThread:public QThread{
	Q_OBJECT
public:
	myServerThread(int,QObject*);
	void run();
public slots:
	void connected();
	void disconnected();
	void encrypted();
	void error(QAbstractSocket::SocketError);
	void hostFound();
	void modeChanged(QSslSocket::SslMode);
	void proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*);
	void readyRead();
	void sslErrors(const QList<QSslError>&);
	void stateChanged(QAbstractSocket::SocketState);
private:
	QSslSocket*sslSocket;
	int socketDescriptor;
};

#endif
- myServerThread.cpp

Code: Alles auswählen

#include<myException>
#include<myServerThread>
#include<QSettings>
#include<QTranslator>

myServerThread::myServerThread(int socketDescriptor,QObject*parent):QThread(parent),socketDescriptor(socketDescriptor){
	qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
	qRegisterMetaType<QList<QSslError> >("QList<QSslError>");
	qRegisterMetaType<QSslSocket::SslMode>("QSslSocket::SslMode");
	qRegisterMetaType<QAbstractSocket::SocketState>("QAbstractSocket::SocketState");
}
#include<iostream>
void myServerThread::connected(){
	std::cout<<"myServerThread::connected()"<<std::endl;
}

void myServerThread::disconnected(){
	std::cout<<"myServerThread::disconnected()"<<std::endl;
}

void myServerThread::encrypted(){
	std::cout<<"myServerThread::encrypted()"<<std::endl;
}

void myServerThread::error(QAbstractSocket::SocketError socketError){
	try{
		switch(socketError){
		case QAbstractSocket::UnknownSocketError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! An unidentified error occurred."));
		case QAbstractSocket::ConnectionRefusedError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The connection was refused by the peer (or timed out)."));
		case QAbstractSocket::RemoteHostClosedError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The remote host closed the connection. Note that the client socket (i.e., this socket) will be closed after the remote close notification has been sent."));
		case QAbstractSocket::HostNotFoundError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The host address was not found."));
		case QAbstractSocket::SocketAccessError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The socket operation failed because the application lacked the required privileges."));
		case QAbstractSocket::SocketResourceError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The local system ran out of resources (e.g., too many sockets)."));
		case QAbstractSocket::SocketTimeoutError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The socket operation timed out."));
		case QAbstractSocket::DatagramTooLargeError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The datagram was larger than the operating system's limit (which can be as low as 8192 bytes)."));
		case QAbstractSocket::NetworkError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! An error occurred with the network (e.g., the network cable was accidentally plugged out)."));
		case QAbstractSocket::AddressInUseError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The address specified to QUdpSocket::bind() is already in use and was set to be exclusive."));
		case QAbstractSocket::SocketAddressNotAvailableError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The address specified to QUdpSocket::bind() does not belong to the host."));
		case QAbstractSocket::UnsupportedSocketOperationError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The requested socket operation is not supported by the local operating system (e.g., lack of IPv6 support)."));
		case QAbstractSocket::ProxyAuthenticationRequiredError:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error! The socket is using a proxy, and the proxy requires authentication."));
		default:
			throw myException(__FILE__,__LINE__,QTranslator::tr("Error!"));
		}
	}catch(myException exception){
		myException(exception.filename(),exception.line(),exception.message()+QTranslator::tr(" %1.").arg(sslSocket->errorString())).output();
	}
}

void myServerThread::hostFound(){
	std::cout<<"myServerThread::hostFound()"<<std::endl;
}

void myServerThread::modeChanged(QSslSocket::SslMode mode){
	std::cout<<"myServerThread::modeChanged("<<QString::number(mode).toStdString()<<")"<<std::endl;
}

void myServerThread::proxyAuthenticationRequired(const QNetworkProxy&proxy,QAuthenticator*authenticator){
	std::cout<<"myServerThread::proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*)"<<std::endl;
}

void myServerThread::run(){
	sslSocket=new QSslSocket(0);
	try{
		if(false==sslSocket->setSocketDescriptor(socketDescriptor))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Sockel Deskriptor setzen fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(connected()),this,SLOT(connected())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(disconnected()),this,SLOT(disconnected())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(encrypted()),this,SLOT(encrypted())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(error(QAbstractSocket::SocketError))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(hostFound()),this,SLOT(hostFound())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(modeChanged(QSslSocket::SslMode)),this,SLOT(modeChanged(QSslSocket::SslMode))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*)),this,SLOT(proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(readyRead()),this,SLOT(readyRead())))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(sslErrors(const QList<QSslError>&)),this,SLOT(sslErrors(const QList<QSslError>&))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==connect(sslSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(stateChanged(QAbstractSocket::SocketState))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
		if(false==sslSocket->addCaCertificates("/pki/serverCA/ca.crt",QSsl::Pem))
			throw myException(__FILE__,__LINE__,"Fehler! CA Zertifikat kann nicht hinzugefügt werden.");
		sslSocket->setLocalCertificate("/pki/server.crt",QSsl::Pem);
		sslSocket->setPrivateKey("/pki/server.key",QSsl::Rsa);
		sslSocket->startServerEncryption();
		if(false==sslSocket->waitForDisconnected())
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Warten auf Verbindungstrennung fehlgeschlagen."));
	}catch(std::bad_alloc&){
		delete sslSocket;
		myException(__FILE__,__LINE__,"Fehler! Speicher Allokation fehlgeschlagen.").output();
	}catch(myException exception){
		delete sslSocket;
		exception.output();
	}
}

void myServerThread::readyRead(){
std::cout<<"myServerThread::readyRead()"<<std::endl;
	if(1>sslSocket->bytesAvailable()){
		myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Daten nicht verfügbar.")).output();
		return;
	}
	QByteArray byteArray=sslSocket->readAll();
	std::cout<<QString(byteArray).toStdString()<<std::endl;
}

void myServerThread::sslErrors(const QList<QSslError>&errors){
std::cout<<"myServerThread::sslErrors()"<<std::endl;
	for(int i=0;i<errors.size();i++)
		try{
			switch(errors.at(i).error()){
			case QSslError::NoError:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! No Error."));
			case QSslError::UnableToGetIssuerCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to get issuer certificate."));
			case QSslError::UnableToDecryptCertificateSignature:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to decrypt certificate signature."));
			case QSslError::UnableToDecodeIssuerPublicKey:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to decode issuer public key."));
			case QSslError::CertificateSignatureFailed:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate signature failed."));
			case QSslError::CertificateNotYetValid:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate not yet valid."));
			case QSslError::CertificateExpired:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate expired."));
			case QSslError::InvalidNotBeforeField:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Invalid not before filed."));
			case QSslError::InvalidNotAfterField:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Invalid not after field."));
			case QSslError::SelfSignedCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Self signed certificate."));
			case QSslError::SelfSignedCertificateInChain:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Self signed certificate in chain."));
			case QSslError::UnableToGetLocalIssuerCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to get local issuer certificate."));
			case QSslError::UnableToVerifyFirstCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unable to verify first certificate."));
			case QSslError::CertificateRevoked:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate revoked."));
			case QSslError::InvalidCaCertificate:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Invalid CA Certificate."));
			case QSslError::PathLengthExceeded:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Path length exceeded."));
			case QSslError::InvalidPurpose:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Invalid purpose."));
			case QSslError::CertificateUntrusted:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate untrusted."));
			case QSslError::CertificateRejected:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Certificate rejected."));
			case QSslError::SubjectIssuerMismatch:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Subject issuer mismatch."));
			case QSslError::AuthorityIssuerSerialNumberMismatch:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Authority issuer serial number missmatch."));
			case QSslError::NoPeerCertificate:
				sslSocket->ignoreSslErrors();
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! No peer certificate."));
			case QSslError::HostNameMismatch:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Host name mismatch."));
			case QSslError::UnspecifiedError:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! Unspecified error."));
			case QSslError::NoSslSupport:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error! No ssl support."));
			default:
				throw myException(__FILE__,__LINE__,QTranslator::tr("Error!").arg(errors.at(i).errorString()));
			}
		}catch(myException exception){
			myException(exception.filename(),exception.line(),exception.message()+QTranslator::tr(" %1.").arg(errors.at(i).errorString())).output();
		}
}

void myServerThread::stateChanged(QAbstractSocket::SocketState socketState){
	std::cout<<"myServerThread::stateChanged(QAbstractSocket::SocketState)"<<std::endl;
}
Der SSL Handshake funktioniert bzw. mit einem Sniffer (Wireshark) konnte ich das senden des Server Zertifikates zum Client sehen. Das problem ist nun, dass der Server den Client danach einfach disconnected.

Client ausgabe:
$ bin/client
myClient::stateChanged(QAbstractSocket::SocketState)
myClient::stateChanged(QAbstractSocket::SocketState)
myClient::hostFound()
myClient::stateChanged(QAbstractSocket::SocketState)
myClient::connected()
myClient::modeChanged(QSslSocket::SslMode)
Dateiname "src/myClient.cpp" bei Zeile "43" mit Nachricht: Error! The remote host closed the connection. Note that the client socket (i.e., this socket) will be closed after the remote close notification has been sent. The remote host closed the connection.
myClient::stateChanged(QAbstractSocket::SocketState)
myClient::stateChanged(QAbstractSocket::SocketState)
myClient::disconnected()
Dateiname "src/main.cpp" bei Zeile "70" mit Nachricht: Fehler! Warten auf Verschlüsselung fehlgeschlagen.
Server ausgabe:
$ bin/server
myServer::incomingConnection(10)
myServerThread::modeChanged(2)
myServerThread::sslErrors()
Dateiname "src/myServerthread.cpp" bei Zeile "220" mit Nachricht: Error! No peer certificate. The peer did not present any certificate.
myServerThread::stateChanged(QAbstractSocket::SocketState)
myServerThread::stateChanged(QAbstractSocket::SocketState)
myServerThread::disconnected()
Die Meldung
Dateiname "src/myServerthread.cpp" bei Zeile "220" mit Nachricht: Error! No peer certificate. The peer did not present any certificate.
wurde aber nach den Informationen von http://trolltech.com/developer/knowledg ... 4017857045 umgesetzt, indem

Code: Alles auswählen

sslSocket->ignoreSslErrors();
beim Client und Server in der sslErrors slot Funktion Abschnitt "QSslError::NoPeerCertificate:" eingetragen wurde.

Gruss
qtagent

Verfasst: 1. November 2007 07:34
von qtagent
Morgen

Das Problem ist nun gelöst :).
Datei myServerThread.cpp Code:

Code: Alles auswählen

		if(false==connect(sslSocket,SIGNAL(sslErrors(const QList<QSslError>&)),this,SLOT(sslErrors(const QList<QSslError>&))))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
...
ersetzen durch folgenden Code:

Code: Alles auswählen

...
		if(false==connect(sslSocket,SIGNAL(sslErrors(const QList<QSslError>&)),this,SLOT(sslErrors(const QList<QSslError>&)),Qt::DirectConnection))
			throw myException(__FILE__,__LINE__,QTranslator::tr("Fehler! Signal/Slot verbindung fehlgeschlagen."));
...
Gruss
qtagent