Serveur et client SSL
Mise en place d'un réseau d'objets distants sécurisé à l'aide de QSslSockets.
Le cryptage des communications est essentiel lorsque vous devez faire transiter des données par un réseau dont vous n'avez pas le contrôle total. Les deux applications de cet exemple montrent comment partager des objets distants via une connexion SSL et comment y accéder.

Le sslserver et le sslcppclient utilisent tous deux un certificat d'autorité de certification racine personnalisé pour valider leurs certificats respectifs, tous situés dans sslserver/cert.
Serveur SSL
Le serveur sslserver est configuré avec des certificats et une clé privée.
auto config = QSslConfiguration::defaultConfiguration() ; config.setCaCertificates(QSslCertificate::fromPath(QStringLiteral(":/sslcert/rootCA.pem")) ;)QFile certificateFile(QStringLiteral(":/sslcert/server.crt")) ;if (certificateFile.open(QIODevice::ReadOnly | QIODevice::Text)) config.setLocalCertificate(QSslCertificate(certificateFile.readAll(), QSsl::Pem)) ;else qFatal("Could not open certificate file"); QFile keyFile(QStringLiteral(":/sslcert/server.key")) ;if (keyFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QSslKey key(keyFile.readAll(), QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey) ; if (key.isNull()) qFatal("Key is not valid"); config.setPrivateKey(key) ; } else { qFatal("Could not open key file"); } config.setPeerVerifyMode(QSslSocket::VerifyPeer) ;QSslConfiguration::setDefaultConfiguration(config) ;
Il crée ensuite un objet QRemoteObjectHost et un objet QSslServer. L'objet QSslServer écoute sur le port 65511. Ensuite, setHostUrl est appelé sur l'objet QRemoteObjectHost avec l'URL de l'objet QSslServer.
QRemoteObjectHost host; QSslServer server; server.listen(QHostAddress::Any, 65511); host.setHostUrl(server.serverAddress().toString(), QRemoteObjectHost::AllowExternalRegistration);
Un lambda est utilisé pour gérer le signal errorOccurred en envoyant l'erreur au terminal. Un deuxième lambda est connecté au signal pendingConnectionAvailable, qui connecte un gestionnaire d'erreurs, et appelle addHostSideConnection sur l'objet QRemoteObjectHost avec le socket entrant comme argument pour que l'objet hôte utilise le socket pour la communication.
QObject::connect(&server, &QSslServer::errorOccurred, [](QSslSocket*socket, QAbstractSocket::SocketError error) { Q_UNUSED(socket); qDebug() << "QSslServer::errorOccurred" << error; }) ;QObject::connect(&server, &QSslServer::pendingConnectionAvailable, [&server, &host]() { qDebug() << "New connection available"; QSslSocket *socket = qobject_cast<QSslSocket *>(server.nextPendingConnection()) ; Q_ASSERT(socket) ; QObject::connect(socket, &QSslSocket::errorOccurred, [](QAbstractSocket::SocketError error error) { qDebug() << "QSslSocket::error" << error; }) ; host.addHostSideConnection(socket) ; }) ;
Enfin, un objet MinuteTimer est créé et enableRemoting est appelé sur l'objet QRemoteObjectHost avec l'objet MinuteTimer comme argument pour permettre son partage.
MinuteTimer timer; host.enableRemoting(&timer);
Client SSL
Le client sslcppclient définit le certificat de l'autorité de certification racine, puis crée un objet Tester.
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); auto config = QSslConfiguration::defaultConfiguration(); config.setCaCertificates(QSslCertificate::fromPath(QStringLiteral(":/sslcert/rootCA.pem"))); QSslConfiguration::setDefaultConfiguration(config); Tester t; return a.exec(); }
Dans le constructeur du testeur, un objet temporaire QRemoteObjectNode est créé, et setupConnection est utilisé pour créer et configurer un objet QSslSocket. Un gestionnaire d'erreurs est connecté et l'objet QSslSocket est utilisé par l'objet QRemoteObjectNode en appelant addClientSideConnection.
QRemoteObjectNode m_client ;auto socket = setupConnection() ; connect(socket, &QSslSocket::errorOccurred,socket, [](QAbstractSocket::SocketError error error){ qDebug() << "QSslSocket::error" << error; }) ; m_client.addClientSideConnection(socket) ;
Ensuite, trois QScopedPointer membres de la classe Tester sont connectés à trois répliques de MinuteTimer en utilisant acquire sur l'objet QRemoteObjectNode. Enfin, QTimer::singleShot est utilisé quatre fois pour appeler reset après un délai.
ptr1.reset(m_client.acquire< MinuteTimerReplica >()); ptr2.reset(m_client.acquire< MinuteTimerReplica >()); ptr3.reset(m_client.acquire< MinuteTimerReplica >()); QTimer::singleShot(0, this, &Tester::clear); QTimer::singleShot(1, this, &Tester::clear); QTimer::singleShot(10000, this, &Tester::clear); QTimer::singleShot(11000, this, &Tester::clear);
Lorsque Tester::clear est appelé les trois premières fois, on vérifie qu'un pointeur est lié, puis on le réinitialise, pour un pointeur différent à chaque fois. Lorsqu'il est appelé pour la quatrième fois, il provoque l'abandon de l'application.
void clear() { static int i = 0; if (i == 0) { i++; if (ptr1.isNull()) qCritical() << "Pointer 1 was not set"; ptr1.reset() ; } else if (i == 1) { i++; if (ptr2.isNull()) qCritical() << "Pointer 2 was not set"; ptr2.reset() ; } else if (i == 2) { i++; if (ptr3.isNull()) qCritical() << "Pointer 3 was not set"; ptr3.reset() ; } else { qApp->quit() ; } }
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.