Sur cette page

QDtls Class

Cette classe permet de chiffrer les sockets UDP. En savoir plus...

En-tête : #include <QDtls>
CMake : find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake : QT += network
Hérite de : QObject

Types publics

GeneratorParameters
enum HandshakeState { HandshakeNotStarted, HandshakeInProgress, PeerVerificationFailed, HandshakeComplete }

Fonctions publiques

QDtls(QSslSocket::SslMode mode, QObject *parent = nullptr)
virtual ~QDtls()
bool abortHandshake(QUdpSocket *socket)
QDtls::GeneratorParameters cookieGeneratorParameters() const
QByteArray decryptDatagram(QUdpSocket *socket, const QByteArray &dgram)
bool doHandshake(QUdpSocket *socket, const QByteArray &dgram = {})
QSslConfiguration dtlsConfiguration() const
QDtlsError dtlsError() const
QString dtlsErrorString() const
bool handleTimeout(QUdpSocket *socket)
QDtls::HandshakeState handshakeState() const
void ignoreVerificationErrors(const QList<QSslError> &errorsToIgnore)
bool isConnectionEncrypted() const
quint16 mtuHint() const
QHostAddress peerAddress() const
quint16 peerPort() const
QList<QSslError> peerVerificationErrors() const
QString peerVerificationName() const
bool resumeHandshake(QUdpSocket *socket)
QSslCipher sessionCipher() const
QSsl::SslProtocol sessionProtocol() const
bool setCookieGeneratorParameters(const QDtls::GeneratorParameters &params)
bool setDtlsConfiguration(const QSslConfiguration &configuration)
void setMtuHint(quint16 mtuHint)
bool setPeer(const QHostAddress &address, quint16 port, const QString &verificationName = {})
bool setPeerVerificationName(const QString &name)
bool shutdown(QUdpSocket *socket)
QSslSocket::SslMode sslMode() const
qint64 writeDatagramEncrypted(QUdpSocket *socket, const QByteArray &dgram)

Signaux

void handshakeTimeout()
void pskRequired(QSslPreSharedKeyAuthenticator *authenticator)
enum class QDtlsError { NoError, InvalidInputParameters, InvalidOperation, UnderlyingSocketError, RemoteClosedConnectionError, …, TlsNonFatalError }

Description détaillée

La classe QDtls permet d'établir une connexion sécurisée avec un pair réseau à l'aide du protocole UDP (User Datagram Protocol). Une connexion DTLS sur un protocole UDP essentiellement sans connexion implique que les deux pairs doivent d'abord effectuer avec succès une poignée de main TLS en appelant la fonction ` doHandshake()`. Une fois la négociation terminée, des datagrammes chiffrés peuvent être envoyés au pair à l’aide de la fonction ` writeDatagramEncrypted()`. Les datagrammes chiffrés provenant du pair peuvent être déchiffrés à l’aide de la fonction ` decryptDatagram()`.

QDtls est conçu pour fonctionner avec QUdpSocket. Étant donné que QUdpSocket peut recevoir des datagrammes provenant de différents pairs, une application doit implémenter un démultiplexage, en acheminant les datagrammes provenant de différents pairs vers leurs instances correspondantes de QDtls. Une association entre un pair réseau et son objet QDtls peut être établie à l’aide de l’adresse et du numéro de port du pair. Avant de lancer une poignée de main, l’application doit définir l’adresse et le numéro de port du pair à l’aide de la fonction setPeer().

QDtls ne lit pas les datagrammes provenant de ` QUdpSocket` ; cette tâche est censée être effectuée par l’application, par exemple dans un slot associé au signal ` QUdpSocket::readyRead()`. Ces datagrammes doivent ensuite être traités par QDtls.

Remarque : QDtls ne prend pas possession de l’objet QUdpSocket.

Normalement, plusieurs datagrammes doivent être reçus et envoyés par les deux pairs pendant la phase d’établissement de la connexion. Lors de la lecture des datagrammes, le serveur et le client doivent transmettre ces datagrammes à ` doHandshake()` jusqu’à ce qu’une erreur soit détectée ou que ` handshakeState()` renvoie l’ HandshakeComplete:

// A client initiates a handshake:
QUdpSocket clientSocket;
QDtls clientDtls;
clientDtls.setPeer(address, port, peerName);
clientDtls.doHandshake(&clientSocket);

// A server accepting an incoming connection; address, port, clientHello are
// read by QUdpSocket::readDatagram():
QByteArray clientHello(serverSocket.pendingDatagramSize(), Qt::Uninitialized);
QHostAddress address;
quin16 port = {};
serverSocket.readDatagram(clientHello.data(), clientHello.size(), &address, &port);

QDtls serverDtls;
serverDtls.setPeer(address, port);
serverDtls.doHandshake(&serverSocket, clientHello);

// Handshake completion, both for server and client:
void DtlsConnection::continueHandshake(const QByteArray &datagram)
{
    if (dtls.doHandshake(&udpSocket, datagram)) {
        // Check handshake status:
        if (dtls.handshakeStatus() == QDlts::HandshakeComplete) {
            // Secure DTLS connection is now established.
        }
    } else {
        // Error handling.
    }
}

Pour un serveur, le premier appel à ` doHandshake()` nécessite un datagramme non vide contenant un message `ClientHello`. Si le serveur utilise également ` QDtlsClientVerifier`, le premier message `ClientHello` doit être celui vérifié par ` QDtlsClientVerifier`.

Si l’identité du pair ne peut pas être validée pendant la poignée de main, l’application doit examiner les erreurs renvoyées par peerVerificationErrors() puis soit ignorer ces erreurs en appelant ignoreVerificationErrors(), soit interrompre la poignée de main en appelant abortHandshake(). Si les erreurs ont été ignorées, la poignée de main peut être reprise en appelant resumeHandshake().

Une fois la négociation terminée, des datagrammes peuvent être envoyés vers le pair réseau et reçus de celui-ci en toute sécurité :

// Sending an encrypted datagram:
dtlsConnection.writeDatagramEncrypted(&clientSocket, "Hello DTLS server!");

// Decryption:
QByteArray encryptedMessage(dgramSize);
socket.readDatagram(encryptedMessage.data(), dgramSize);
const QByteArray plainText = dtlsConnection.decryptDatagram(&socket, encryptedMessage);

Une connexion DTLS peut être fermée à l’aide de la fonction shutdown().

DtlsClient::~DtlsClient()
{
    clientDtls.shutdown(&clientSocket);
}

Avertissement : il est recommandé d’appeler shutdown() avant de détruire l’objet QDtls du client si vous prévoyez de réutiliser le même numéro de port pour vous connecter au serveur ultérieurement. Sinon, le serveur risque de rejeter les messages ClientHello entrants ; voir la RFC 6347, section 4.2.8, pour plus de détails et des conseils de mise en œuvre.

Si le serveur n’utilise pas ` QDtlsClientVerifier`, il doit configurer ses objets `QDtls` pour désactiver la procédure de vérification des cookies :

auto config = QSslConfiguration::defaultDtlsConfiguration();
config.setDtlsCookieVerificationEnabled(false);
// Some other customization ...
dtlsConnection.setDtlsConfiguration(config);

Un serveur qui utilise la vérification des cookies avec des paramètres de générateur non par défaut doit définir les mêmes paramètres pour son objet QDtls avant de lancer la négociation.

Remarque : le protocole DTLS laisse à l’application le soin de déterminer la taille maximale de transmission (PMTU) du chemin. L’application peut fournir la MTU à QDtls à l’aide de la fonction setMtuHint(). Cette recommandation ne concerne que la phase d’établissement de la connexion, car seuls les messages de cette phase peuvent être fragmentés et réassemblés par le protocole DTLS. Tous les autres messages envoyés par l’application doivent tenir dans un seul datagramme.

Remarque : les en-têtesspécifiques à DTLS ajoutent une surcharge aux données de l’application, ce qui réduit encore davantage la taille maximale des messages.

Avertissement : un serveur configuré pour répondre par une requête « HelloVerifyRequest » rejettera tous les messages « ClientHello » fragmentés et ne lancera jamais de handshake.

Les exemples de serveur DTLS et de client DTLS illustrent comment utiliser QDtls dans des applications.

Voir également QUdpSocket, QDtlsClientVerifier, HandshakeState, QDtlsError et QSslConfiguration.

Documentation sur les types de membres

[alias] QDtls::GeneratorParameters

enum QDtls::HandshakeState

Décrit l'état actuel de la négociation DTLS.

Cette énumération décrit l'état actuel de la négociation DTLS pour une connexion QDtls.

ConstanteValeurDescription
QDtls::HandshakeNotStarted0Rien n’a encore été effectué.
QDtls::HandshakeInProgress1La négociation a été lancée et aucune erreur n’a été détectée jusqu’à présent.
QDtls::PeerVerificationFailed2L'identité du pair n'a pas pu être établie.
QDtls::HandshakeComplete3La négociation s'est terminée avec succès et une connexion chiffrée a été établie.

Voir également QDtls::doHandshake() et QDtls::handshakeState().

Documentation des fonctions membres

[explicit] QDtls::QDtls(QSslSocket::SslMode mode, QObject *parent = nullptr)

Crée un objet QDtls ; la valeur « parent » est transmise au constructeur « QObject ». « mode » correspond à « QSslSocket::SslServerMode » pour une connexion DTLS côté serveur ou à « QSslSocket::SslClientMode » pour un client.

Voir également sslMode() et QSslSocket::SslMode.

[virtual noexcept] QDtls::~QDtls()

Supprime l'objet « QDtls ».

bool QDtls::abortHandshake(QUdpSocket *socket)

Interrompt la procédure d'établissement de connexion en cours. Renvoie « true » si une procédure était en cours sur socket; sinon, génère une erreur appropriée et renvoie « false ».

Voir également doHandshake() et resumeHandshake().

QDtls::GeneratorParameters QDtls::cookieGeneratorParameters() const

Renvoie l'algorithme de hachage et la clé secrète actuels, qu'il s'agisse des valeurs par défaut ou de celles précédemment définies via un appel à la fonction ` setCookieGeneratorParameters()`.

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. La clé secrète par défaut est obtenue à partir du générateur de nombres pseudo-aléatoires cryptographiquement fort spécifique au backend.

Voir également les fonctions QDtlsClientVerifier et setCookieGeneratorParameters().

QByteArray QDtls::decryptDatagram(QUdpSocket *socket, const QByteArray &dgram)

Déchiffre ` dgram ` et renvoie son contenu sous forme de texte clair. La phase d'établissement de la connexion doit être terminée avant que les datagrammes puissent être déchiffrés. Selon le type du message TLS, la connexion peut écrire dans ` socket`, qui doit être un pointeur valide.

bool QDtls::doHandshake(QUdpSocket *socket, const QByteArray &dgram = {})

Lance ou poursuit une négociation DTLS. ` socket ` doit être un pointeur valide. Lors du lancement d’une négociation DTLS côté serveur, ` dgram ` doit contenir le message `ClientHello` initial lu à partir de ` QUdpSocket`. Cette fonction renvoie ` true ` si aucune erreur n’a été détectée. L’état de la négociation peut être vérifié à l’aide de ` handshakeState()`. Le retour de ` false ` indique qu’une erreur s’est produite ; utilisez ` dtlsError()` pour obtenir des informations plus détaillées.

Remarque : si l’identité du pair ne peut pas être établie, l’erreur est définie sur QDtlsError::PeerVerificationError. Si vous souhaitez ignorer les erreurs de vérification et poursuivre la connexion, vous devez appeler ignoreVerificationErrors() puis resumeHandshake(). Si les erreurs ne peuvent pas être ignorées, vous devez appeler abortHandshake().

if (!dtls.doHandshake(&socket, dgram)) {
    if (dtls.dtlsError() == QDtlsError::PeerVerificationError)
        dtls.abortAfterError(&socket);
}

Voir également handshakeState(), dtlsError(), ignoreVerificationErrors(), resumeHandshake() et abortHandshake().

QSslConfiguration QDtls::dtlsConfiguration() const

Renvoie soit la configuration DTLS par défaut, soit la configuration définie lors d'un appel précédent à la fonction ` setDtlsConfiguration()`.

Voir également setDtlsConfiguration() et QSslConfiguration::defaultDtlsConfiguration().

QDtlsError QDtls::dtlsError() const

Renvoie la dernière erreur rencontrée par la connexion ou par QDtlsError::NoError.

Voir également dtlsErrorString() et QDtlsError.

QString QDtls::dtlsErrorString() const

Renvoie une description textuelle de la dernière erreur rencontrée par la connexion ou une chaîne vide.

Voir également la fonction ` dtlsError()`.

bool QDtls::handleTimeout(QUdpSocket *socket)

Si un délai d'attente est atteint pendant la phase d'établissement de la connexion, le signal ` handshakeTimeout()` est émis. L'application doit appeler la fonction `handleTimeout()` pour retransmettre les messages d'établissement de la connexion ; `handleTimeout()` renvoie ` true ` si un délai d'attente a été atteint, `false` dans le cas contraire. ` socket ` doit être un pointeur valide.

Voir également handshakeTimeout().

QDtls::HandshakeState QDtls::handshakeState() const

Renvoie l'état actuel de la négociation de connexion pour cette QDtls.

Voir également doHandshake() et QDtls::HandshakeState.

[signal] void QDtls::handshakeTimeout()

La perte de paquets peut entraîner des délais d'expiration pendant la phase d'établissement de la connexion. Dans ce cas, ` QDtls ` émet un signal `handshakeTimeout()`. Appelez ` handleTimeout()` pour retransmettre les messages d'établissement de la connexion :

DtlsClient::DtlsClient()
{
    // Some initialization code here ...
    connect(&clientDtls, &QDtls::handshakeTimeout, this, &DtlsClient::handleTimeout);
}

void DtlsClient::handleTimeout()
{
    clientDtls.handleTimeout(&clientSocket);
}

Voir également handleTimeout().

void QDtls::ignoreVerificationErrors(const QList<QSslError> &errorsToIgnore)

Cette méthode indique à QDtls de ne prendre en compte que les erreurs répertoriées à l'adresse errorsToIgnore.

Si, par exemple, vous souhaitez vous connecter à un serveur utilisant un certificat auto-signé, considérez l'extrait de code suivant :

QList<QSslCertificate> cert = QSslCertificate::fromPath("server-certificate.pem"_L1);
QSslError error(QSslError::SelfSignedCertificate, cert.at(0));
QList<QSslError> expectedSslErrors;
expectedSslErrors.append(error);

QDtls dtls;
dtls.ignoreVerificationErrors(expectedSslErrors);
dtls.doHandshake(udpSocket);

Vous pouvez également appeler cette fonction après que doHandshake() a rencontré l’erreur QDtlsError::PeerVerificationError, puis reprendre la négociation de connexion en appelant resumeHandshake().

Les appels ultérieurs à cette fonction remplaceront la liste des erreurs transmises lors des appels précédents. Vous pouvez effacer la liste des erreurs que vous souhaitez ignorer en appelant cette fonction avec une liste vide.

Voir également doHandshake(), resumeHandshake() et QSslError.

bool QDtls::isConnectionEncrypted() const

Renvoie « true » si la négociation DTLS s'est déroulée avec succès.

Voir également doHandshake() et handshakeState().

quint16 QDtls::mtuHint() const

Renvoie la valeur précédemment définie par la fonction setMtuHint(). La valeur par défaut est 0.

Voir également setMtuHint().

QHostAddress QDtls::peerAddress() const

Renvoie l'adresse du pair, définie par la fonction setPeer() ou QHostAddress::Null.

Voir également la fonction setPeer().

quint16 QDtls::peerPort() const

Renvoie le numéro de port du pair, défini par la fonction setPeer(), ou 0.

Voir également la fonction ` setPeer()`.

QList<QSslError> QDtls::peerVerificationErrors() const

Renvoie les erreurs détectées lors de la vérification de l'identité du pair.

Si vous souhaitez poursuivre la connexion malgré les erreurs survenues, vous devez appeler la fonction ` ignoreVerificationErrors()`.

QString QDtls::peerVerificationName() const

Renvoie le nom d'hôte défini par la fonction setPeer() ou setPeerVerificationName(). La valeur par défaut est une chaîne vide.

Voir également setPeerVerificationName() et setPeer().

[signal] void QDtls::pskRequired(QSslPreSharedKeyAuthenticator *authenticator)

QDtls émet ce signal lorsqu'il négocie un ensemble de chiffrement PSK ; une authentification PSK est alors requise.

Lorsqu’il utilise le PSK, le client doit envoyer au serveur une identité valide et une clé pré-partagée valide pour que la poignée de main TLS puisse se poursuivre. Les applications peuvent fournir ces informations dans un slot connecté à ce signal, en remplissant l’objet ` authenticator ` transmis selon leurs besoins.

Remarque : ignorer ce signal ou ne pas fournir les informations d'identification requises entraînera l'échec de la négociation et, par conséquent, l'interruption de la connexion.

Remarque : l’objet authenticator appartient à QDtls et ne doit pas être supprimé par l’application.

Voir aussi QSslPreSharedKeyAuthenticator.

bool QDtls::resumeHandshake(QUdpSocket *socket)

Si des erreurs de vérification par pairs ont été ignorées pendant la négociation, la fonction `resumeHandshake()` reprend et achève la négociation, puis renvoie ` true`. ` socket ` doit être un pointeur valide. Renvoie ` false ` si la négociation n'a pas pu être reprise.

Voir également doHandshake(), abortHandshake(), peerVerificationErrors() et ignoreVerificationErrors().

QSslCipher QDtls::sessionCipher() const

Renvoie l'cipher cryptographique utilisé par cette connexion, ou un chiffrement nul si la connexion n'est pas chiffrée. Le chiffrement de la session est sélectionné lors de la phase d'établissement de la connexion. Ce chiffrement est utilisé pour chiffrer et déchiffrer les données.

QSslConfiguration Fournit des fonctions permettant de définir la liste ordonnée d’xml-ph-0000@deepl.internals parmi lesquelles la phase d’établissement de la connexion sélectionnera finalement l’xml-ph-0000@deepl.internal de session. Cette liste ordonnée doit être en place avant le début de la phase d’établissement de la connexion.

Voir également QSslConfiguration, setDtlsConfiguration() et dtlsConfiguration().

QSsl::SslProtocol QDtls::sessionProtocol() const

Renvoie la version du protocole DTLS utilisée par cette connexion, ou « UnknownProtocol » si la connexion n'est pas encore chiffrée. Le protocole de la connexion est sélectionné lors de la phase d'établissement de la connexion.

setDtlsConfiguration() permet de définir la version préférée avant le début de la négociation.

Voir également setDtlsConfiguration(), QSslConfiguration, QSslConfiguration::defaultDtlsConfiguration() et QSslConfiguration::setProtocol().

bool QDtls::setCookieGeneratorParameters(const QDtls::GeneratorParameters &params)

Définit l'algorithme de hachage cryptographique et le secret à partir de params. Cette fonction n'est nécessaire que pour une connexion côté serveur QDtls. Renvoie « true » en cas de réussite.

Remarque : cette fonction doit être appelée avant le début de la négociation de connexion.

Voir également cookieGeneratorParameters(), doHandshake(), QDtlsClientVerifier et QDtlsClientVerifier::cookieGeneratorParameters().

bool QDtls::setDtlsConfiguration(const QSslConfiguration &configuration)

Définit la configuration TLS de la connexion à partir de configuration et renvoie true en cas de succès.

Remarque : cette fonction doit être appelée avant le début de la négociation de connexion.

Voir également dtlsConfiguration() et doHandshake().

void QDtls::setMtuHint(quint16 mtuHint)

mtuHint Il s'agit de l'unité de transmission maximale (MTU), qu'elle ait été détectée ou estimée par l'application. L'application n'est pas tenue de définir cette valeur.

Voir également mtuHint() et QAbstractSocket::PathMtuSocketOption.

bool QDtls::setPeer(const QHostAddress &address, quint16 port, const QString &verificationName = {})

Définit l'adresse, l'port et le nom d'hôte du pair, et renvoie true en cas de succès. address ne doit pas être nul, ni de type multicast ou broadcast. verificationName est le nom d'hôte utilisé pour la validation du certificat.

Voir également peerAddress(), peerPort() et peerVerificationName().

bool QDtls::setPeerVerificationName(const QString &name)

Définit l'name de l'hôte qui sera utilisée pour la validation du certificat et renvoie true en cas de succès.

Remarque : cette fonction doit être appelée avant le début de la négociation de connexion.

Voir également peerVerificationName() et setPeer().

bool QDtls::shutdown(QUdpSocket *socket)

Envoie un message d'alerte de fermeture chiffré et ferme la connexion DTLS. L'état de la négociation passe à « QDtls::HandshakeNotStarted ». socket doit être un pointeur valide. Cette fonction renvoie « true » en cas de réussite.

Voir également doHandshake().

QSslSocket::SslMode QDtls::sslMode() const

Renvoie « QSslSocket::SslServerMode » pour une connexion côté serveur et « QSslSocket::SslClientMode » pour une connexion côté client.

Voir également QDtls() et QSslSocket::SslMode.

qint64 QDtls::writeDatagramEncrypted(QUdpSocket *socket, const QByteArray &dgram)

Chiffre le contenu de ` dgram ` et écrit les données chiffrées dans ` socket`. Renvoie le nombre d'octets écrits, ou -1 en cas d'erreur. La phase d'établissement de la connexion doit être terminée avant l'écriture des données chiffrées. ` socket ` doit être un pointeur valide.

Voir également doHandshake(), handshakeState(), isConnectionEncrypted() et dtlsError().

Éléments non membres associés

enum class QDtlsError

Décrit les erreurs pouvant être détectées par QDtls et QDtlsClientVerifier.

Cette énumération décrit les erreurs générales et spécifiques à TLS pouvant être rencontrées par les objets des classes QDtlsClientVerifier et QDtls.

ConstanteValeurDescription
QDtls::QDtlsError::NoError0Aucune erreur ne s’est produite, la dernière opération a abouti.
QDtls::QDtlsError::InvalidInputParameters1Les paramètres d'entrée fournis par l'appelant n'étaient pas valides.
QDtls::QDtlsError::InvalidOperation2Une opération a été tentée dans un état qui ne le permettait pas.
QDtls::QDtlsError::UnderlyingSocketError3QUdpSocket::writeDatagram() a échoué ; les fonctions QUdpSocket::error() et QUdpSocket::errorString() peuvent fournir des informations plus précises.
QDtls::QDtlsError::RemoteClosedConnectionError4Un message d'alerte de fermeture TLS a été reçu.
QDtls::QDtlsError::PeerVerificationError5L’identité du pair n’a pas pu être vérifiée lors de la négociation TLS.
QDtls::QDtlsError::TlsInitializationError6Une erreur s'est produite lors de l'initialisation d'un backend TLS sous-jacent.
QDtls::QDtlsError::TlsFatalError7Une erreur fatale s’est produite lors de la négociation TLS, autre qu’une erreur de vérification du pair ou une erreur d’initialisation TLS.
QDtls::QDtlsError::TlsNonFatalError8Échec du chiffrement ou du déchiffrement d’un datagramme, non fatal, ce qui signifie qu’ QDtls peut continuer à fonctionner après cette erreur.

© 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.