class SSLClient: public QObject
{
Q_OBJECT
public:
SSLClient(QObject* parent = NULL)
: QObject(parent)
{
connect(&client, SIGNAL(encrypted()),
this, SLOT(connectionEstablished()));
connect(&client, SIGNAL(sslErrors(const QList<QSslError> &)),
this, SLOT(errorOccured(const QList<QSslError> &)));
}
void start(QString hostName, quint16 port)
{
client.setProtocol(QSsl::TlsV1);
client.connectToHostEncrypted(hostName, port);
}
public slots:
// handle the signal of QSslSocket.encrypted()
void connectionEstablished()
{
// get the peer's certificate
QSslCertificate cert = client.peerCertificate();
// write on the SSL connection
client.write("hello, world", 13);
}
// handle the signal of QSslSocket.sslErrors()
void errorOccured(const QList<QSslError> &error)
{
// simply ignore the errors
// it should be very careful when ignoring errors
client.ignoreSslErrors();
}
private:
QSslSocket client;
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
SSLClient client;
client.start("127.0.0.1", 8888);
return app.exec();
}
2) server
class SSLServer: public QTcpServer
{
Q_OBJECT
public:
SSLServer(QObject* parent = NULL)
: QTcpServer(parent)
{
}
void start(QString certPath, QString keyPath, quint16 port)
{
listen(QHostAddress::Any, port);
this->certPath = certPath;
this->keyPath = keyPath;
}
public slots:
void readyToRead()
{
qDebug() << serverSocket->readAll();
}
void errorOccured(const QList &)
{
serverSocket->ignoreSslErrors();
}
protected:
void incomingConnection(int socketDescriptor)
{
serverSocket = new QSslSocket;
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
connect(serverSocket, SIGNAL(readyRead()), this, SLOT(readyToRead()));
connect(serverSocket, SIGNAL(sslErrors(const QList &)),
this, SLOT(errorOccured(const QList &)));
serverSocket->setProtocol(QSsl::TlsV1);
serverSocket->setPrivateKey(keyPath);
serverSocket->setLocalCertificate(certPath);
serverSocket->startServerEncryption();
} else {
delete serverSocket;
}
}
private:
QSslSocket *serverSocket;
QString certPath;
QString keyPath;
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
SSLServer server;
server.start("ca.cer", "ca.key", 8888);
return app.exec();
}