QDtls Class

Diese Klasse bietet Verschlüsselung für UDP-Sockets. Mehr...

Header: #include <QDtls>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
Vererbt: QObject

Öffentliche Typen

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

Öffentliche Funktionen

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)

Signale

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

Detaillierte Beschreibung

Die Klasse QDtls kann verwendet werden, um eine sichere Verbindung mit einem Netzwerk-Peer über das User Datagram Protocol (UDP) herzustellen. DTLS-Verbindung über im Wesentlichen verbindungsloses UDP bedeutet, dass zwei Peers zunächst einen TLS-Handshake erfolgreich abschließen müssen, indem sie doHandshake() aufrufen. Nachdem der Handshake abgeschlossen ist, können verschlüsselte Datagramme mit writeDatagramEncrypted() an die Gegenstelle gesendet werden. Verschlüsselte Datagramme, die von der Gegenstelle kommen, können mit decryptDatagram() entschlüsselt werden.

QDtls ist für die Zusammenarbeit mit QUdpSocket konzipiert. Da QUdpSocket Datagramme von verschiedenen Peers empfangen kann, muss eine Anwendung Demultiplexing implementieren und Datagramme von verschiedenen Peers an die entsprechenden Instanzen von QDtls weiterleiten. Eine Verbindung zwischen einem Netzwerk-Peer und seinem QDtls-Objekt kann über die Adresse und die Portnummer des Peers hergestellt werden. Bevor ein Handshake gestartet wird, muss die Anwendung die Adresse und die Portnummer der Gegenstelle mit setPeer() setzen.

QDtls liest keine Datagramme von QUdpSocket, dies wird von der Anwendung erwartet, z. B. in einem Slot, der an das Signal QUdpSocket::readyRead() angeschlossen ist. Dann müssen diese Datagramme von QDtls verarbeitet werden.

Hinweis: QDtls übernimmt nicht das Eigentum an dem QUdpSocket Objekt.

Normalerweise sind während der Handshake-Phase mehrere Datagramme von beiden Peers zu empfangen und zu senden. Beim Lesen von Datagrammen müssen Server und Client diese Datagramme an doHandshake() übergeben, bis ein Fehler gefunden wird oder handshakeState() HandshakeComplete zurückgibt:

// 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.
    }
}

Für einen Server erfordert der erste Aufruf von doHandshake() ein nicht leeres Datagramm, das eine ClientHello-Nachricht enthält. Wenn der Server auch QDtlsClientVerifier einsetzt, wird erwartet, dass die erste ClientHello-Nachricht diejenige ist, die von QDtlsClientVerifier überprüft wurde.

Kann die Identität der Gegenstelle während des Handshakes nicht überprüft werden, muss die Anwendung die von peerVerificationErrors() zurückgegebenen Fehler untersuchen und dann entweder die Fehler durch Aufruf von ignoreVerificationErrors() ignorieren oder den Handshake durch Aufruf von abortHandshake() abbrechen. Wurden Fehler ignoriert, kann der Handshake durch Aufruf von resumeHandshake() fortgesetzt werden.

Nachdem der Handshake abgeschlossen ist, können Datagramme sicher an den Netzwerk-Peer gesendet und von ihm empfangen werden:

// 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);

Eine DTLS-Verbindung kann mit shutdown() geschlossen werden.

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

Achtung! Es wird empfohlen, shutdown() aufzurufen, bevor das QDtls-Objekt des Clients zerstört wird, wenn Sie vorhaben, dieselbe Portnummer für eine spätere Verbindung mit dem Server wieder zu verwenden. Andernfalls kann es sein, dass der Server eingehende ClientHello-Nachrichten verwirft, siehe RFC 6347, Abschnitt 4.2.8 für weitere Details und Hinweise zur Implementierung.

Wenn der Server QDtlsClientVerifier nicht verwendet, muss er seine QDtls-Objekte so konfigurieren, dass das Cookie-Verifizierungsverfahren deaktiviert wird:

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

Ein Server, der die Cookie-Verifizierung mit nicht standardmäßigen Generatorparametern verwendet , muss dieselben Parameter für sein QDtls-Objekt einstellen, bevor er den Handshake startet.

Hinweis: Das DTLS-Protokoll überlässt die Ermittlung der maximalen Pfadübertragungseinheit (PMTU) der Anwendung. Die Anwendung kann QDtls mit Hilfe von setMtuHint() die MTU mitteilen. Dieser Hinweis betrifft nur die Handshake-Phase, da nur Handshake-Nachrichten vom DTLS fragmentiert und wieder zusammengesetzt werden können. Alle anderen von der Anwendung gesendeten Nachrichten müssen in ein einziges Datagramm passen.

Hinweis: DTLS-spezifische Header fügen den Anwendungsdaten einen gewissen Overhead hinzu, der die mögliche Nachrichtengröße weiter reduziert.

Warnung: Ein Server, der so konfiguriert ist, dass er mit HelloVerifyRequest antwortet, verwirft alle fragmentierten ClientHello-Nachrichten und beginnt nie einen Handshake.

Die DTLS-Server- und DTLS-Client-Beispiele veranschaulichen, wie QDtls in Anwendungen verwendet werden kann.

Siehe auch QUdpSocket, QDtlsClientVerifier, HandshakeState, QDtlsError, und QSslConfiguration.

Dokumentation der Mitgliedstypen

[alias] QDtls::GeneratorParameters

enum QDtls::HandshakeState

Beschreibt den aktuellen Status des DTLS-Handshakes.

Diese Aufzählung beschreibt den aktuellen Status des DTLS-Handshake für eine QDtls -Verbindung.

KonstanteWertBeschreibung
QDtls::HandshakeNotStarted0Noch nichts getan.
QDtls::HandshakeInProgress1Der Handshake wurde initiiert und es wurden bisher keine Fehler gefunden.
QDtls::PeerVerificationFailed2Die Identität der Gegenstelle kann nicht festgestellt werden.
QDtls::HandshakeComplete3Handshake wurde erfolgreich abgeschlossen und die verschlüsselte Verbindung wurde hergestellt.

Siehe auch QDtls::doHandshake() und QDtls::handshakeState().

Dokumentation der Mitgliedsfunktionen

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

Erzeugt ein QDtls-Objekt, parent wird an den QObject -Konstruktor übergeben. mode ist QSslSocket::SslServerMode für eine serverseitige DTLS-Verbindung oder QSslSocket::SslClientMode für einen Client.

Siehe auch sslMode() und QSslSocket::SslMode.

[virtual noexcept] QDtls::~QDtls()

Zerstört das Objekt QDtls.

bool QDtls::abortHandshake(QUdpSocket *socket)

Bricht den laufenden Handshake ab. Gibt true zurück, wenn unter socket ein Handshake im Gange war; andernfalls wird ein entsprechender Fehler gesetzt und false zurückgegeben.

Siehe auch doHandshake() und resumeHandshake().

QDtls::GeneratorParameters QDtls::cookieGeneratorParameters() const

Gibt den aktuellen Hash-Algorithmus und das Geheimnis zurück, entweder die Standardwerte oder die zuvor durch einen Aufruf von setCookieGeneratorParameters() gesetzten.

Der Standard-Hash-Algorithmus ist QCryptographicHash::Sha256, wenn Qt so konfiguriert wurde, dass es ihn unterstützt, andernfalls QCryptographicHash::Sha1. Das Standardgeheimnis wird aus dem Backend-spezifischen kryptographisch starken Pseudozufallszahlengenerator gewonnen.

Siehe auch setCookieGeneratorParameters(), QDtlsClientVerifier, und cookieGeneratorParameters().

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

Entschlüsselt dgram und gibt seinen Inhalt als Klartext zurück. Der Handshake muss abgeschlossen sein, bevor die Datagramme entschlüsselt werden können. Je nach Typ der TLS-Nachricht kann die Verbindung in socket schreiben, das ein gültiger Zeiger sein muss.

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

Startet oder setzt einen DTLS-Handshake fort. socket muss ein gültiger Zeiger sein. Wenn ein serverseitiger DTLS-Handshake gestartet wird, muss dgram die anfängliche ClientHello-Nachricht enthalten, die aus QUdpSocket gelesen wurde. Diese Funktion gibt true zurück, wenn kein Fehler gefunden wurde. Der Handshake-Status kann mit handshakeState() getestet werden. false bedeutet, dass ein Fehler aufgetreten ist; verwenden Sie dtlsError() für weitere Informationen.

Hinweis: Wenn die Identität der Gegenstelle nicht festgestellt werden kann, wird der Fehler auf QDtlsError::PeerVerificationError gesetzt. Wenn Sie Überprüfungsfehler ignorieren und die Verbindung fortsetzen wollen, müssen Sie ignoreVerificationErrors() und dann resumeHandshake() aufrufen. Wenn die Fehler nicht ignoriert werden können, müssen Sie abortHandshake() aufrufen.

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

Siehe auch handshakeState(), dtlsError(), ignoreVerificationErrors(), resumeHandshake(), und abortHandshake().

QSslConfiguration QDtls::dtlsConfiguration() const

Gibt entweder die Standard-DTLS-Konfiguration oder die durch einen früheren Aufruf von setDtlsConfiguration() gesetzte Konfiguration zurück.

Siehe auch setDtlsConfiguration() und QSslConfiguration::defaultDtlsConfiguration().

QDtlsError QDtls::dtlsError() const

Gibt den letzten Fehler zurück, der bei der Verbindung oder bei QDtlsError::NoError aufgetreten ist.

Siehe auch dtlsErrorString() und QDtlsError.

QString QDtls::dtlsErrorString() const

Liefert eine textuelle Beschreibung des letzten Fehlers, der bei der Verbindung aufgetreten ist, oder einen leeren String.

Siehe auch dtlsError().

bool QDtls::handleTimeout(QUdpSocket *socket)

Tritt während des Handshakes eine Zeitüberschreitung auf, wird das Signal handshakeTimeout() ausgegeben. Die Anwendung muss handleTimeout() aufrufen, um Handshake-Nachrichten erneut zu übermitteln; handleTimeout() gibt true zurück, wenn eine Zeitüberschreitung aufgetreten ist, andernfalls false. socket muss ein gültiger Zeiger sein.

Siehe auch handshakeTimeout().

QDtls::HandshakeState QDtls::handshakeState() const

Gibt den aktuellen Handshake-Status für diese QDtls zurück.

Siehe auch doHandshake() und QDtls::HandshakeState.

[signal] void QDtls::handshakeTimeout()

Paketverluste können zu Zeitüberschreitungen während der Handshake-Phase führen. In diesem Fall sendet QDtls ein handshakeTimeout()-Signal. Rufen Sie handleTimeout() auf, um die Handshake-Nachrichten erneut zu übermitteln:

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

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

Siehe auch handleTimeout().

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

Mit dieser Methode wird QDtls angewiesen, nur die in errorsToIgnore angegebenen Fehler zu ignorieren.

Wenn Sie zum Beispiel eine Verbindung zu einem Server herstellen wollen, der ein selbstsigniertes Zertifikat verwendet, können Sie den folgenden Ausschnitt verwenden:

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);

Sie können diese Funktion auch aufrufen, nachdem doHandshake() auf den Fehler QDtlsError::PeerVerificationError gestoßen ist, und dann den Handshake durch Aufruf von resumeHandshake() fortsetzen.

Spätere Aufrufe dieser Funktion ersetzen die Liste der Fehler, die in früheren Aufrufen übergeben wurden. Sie können die Liste der Fehler, die Sie ignorieren wollen, löschen, indem Sie diese Funktion mit einer leeren Liste aufrufen.

Siehe auch doHandshake(), resumeHandshake(), und QSslError.

bool QDtls::isConnectionEncrypted() const

Gibt true zurück, wenn der DTLS-Handshake erfolgreich abgeschlossen wurde.

Siehe auch doHandshake() und handshakeState().

quint16 QDtls::mtuHint() const

Gibt den Wert zurück, der zuvor durch setMtuHint() gesetzt wurde. Der Standardwert ist 0.

Siehe auch setMtuHint().

QHostAddress QDtls::peerAddress() const

Gibt die Adresse der Gegenstelle zurück, die mit setPeer() oder QHostAddress::Null festgelegt wurde.

Siehe auch setPeer().

quint16 QDtls::peerPort() const

Gibt die Portnummer der Gegenstelle zurück, die mit setPeer() festgelegt wurde, oder 0.

Siehe auch setPeer().

QList<QSslError> QDtls::peerVerificationErrors() const

Gibt Fehler zurück, die bei der Feststellung der Identität der Gegenstelle gefunden wurden.

Wenn Sie die Verbindung trotz der aufgetretenen Fehler fortsetzen wollen, müssen Sie ignoreVerificationErrors() aufrufen.

QString QDtls::peerVerificationName() const

Gibt den durch setPeer() oder setPeerVerificationName() festgelegten Hostnamen zurück. Der Standardwert ist eine leere Zeichenkette.

Siehe auch setPeerVerificationName() und setPeer().

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

QDtls sendet dieses Signal, wenn er eine PSK-Ciphersuite aushandelt, so dass eine PSK-Authentifizierung erforderlich ist.

Bei der Verwendung von PSK muss der Client dem Server eine gültige Identität und einen gültigen Pre-Shared Key senden, damit der TLS-Handshake fortgesetzt werden kann. Anwendungen können diese Informationen in einem mit diesem Signal verbundenen Slot bereitstellen, indem sie das übergebene authenticator Objekt entsprechend ihren Bedürfnissen ausfüllen.

Hinweis: Das Ignorieren dieses Signals oder die Nichtbereitstellung der erforderlichen Anmeldeinformationen führt zum Scheitern des Handshakes und somit zum Abbruch der Verbindung.

Hinweis: Das Objekt authenticator ist Eigentum von QDtls und darf von der Anwendung nicht gelöscht werden.

Siehe auch QSslPreSharedKeyAuthenticator.

bool QDtls::resumeHandshake(QUdpSocket *socket)

Wenn Peer-Verifizierungsfehler während des Handshake ignoriert wurden, nimmt resumeHandshake() den Handshake wieder auf und schließt ihn ab und gibt true zurück. socket muss ein gültiger Zeiger sein. Gibt false zurück, wenn der Handshake nicht fortgesetzt werden konnte.

Siehe auch doHandshake(), abortHandshake(), peerVerificationErrors(), und ignoreVerificationErrors().

QSslCipher QDtls::sessionCipher() const

Gibt die kryptographische cipher zurück, die von dieser Verbindung verwendet wird, oder eine Null-Chiffre, wenn die Verbindung nicht verschlüsselt ist. Die Chiffre für die Sitzung wird während der Handshake-Phase ausgewählt. Die Chiffre wird zum Verschlüsseln und Entschlüsseln von Daten verwendet.

QSslConfiguration bietet Funktionen zum Festlegen der geordneten Liste von Chiffren, aus der die Handshake-Phase schließlich die Sitzungs-Chiffre auswählt. Diese geordnete Liste muss vorhanden sein, bevor die Handshake-Phase beginnt.

Siehe auch QSslConfiguration, setDtlsConfiguration(), und dtlsConfiguration().

QSsl::SslProtocol QDtls::sessionProtocol() const

Gibt die von dieser Verbindung verwendete DTLS-Protokollversion zurück, oder UnknownProtocol, wenn die Verbindung noch nicht verschlüsselt ist. Das Protokoll für die Verbindung wird während der Handshake-Phase ausgewählt.

setDtlsConfiguration() kann die bevorzugte Version festlegen, bevor der Handshake beginnt.

Siehe auch setDtlsConfiguration(), QSslConfiguration, QSslConfiguration::defaultDtlsConfiguration(), und QSslConfiguration::setProtocol().

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

Setzt den kryptographischen Hash-Algorithmus und das Geheimnis von params. Diese Funktion wird nur für eine serverseitige QDtls Verbindung benötigt. Gibt bei Erfolg true zurück.

Hinweis: Diese Funktion muss aufgerufen werden, bevor der Handshake beginnt.

Siehe auch cookieGeneratorParameters(), doHandshake(), QDtlsClientVerifier, und QDtlsClientVerifier::cookieGeneratorParameters().

bool QDtls::setDtlsConfiguration(const QSslConfiguration &configuration)

Setzt die TLS-Konfiguration der Verbindung von configuration und gibt bei Erfolg true zurück.

Hinweis: Diese Funktion muss aufgerufen werden, bevor der Handshake beginnt.

Siehe auch dtlsConfiguration() und doHandshake().

void QDtls::setMtuHint(quint16 mtuHint)

mtuHint ist die maximale Übertragungseinheit (MTU), die entweder ermittelt oder von der Anwendung geschätzt wurde. Es ist nicht erforderlich, dass die Anwendung diesen Wert festlegt.

Siehe auch mtuHint() und QAbstractSocket::PathMtuSocketOption.

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

Legt die Adresse der Gegenstelle, port, und den Hostnamen fest und gibt bei Erfolg true zurück. address darf nicht null, multicast oder broadcast sein. verificationName ist der Hostname, der für die Zertifikatsüberprüfung verwendet wird.

Siehe auch peerAddress(), peerPort(), und peerVerificationName().

bool QDtls::setPeerVerificationName(const QString &name)

Legt den Host name fest, der für die Zertifikatsüberprüfung verwendet wird, und gibt bei Erfolg true zurück.

Hinweis: Diese Funktion muss aufgerufen werden, bevor der Handshake beginnt.

Siehe auch peerVerificationName() und setPeer().

bool QDtls::shutdown(QUdpSocket *socket)

Sendet eine verschlüsselte Shutdown-Warnmeldung und schließt die DTLS-Verbindung. Der Handshake-Status wechselt zu QDtls::HandshakeNotStarted. socket muss ein gültiger Zeiger sein. Diese Funktion gibt bei Erfolg true zurück.

Siehe auch doHandshake().

QSslSocket::SslMode QDtls::sslMode() const

Gibt QSslSocket::SslServerMode für eine serverseitige Verbindung und QSslSocket::SslClientMode für einen Client zurück.

Siehe auch QDtls() und QSslSocket::SslMode.

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

Verschlüsselt dgram und schreibt die verschlüsselten Daten in socket. Gibt die Anzahl der geschriebenen Bytes zurück oder -1 im Falle eines Fehlers. Der Handshake muss abgeschlossen sein, bevor verschlüsselte Daten geschrieben werden. socket muss ein gültiger Zeiger sein.

Siehe auch doHandshake(), handshakeState(), isConnectionEncrypted(), und dtlsError().

Verwandte Nicht-Mitglieder

enum class QDtlsError

Beschreibt die Fehler, die von QDtls und QDtlsClientVerifier gefunden werden können.

Diese Aufzählung beschreibt allgemeine und TLS-spezifische Fehler, die bei Objekten der Klassen QDtlsClientVerifier und QDtls auftreten können.

KonstanteWertBeschreibung
QDtls::QDtlsError::NoError0Es ist kein Fehler aufgetreten, die letzte Operation war erfolgreich.
QDtls::QDtlsError::InvalidInputParameters1Von einem Aufrufer übergebene Eingabeparameter waren ungültig.
QDtls::QDtlsError::InvalidOperation2Eine Operation wurde in einem Zustand versucht, der sie nicht zuließ.
QDtls::QDtlsError::UnderlyingSocketError3QUdpSocket::writeDatagram() ist fehlgeschlagen, QUdpSocket::error() und QUdpSocket::errorString() können genauere Informationen liefern.
QDtls::QDtlsError::RemoteClosedConnectionError4Es wurde eine TLS-Shutdown-Warnmeldung empfangen.
QDtls::QDtlsError::PeerVerificationError5Die Identität des Peers konnte während des TLS-Handshake nicht überprüft werden.
QDtls::QDtlsError::TlsInitializationError6Bei der Initialisierung eines zugrunde liegenden TLS-Backends ist ein Fehler aufgetreten.
QDtls::QDtlsError::TlsFatalError7Während des TLS-Handshakes ist ein schwerwiegender Fehler aufgetreten, bei dem es sich nicht um einen Peer-Verifizierungsfehler oder einen TLS-Initialisierungsfehler handelt.
QDtls::QDtlsError::TlsNonFatalError8Ein Fehler beim Verschlüsseln oder Entschlüsseln eines Datagramms, der nicht schwerwiegend ist, d. h. QDtls kann nach diesem Fehler weiterarbeiten.

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