QDtlsClientVerifier Class
Cette classe permet la génération et la vérification des cookies DTLS côté serveur. En savoir plus...
| En-tête : | #include <QDtlsClientVerifier> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
| qmake : | QT += network |
| Hérite de : | QObject |
- Liste de tous les membres, y compris les membres hérités
- QDtlsClientVerifier fait partie de l'API de programmation réseau.
Types publics
| struct | GeneratorParameters |
Fonctions publiques
| QDtlsClientVerifier(QObject *parent = nullptr) | |
| virtual | ~QDtlsClientVerifier() |
| QDtlsClientVerifier::GeneratorParameters | cookieGeneratorParameters() const |
| QDtlsError | dtlsError() const |
| QString | dtlsErrorString() const |
| bool | setCookieGeneratorParameters(const QDtlsClientVerifier::GeneratorParameters ¶ms) |
| QByteArray | verifiedHello() const |
| bool | verifyClient(QUdpSocket *socket, const QByteArray &dgram, const QHostAddress &address, quint16 port) |
Description détaillée
La classe QDtlsClientVerifier implémente la génération et la vérification des cookies DTLS côté serveur. Les protocoles de sécurité par datagrammes sont très vulnérables à divers types d'attaques par déni de service. Selon la RFC 6347, section 4.2.1, voici deux des types d'attaques les plus courants :
- Un attaquant transmet une série de requêtes d'initiation de handshake, ce qui oblige le serveur à allouer des ressources excessives et peut l'amener à effectuer des opérations cryptographiques coûteuses.
- Un attaquant transmet une série de requêtes d’initiation de handshake en falsifiant l’adresse source de la victime, ce qui oblige le serveur à agir comme un amplificateur. Normalement, le serveur répondrait à la machine de la victime par un message de certificat, qui peut être assez volumineux, inondant ainsi la machine de la victime de datagrammes.
Pour contrer ces attaques, la section 4.2.1 de la RFC 6347 propose une technique de cookie sans état qu’un serveur peut mettre en œuvre :
- En réponse au message ClientHello initial, le serveur envoie une requête HelloVerifyRequest contenant un cookie. Ce cookie est un hachage cryptographique généré à partir de l’adresse du client, du numéro de port et du secret du serveur (qui est une séquence d’octets pseudo-aléatoire cryptographiquement forte).
- Un client DTLS joignable est censé répondre par un nouveau message ClientHello contenant ce cookie.
- Lorsque le serveur reçoit le message ClientHello accompagné d’un cookie, il génère un nouveau cookie comme décrit ci-dessus. Ce nouveau cookie est comparé à celui figurant dans le message ClientHello.
- Si les cookies sont identiques, le client est considéré comme authentique et le serveur peut poursuivre la procédure de poignée de main TLS.
Remarque : un serveur DTLS n’est pas tenu d’utiliser les cookies DTLS.
QDtlsClientVerifier est conçu pour fonctionner en tandem avec QUdpSocket, comme le montre l'extrait de code suivant :
class DtlsServer : public QObject
{
public:
bool listen(const QHostAddress &address, quint16 port);
// ...
private:
void readyRead();
// ...
QUdpSocket serverSocket;
QDtlsClientVerifier verifier;
// ...
};
bool DtlsServer::listen(const QHostAddress &serverAddress, quint16 serverPort)
{
if (serverSocket.bind(serverAddress, serverPort))
connect(&serverSocket, &QUdpSocket::readyRead, this, &DtlsServer::readyRead);
return serverSocket.state() == QAbstractSocket::BoundState;
}
void DtlsServer::readyRead()
{
QByteArray dgram(serverSocket.pendingDatagramSize(), Qt::Uninitialized);
QHostAddress address;
quint16 port = {};
serverSocket.readDatagram(dgram.data(), dgram.size(), &address, &port);
if (verifiedClients.contains({address, port}) {
// This client was verified previously, we either continue the
// handshake or decrypt the incoming message.
} else if (verifier.verifyClient(&serverSocket, dgram, address, port)) {
// Apparently we have a real DTLS client who wants to send us
// encrypted datagrams. Remember this client as verified
// and proceed with a handshake.
} else {
// No matching cookie was found in the incoming datagram,
// verifyClient() has sent a ClientVerify message.
// We'll hear from the client again soon, if they're real.
}
}QDtlsClientVerifier n’impose aucune restriction quant à la manière dont l’application utilise QUdpSocket. Par exemple, il est possible d’avoir un serveur avec une seule instance QUdpSocket dans l’état QAbstractSocket::BoundState, gérant simultanément plusieurs clients DTLS :
- Vérifier si les nouveaux clients sont de véritables clients compatibles DTLS.
- Effectuer les handshakes TLS avec les clients vérifiés (voir QDtls).
- Déchiffrer les datagrammes provenant des clients connectés (voir QDtls).
- Envoi de datagrammes chiffrés aux clients connectés (voir QDtls).
Cela implique que `QDtlsClientVerifier` ne lit pas directement à partir d’un socket ; il attend plutôt que l’application lise un datagramme entrant, en extraie l’adresse et le port de l’expéditeur, puis transmette ces données à ` verifyClient()` (). Pour envoyer un message `HelloVerifyRequest`, ` verifyClient()` peut écrire dans le ` QUdpSocket`.
Remarque : QDtlsClientVerifier ne prend pas possession de l'objet QUdpSocket.
Par défaut, QDtlsClientVerifier obtient son secret à partir d’un générateur de nombres pseudo-aléatoires cryptographiquement fort.
Remarque : le secret par défaut est partagé par tous les objets des classes `QDtlsClientVerifier` et ` QDtls`. Comme cela peut présenter des risques de sécurité, la RFC 6347 recommande de changer fréquemment le secret du serveur. Veuillez consulter la section 4.2.1 de la RFC 6347 pour obtenir des conseils sur les implémentations possibles du serveur. Les paramètres du générateur de cookies peuvent être définis à l’aide des méthodes QDtlsClientVerifier::GeneratorParameters et setCookieGeneratorParameters() de la classe :
void DtlsServer::updateServerSecret()
{
const QByteArray newSecret(generateCryptoStrongSecret());
if (newSecret.size()) {
usedCookies.append(newSecret);
verifier.setCookieGeneratorParameters({QCryptographicHash::Sha1, newSecret});
}
}L'exemple de serveur DTLS illustre comment utiliser QDtlsClientVerifier dans une application serveur.
Voir également QUdpSocket, QAbstractSocket::BoundState, QDtls, verifyClient(), GeneratorParameters, setCookieGeneratorParameters(), cookieGeneratorParameters(), QDtls::setCookieGeneratorParameters(), QDtls::cookieGeneratorParameters(), QCryptographicHash::Algorithm, QDtlsError, dtlsError() et dtlsErrorString().
Documentation sur les fonctions membres
[explicit] QDtlsClientVerifier::QDtlsClientVerifier(QObject *parent = nullptr)
Crée un objet `QDtlsClientVerifier` ; ` parent ` est transmis au constructeur de ` QObject`.
[virtual noexcept] QDtlsClientVerifier::~QDtlsClientVerifier()
Supprime l'objet « QDtlsClientVerifier ».
QDtlsClientVerifier::GeneratorParameters QDtlsClientVerifier::cookieGeneratorParameters() const
Renvoie le secret et l'algorithme de hachage actuellement utilisés pour générer les cookies. L'algorithme de hachage par défaut est QCryptographicHash::Sha256 si Qt a été configuré pour le prendre en charge, QCryptographicHash::Sha1 dans le cas contraire. Le secret par défaut est obtenu à partir du générateur de nombres pseudo-aléatoires cryptographiquement fort spécifique au backend.
Voir également QCryptographicHash::Algorithm, QDtlsClientVerifier::GeneratorParameters et setCookieGeneratorParameters().
QDtlsError QDtlsClientVerifier::dtlsError() const
Renvoie la dernière erreur survenue ou la valeur « QDtlsError::NoError ».
Voir également QDtlsError et dtlsErrorString().
QString QDtlsClientVerifier::dtlsErrorString() const
Renvoie une description textuelle de la dernière erreur, ou une chaîne vide.
Voir aussi dtlsError().
bool QDtlsClientVerifier::setCookieGeneratorParameters(const QDtlsClientVerifier::GeneratorParameters ¶ms)
Définit la clé secrète et l'algorithme de hachage cryptographique à partir de params. Cette QDtlsClientVerifier les utilisera pour générer des cookies. Si la nouvelle clé secrète a une taille nulle, cette fonction renvoie false et ne modifie pas les paramètres du générateur de cookies.
Remarque : la clé secrète est censée être une séquence d'octets cryptographiquement sécurisée.
Voir également QDtlsClientVerifier::GeneratorParameters, cookieGeneratorParameters() et QCryptographicHash::Algorithm.
QByteArray QDtlsClientVerifier::verifiedHello() const
Fonction pratique. Renvoie le dernier message ClientHello dont la vérification a abouti, ou une instance vide de ` QByteArray ` si aucune vérification n'a été effectuée.
Voir également verifyClient().
bool QDtlsClientVerifier::verifyClient(QUdpSocket *socket, const QByteArray &dgram, const QHostAddress &address, quint16 port)
socket doit être un pointeur valide ; dgram doit être un datagramme non vide ; address ne peut être ni nul, ni de type diffusion (broadcast), ni de type multidiffusion (multicast). port correspond au port du pair distant. Cette fonction renvoie true si dgram contient un message ClientHello avec un cookie valide. Si aucun cookie correspondant n'est trouvé, verifyClient() enverra un message HelloVerifyRequest en utilisant socket et renverra false.
L'extrait de code suivant montre comment une application serveur peut vérifier la présence d'erreurs :
if (!verifier.verifyClient(&socket, message, address, port)) {
switch (verifyClient.dtlsError()) {
case QDtlsError::NoError:
// Not verified yet, but no errors found and we have to wait for the next
// message from this client.
return;
case QDtlsError::TlsInitializationError:
// This error is fatal, nothing we can do about it.
// Probably, quit the server after reporting the error.
return;
case QDtlsError::UnderlyingSocketError:
// There is some problem in QUdpSocket, handle it (see QUdpSocket::error())
return;
case QDtlsError::InvalidInputParameters:
default:
Q_UNREACHABLE();
}
}Voir également QHostAddress::isNull(), QHostAddress::isBroadcast(), QHostAddress::isMulticast(), setCookieGeneratorParameters() et cookieGeneratorParameters().
© 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.