本页内容

QSslSocket Class

QSslSocket 类为客户端和服务器均提供了 SSL 加密套接字。更多内容...

头文件: #include <QSslSocket>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
继承自: QTcpSocket

注意:该类中的所有函数均为可重入函数。

公共类型

enum PeerVerifyMode { VerifyNone, QueryPeer, VerifyPeer, AutoVerifyPeer }
enum SslMode { UnencryptedMode, SslClientMode, SslServerMode }

公共函数

QSslSocket(QObject *parent = nullptr)
virtual ~QSslSocket()
void connectToHostEncrypted(const QString &hostName, quint16 port, QIODeviceBase::OpenMode mode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
void connectToHostEncrypted(const QString &hostName, quint16 port, const QString &sslPeerName, QIODeviceBase::OpenMode mode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
(since 6.0) void continueInterruptedHandshake()
qint64 encryptedBytesAvailable() const
qint64 encryptedBytesToWrite() const
void ignoreSslErrors(const QList<QSslError> &errors)
bool isEncrypted() const
QSslCertificate localCertificate() const
QList<QSslCertificate> localCertificateChain() const
QSslSocket::SslMode mode() const
QList<QOcspResponse> ocspResponses() const
QSslCertificate peerCertificate() const
QList<QSslCertificate> peerCertificateChain() const
int peerVerifyDepth() const
QSslSocket::PeerVerifyMode peerVerifyMode() const
QString peerVerifyName() const
QSslKey privateKey() const
QSsl::SslProtocol protocol() const
QSslCipher sessionCipher() const
QSsl::SslProtocol sessionProtocol() const
void setLocalCertificate(const QSslCertificate &certificate)
void setLocalCertificate(const QString &path, QSsl::EncodingFormat format = QSsl::Pem)
void setLocalCertificateChain(const QList<QSslCertificate> &localChain)
void setPeerVerifyDepth(int depth)
void setPeerVerifyMode(QSslSocket::PeerVerifyMode mode)
void setPeerVerifyName(const QString &hostName)
void setPrivateKey(const QSslKey &key)
void setPrivateKey(const QString &fileName, QSsl::KeyAlgorithm algorithm = QSsl::Rsa, QSsl::EncodingFormat format = QSsl::Pem, const QByteArray &passPhrase = QByteArray())
void setProtocol(QSsl::SslProtocol protocol)
void setSslConfiguration(const QSslConfiguration &configuration)
QSslConfiguration sslConfiguration() const
QList<QSslError> sslHandshakeErrors() const
bool waitForEncrypted(int msecs = 30000)

重新实现的公共函数

virtual bool atEnd() const override
virtual qint64 bytesAvailable() const override
virtual qint64 bytesToWrite() const override
virtual bool canReadLine() const override
virtual void close() override
virtual void connectToHost(const QString &hostName, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol) override
virtual void disconnectFromHost() override
virtual void resume() override
virtual void setReadBufferSize(qint64 size) override
virtual bool setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState state = ConnectedState, QIODeviceBase::OpenMode openMode = ReadWrite) override
virtual void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value) override
virtual QVariant socketOption(QAbstractSocket::SocketOption option) override
virtual bool waitForBytesWritten(int msecs = 30000) override
virtual bool waitForConnected(int msecs = 30000) override
virtual bool waitForDisconnected(int msecs = 30000) override
virtual bool waitForReadyRead(int msecs = 30000) override

公共槽

信号

void alertReceived(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
void alertSent(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
void encrypted()
void encryptedBytesWritten(qint64 written)
void handshakeInterruptedOnError(const QSslError &error)
void modeChanged(QSslSocket::SslMode mode)
void newSessionTicketReceived()
void peerVerifyError(const QSslError &error)
void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)
void sslErrors(const QList<QSslError> &errors)

静态公共成员

(since 6.1) QString activeBackend()
(since 6.1) QList<QString> availableBackends()
(since 6.1) QList<QSsl::ImplementedClass> implementedClasses(const QString &backendName = {})
(since 6.1) bool isClassImplemented(QSsl::ImplementedClass cl, const QString &backendName = {})
(since 6.1) bool isFeatureSupported(QSsl::SupportedFeature ft, const QString &backendName = {})
(since 6.1) bool isProtocolSupported(QSsl::SslProtocol protocol, const QString &backendName = {})
(since 6.1) bool setActiveBackend(const QString &backendName)
long sslLibraryBuildVersionNumber()
QString sslLibraryBuildVersionString()
long sslLibraryVersionNumber()
QString sslLibraryVersionString()
(since 6.1) QList<QSsl::SupportedFeature> supportedFeatures(const QString &backendName = {})
(since 6.1) QList<QSsl::SslProtocol> supportedProtocols(const QString &backendName = {})
bool supportsSsl()

重新实现的受保护函数

virtual qint64 readData(char *data, qint64 maxlen) override
virtual qint64 skipData(qint64 maxSize) override
virtual qint64 writeData(const char *data, qint64 len) override
(since 6.0) enum class AlertLevel { Warning, Fatal, Unknown }
(since 6.0) enum class AlertType { CloseNotify, UnexpectedMessage, BadRecordMac, RecordOverflow, DecompressionFailure, …, UnknownAlertMessage }
(since 6.1) enum class ImplementedClass { Key, Certificate, Socket, DiffieHellman, EllipticCurve, …, DtlsCookie }
(since 6.1) enum class SupportedFeature { CertificateVerification, ClientSideAlpn, ServerSideAlpn, Ocsp, Psk, …, Alerts }

详细说明

QSslSocket 可建立安全的、加密的 TCP 连接,供您传输加密数据。 它既可在客户端模式下运行,也可在服务器模式下运行,并支持包括 TLS 1.3 在内的现代 TLS 协议。默认情况下,QSslSocket 仅使用被认为安全的 TLS 协议(QSsl::SecureProtocols ),但只要在握手开始之前调用setProtocol(),您就可以更改 TLS 协议。

在套接字进入 ConnectedState 状态后,SSL 加密将在现有的 TCP 流之上运行。使用 QSslSocket 建立安全连接有两种简单方法:立即进行 SSL 握手,或者在以未加密模式建立连接后进行延迟的 SSL 握手。

使用 QSslSocket 最常见的方式是创建一个对象,并通过调用connectToHostEncrypted() 来建立安全连接。该方法会在连接建立后立即启动 SSL 握手。

QSslSocket *socket = new QSslSocket(this);
connect(socket, &QSslSocket::encrypted, this, &Receiver::ready);

socket->connectToHostEncrypted("imap.example.com", 993);

与普通的QTcpSocket 一样,如果连接成功,QSslSocket将依次进入HostLookupState、ConnectingState,最后进入ConnectedState。随后将自动开始握手过程,若握手成功,则会发出encrypted()信号,表示套接字已进入加密状态并可供使用。

请注意,在connectToHostEncrypted() 返回后(即在发出encrypted() 信号之前),即可立即向套接字写入数据。这些数据将在 QSslSocket 中排队,直至encrypted() 信号发出后才被处理。

使用延迟 SSL 握手来保护现有连接的一个示例是:SSL 服务器对传入连接进行加密保护。 假设你创建了一个作为QTcpServer 子类的SSL服务器类。你需要重写QTcpServer::incomingConnection()方法,实现方式类似于下面的示例:首先构造一个QSslSocket实例,然后调用setSocketDescriptor()将新套接字的描述符设置为传入的现有描述符。随后通过调用startServerEncryption()来启动SSL握手。

void SslServer::incomingConnection(qintptr socketDescriptor)
{
    QSslSocket *serverSocket = new QSslSocket;
    if (serverSocket->setSocketDescriptor(socketDescriptor)) {
        addPendingConnection(serverSocket);
        connect(serverSocket, &QSslSocket::encrypted, this, &SslServer::ready);
        serverSocket->startServerEncryption();
    } else {
        delete serverSocket;
    }
}

如果发生错误,QSslSocket 将发出sslErrors() 信号。此时,如果未采取任何措施忽略该(些)错误,连接将被断开。 若要继续操作(尽管发生了错误),可以在错误发生后在此槽内调用ignoreSslErrors(),或者在 QSslSocket 构造完成之后、尝试建立连接之前任何时候调用该函数。这将使 QSslSocket 能够忽略在确定对等方身份时遇到的错误。 在 SSL 握手过程中忽略错误时应谨慎行事,因为安全连接的一个基本特征是必须通过成功的握手才能建立。

加密完成后,您可以将 QSslSocket 作为普通的QTcpSocket 来使用。当触发readyRead() 时,您可以调用read()、canReadLine() 和readLine(),或getChar() 来从 QSslSocket 的内部缓冲区读取解密后的数据;同时,您还可以调用write() 或putChar() 将数据写回对端。 QSslSocket 会自动为您加密写入的数据,并在数据写入对端后触发encryptedBytesWritten() 事件。

为了方便使用,QSslSocket 支持QTcpSocket 中的阻塞函数waitForConnected()、waitForReadyRead()、waitForBytesWritten() 和waitForDisconnected()。它还提供了waitForEncrypted(),该函数会阻塞调用线程,直到建立加密连接为止。

QSslSocket socket;
socket.connectToHostEncrypted("http.example.com", 443);
if(!socket.waitForEncrypted()) {
    qDebug() << socket.errorString();
   return false;
}

socket.write("GET / HTTP/1.0\r\n\r\n");
while(socket.waitForReadyRead())
    qDebug() << socket.readAll().data();

QSslSocket 提供了一个功能全面且易于使用的 API,用于处理加密算法、私钥以及本地证书、对等方证书和证书颁发机构(CA)证书。它还提供了一个 API,用于处理握手阶段出现的错误。

以下功能也可进行自定义:

若要扩展 SSL 套接字在 SSL 握手期间使用的默认CA 证书列表,必须更新默认配置,如下面的代码片段所示:

QList<QSslCertificate> certificates = getCertificates();
QSslConfiguration configuration = QSslConfiguration::defaultConfiguration();
configuration.addCaCertificates(certificates);
QSslConfiguration::setDefaultConfiguration(configuration);

注意:如果 可用,Unix 系统(不包括 macOS)上的根证书将按需从标准证书目录中加载。如果您不希望按需加载根证书,则需要在应用程序进行首次 SSL 握手之前调用QSslConfiguration::defaultConfiguration().setCaCertificates() (例如,通过向其传递 QSslSocket::systemCaCertificates() ),或者在 SSL 握手之前对您的 QSslSocket 实例调用QSslConfiguration::defaultConfiguration()::setCaCertificates()。

有关密码套件和证书的更多信息,请参阅QSslCipher 和QSslCertificate 。

本产品包含由 OpenSSL 项目开发、用于 OpenSSL 工具包 (http://www.openssl.org/) 的软件。

注意:请 注意bytesWritten() 信号与encryptedBytesWritten() 信号之间的区别。 对于QTcpSocket ,一旦数据写入 TCP 套接字,就会触发bytesWritten()。对于 QSslSocket,当数据正在加密时会触发bytesWritten(),而一旦数据写入 TCP 套接字,就会触发encryptedBytesWritten()。

另请参阅 QSslCertificate 、QSslCipher 以及QSslError 。

成员类型文档

enum QSslSocket::PeerVerifyMode

描述了QSslSocket 的对等方验证模式。默认模式为AutoVerifyPeer,该模式会根据套接字的QSocket::SslMode选择合适的模式。

常量值描述
QSslSocket::VerifyNone0QSslSocket 不会向对端请求证书。如果您对连接另一端的身份不感兴趣,可以设置此模式。连接仍将进行加密,且如果对端提出请求,您的套接字仍会向其发送本地证书。
QSslSocket::QueryPeer1QSslSocket 将向对端请求证书,但不要求该证书有效。当您希望向用户显示对端证书详细信息,同时又不影响实际的 SSL 握手过程时,此模式非常有用。此模式是服务器的默认设置。注意:在 Schannel 中,此值的作用与 VerifyNone 相同。
QSslSocket::VerifyPeer2QSslSocket 将在 SSL 握手阶段向对端请求证书,并要求该证书有效。若请求失败,QSslSocket 将发出QSslSocket::sslErrors() 信号。此模式是客户端的默认设置。
QSslSocket::AutoVerifyPeer3QSslSocket 将自动对服务器套接字使用 QueryPeer,对客户端套接字使用 VerifyPeer。

另请参阅 QSslSocket::peerVerifyMode()。

enum QSslSocket::SslMode

描述了QSslSocket 可用的连接模式。

常量值描述
QSslSocket::UnencryptedMode0该套接字未加密。其行为与QTcpSocket 完全相同。
QSslSocket::SslClientMode1该套接字是客户端 SSL 套接字。它要么已经加密,要么正处于 SSL 握手阶段(参见QSslSocket::isEncrypted())。
QSslSocket::SslServerMode2该套接字是服务器端的 SSL 套接字。它要么已经加密,要么正处于 SSL 握手阶段(参见QSslSocket::isEncrypted())。

成员函数文档

[explicit] QSslSocket::QSslSocket(QObject *parent = nullptr)

创建一个 QSslSocket 对象。将 `parent ` 传递给 `QObject` 的构造函数。新套接字的 `cipher ` 套接字组被设置为静态方法 `defaultCiphers()` 返回的值。

[virtual noexcept] QSslSocket::~QSslSocket()

销毁QSslSocket 。

[static, since 6.1] QString QSslSocket::activeBackend()

返回QSslSocket 及其相关类所使用的后端名称。如果未显式设置活动后端,则该函数将返回QSslSocket 从可用后端列表中隐式选定的默认后端名称。

注意:在 隐式选择默认后端时, QSslSocket 会优先选择 OpenSSL 后端(如果可用)。如果不可用,则在 Windows 上会隐式选择 Schannel 后端,在 Darwin 平台上会隐式选择 Secure Transport。 若上述后端均不可用,且检测到自定义 TLS 后端,则使用该后端。若未检测到其他后端,则选择“仅证书”后端。有关 TLS 插件的更多信息,请参阅《从源代码构建 Qt 时启用和禁用 SSL 支持》。

该函数在 Qt 6.1 中引入。

另请参阅 setActiveBackend() 和availableBackends()。

[signal] void QSslSocket::alertReceived(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)

QSslSocket 如果从对等方收到警报消息,则发出此信号。level 表示该警报是致命错误还是警告。type 是说明发送警报原因的代码。如果警报消息有文本描述,则通过description 提供。

注意:该 信号主要用于信息提示和调试,应用程序无需进行任何处理。如果警报属于致命错误,底层后端将进行处理并关闭连接。

注意:并非 所有后端都支持此功能。

另请参阅 alertSent()、QSsl::AlertLevel 以及QSsl::AlertType 。

[signal] void QSslSocket::alertSent(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)

QSslSocket 如果向对等方发送了警报消息,则发出此信号。level 描述该警报是警告还是致命错误。type 提供警报消息的代码。如果警报消息有文本描述,则通过description 提供。

注意:该 信号主要具有信息提示作用,可用于调试,通常不需要应用程序采取任何行动。

注意:并非 所有后端都支持此功能。

另请参阅 alertReceived()、QSsl::AlertLevel 以及QSsl::AlertType 。

[override virtual] bool QSslSocket::atEnd() const

重新实现了:QIODevice::atEnd() const。

[static, since 6.1] QList<QString> QSslSocket::availableBackends()

返回当前可用的后端名称。这些名称均为小写,例如“openssl”、“securetransport”、“schannel”(与 Qt 中 TLS 后端现有的功能名称类似)。

该函数于 Qt 6.1 中引入。

另请参阅 activeBackend()。

[override virtual] qint64 QSslSocket::bytesAvailable() const

重新实现了:QAbstractSocket::bytesAvailable() const。

返回可立即读取的已解密字节数。

[override virtual] qint64 QSslSocket::bytesToWrite() const

重写了:QAbstractSocket::bytesToWrite() const。

返回等待加密并写入网络的未加密字节数。

[override virtual] bool QSslSocket::canReadLine() const

重新实现了:QIODevice::canReadLine() const。

如果能够读取一行(以单个 ASCII 字符“\n ”结尾)已解密字符,则返回true ;否则返回 false。

[override virtual] void QSslSocket::close()

重写了:QAbstractSocket::close()。

[override virtual] void QSslSocket::connectToHost(const QString &hostName, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)

重写了:QAbstractSocket::connectToHost(const QString &hostName, quint16 port, QIODeviceBase::OpenMode openMode, QAbstractSocket::NetworkLayerProtocol protocol)。

void QSslSocket::connectToHostEncrypted(const QString &hostName, quint16 port, QIODeviceBase::OpenMode mode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)

使用mode 作为OpenMode ,在port 上与设备hostName 建立加密连接。这相当于先调用connectToHost() 建立连接,然后调用startClientEncryption()。protocol 参数可用于指定要使用的网络协议(例如 IPv4 或 IPv6)。

QSslSocket 首先进入 HostLookupState。随后,在进入事件循环或某个 waitFor...() 函数后,它会进入 ConnectingState,发出connected() 信号,然后启动 SSL 客户端握手。每次状态变化时,QSslSocket 都会发出stateChanged() 信号。

在发起 SSL 客户端握手后,如果无法确认对端的身份,则会发出sslErrors() 信号。 若要忽略错误并继续连接,必须调用ignoreSslErrors()——要么在连接到sslErrors() 信号的槽函数内部调用,要么在进入加密模式之前调用。如果未调用ignoreSslErrors(),连接将被断开,将发出disconnected() 信号,且QSslSocket 将返回 UnconnectedState。

如果 SSL 握手成功,QSslSocket 将发出encrypted() 信号。

QSslSocket socket;
connect(&socket, &QSslSocket::encrypted, receiver, &Receiver::socketEncrypted);

socket.connectToHostEncrypted("imap", 993);
socket->write("1 CAPABILITY\r\n");

注意: 上面的示例 表明,在请求加密连接后,在encrypted() 信号发出之前,即可向套接字写入文本。在这种情况下,文本会被排队到对象中,并在连接建立且encrypted() 信号发出后写入套接字。

mode 的默认行为是ReadWrite 。

若要在连接的服务器端创建QSslSocket ,应在通过QTcpServer 接收传入连接时调用startServerEncryption()。

另请参阅 connectToHost()、startClientEncryption()、waitForConnected() 以及waitForEncrypted()。

void QSslSocket::connectToHostEncrypted(const QString &hostName, quint16 port, const QString &sslPeerName, QIODeviceBase::OpenMode mode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)

除了 connectToHostEncrypted 的原始行为外,此重载方法还允许在证书验证时使用与 TCP 连接(hostName )不同的主机名(sslPeerName )。

这是一个重载函数。

另请参阅 connectToHostEncrypted()。

[since 6.0] void QSslSocket::continueInterruptedHandshake()

如果某个应用程序希望在接收到handshakeInterruptedOnError()信号后仍完成握手,则必须调用此函数。此调用必须在与该信号关联的槽函数中进行。信号与槽的连接必须是直接的。

该函数在 Qt 6.0 中引入。

另请参阅 handshakeInterruptedOnError() 和QSslConfiguration::setHandshakeMustInterruptOnError()。

[override virtual] void QSslSocket::disconnectFromHost()

重写了:QAbstractSocket::disconnectFromHost()。

[signal] void QSslSocket::encrypted()

当QSslSocket 进入加密模式时,会发出此信号。该信号发出后,QSslSocket::isEncrypted() 将返回 true,且该套接字上的所有后续传输都将被加密。

另请参阅 QSslSocket::connectToHostEncrypted() 和QSslSocket::isEncrypted()。

qint64 QSslSocket::encryptedBytesAvailable() const

返回待解密的加密字节数。通常情况下,该函数将返回 0,因为 `QSslSocket ` 会尽快对接收到的数据进行解密。

qint64 QSslSocket::encryptedBytesToWrite() const

返回等待写入网络的加密字节数。

[signal] void QSslSocket::encryptedBytesWritten(qint64 written)

当QSslSocket 将加密数据写入网络时,会发出此信号。written 参数包含成功写入的字节数。

另请参阅 QIODevice::bytesWritten()。

[signal] void QSslSocket::handshakeInterruptedOnError(const QSslError &error)

QSslSocket 如果在证书验证过程中发现错误,且在QSslConfiguration 中启用了早期错误报告功能,则会发出此信号。应用程序应检查error ,并决定是继续握手,还是终止握手并向对端发送警报消息。信号-插槽连接必须是直接的。

另请参阅 continueInterruptedHandshake()、sslErrors(), 以及QSslConfiguration::setHandshakeMustInterruptOnError()。

[slot] void QSslSocket::ignoreSslErrors()

此插槽指示 `QSslSocket ` 在 `QSslSocket` 的握手阶段忽略错误并继续建立连接。若希望即使在握手阶段出现错误仍继续建立连接,则必须调用此插槽——既可以通过连接到 `sslErrors()` 的插槽进行调用,也可以在握手阶段开始前调用。 若未在响应错误或握手机前调用此插槽,则在发出sslErrors() 信号后,连接将被断开。

如果 SSL 握手阶段没有错误(即对等方的身份已顺利确定),则QSslSocket 不会发出sslErrors() 信号,因此无需调用此函数。

警告:务必 始终让用户检查sslErrors() 信号报告的错误,并且只有在用户确认可以继续操作后,才 调用此方法。如果出现意外错误,应终止连接。在未检查实际错误的情况下调用此方法,极有可能给您的应用程序带来安全风险。使用时请务必谨慎!

注意:此 插槽已被重载。要连接到此插槽:

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        sslSocket, qOverload<>(&QSslSocket::ignoreSslErrors));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        sslSocket, [receiver = sslSocket]() { receiver->ignoreSslErrors(); });
有关更多示例和方法,请参阅“连接到重载的插槽”。

另请参阅 sslErrors()。

void QSslSocket::ignoreSslErrors(const QList<QSslError> &errors)

此方法指示QSslSocket 仅忽略errors 中列出的错误。

注意:由于 大多数 SSL 错误都与证书相关,对于其中大多数情况,您必须设置该 SSL 错误所关联的预期证书。例如,如果您想连接到使用自签名证书的服务器,请参考以下代码片段:

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

QSslSocket socket;
socket.ignoreSslErrors(expectedSslErrors);
socket.connectToHostEncrypted("server.tld", 443);

多次调用此函数将覆盖之前调用中传入的错误列表。您可以通过传入一个空列表来调用此函数,从而清除要忽略的错误列表。

这是一个重载函数。

另请参阅 sslErrors() 和sslHandshakeErrors()。

[static, since 6.1] QList<QSsl::ImplementedClass> QSslSocket::implementedClasses(const QString &backendName = {})

该函数返回由名为backendName 的后端实现的后端特定类。空的backendName 将被视为对当前活动后端的查询。

该函数自 Qt 6.1 起引入。

另请参阅 QSsl::ImplementedClass 、activeBackend() 和isClassImplemented()。

[static, since 6.1] bool QSslSocket::isClassImplemented(QSsl::ImplementedClass cl, const QString &backendName = {})

如果名为backendName 的后端实现了类cl ,则返回 true。空的backendName 被视为对当前活动后端的查询。

该函数于 Qt 6.1 中引入。

另请参阅 implementedClasses()。

bool QSslSocket::isEncrypted() const

如果套接字已加密,则返回true ;否则返回false。

加密套接字会在将数据写入网络之前,通过调用 `write()` 或 `putChar()` 对所有数据进行加密;并在从网络接收数据时,在调用 `read()`、`readLine()` 或 `getChar()` 之前对所有传入数据进行解密。

QSslSocket 进入加密模式时,会触发encrypted()事件。

您可以调用sessionCipher() 来查明用于加密和解密数据的加密算法。

另请参阅 mode()。

[static, since 6.1] bool QSslSocket::isFeatureSupported(QSsl::SupportedFeature ft, const QString &backendName = {})

如果名为backendName 的后端支持ft 功能,则返回 true。空的backendName 将被视为针对当前活动后端的查询。

该函数于 Qt 6.1 中引入。

另请参阅 QSsl::SupportedFeature 和supportedFeatures()。

[static, since 6.1] bool QSslSocket::isProtocolSupported(QSsl::SslProtocol protocol, const QString &backendName = {})

如果名为backendName 的后端支持protocol ,则返回 true。空的backendName 将被视为对当前活动后端的查询。

该函数在 Qt 6.1 中引入。

另请参阅 supportedProtocols()。

QSslCertificate QSslSocket::localCertificate() const

返回套接字的本地certificate ,如果未分配本地证书,则返回一个空证书。

另请参阅 setLocalCertificate() 和privateKey()。

QList<QSslCertificate> QSslSocket::localCertificateChain() const

返回套接字的本地certificate 链;如果未分配任何本地证书,则返回一个空列表。

另请参阅 setLocalCertificateChain()。

QSslSocket::SslMode QSslSocket::mode() const

返回套接字的当前模式;该模式要么是UnencryptedMode (其中QSslSocket 的行为与QTcpSocket 完全相同),要么是SslClientMode 或SslServerMode 之一,此时客户端正处于协商状态或加密模式。

当模式发生变化时,QSslSocket 会发出modeChanged()

另请参阅 SslMode 。

[signal] void QSslSocket::modeChanged(QSslSocket::SslMode mode)

当QSslSocket 从QSslSocket::UnencryptedMode 变更为QSslSocket::SslClientMode 或QSslSocket::SslServerMode 时,会发出此信号。mode 即为新模式。

另请参阅 QSslSocket::mode()。

[signal] void QSslSocket::newSessionTicketReceived()

如果在握手过程中协商了 TLS 1.3 协议,则在收到 NewSessionTicket 消息后,QSslSocket 会发出此信号。会话和会话票据的有效期提示将在套接字配置中更新。该会话可用于未来 TLS 连接中的会话恢复(以及简化握手)。

注意:此 功能仅在使用 OpenSSL 后端时启用,且需要 OpenSSL v 1.1.1 或更高版本。

另请参阅 QSslSocket::sslConfiguration()、QSslConfiguration::sessionTicket() 以及QSslConfiguration::sessionTicketLifeTimeHint()。

QList<QOcspResponse> QSslSocket::ocspResponses() const

该函数返回服务器在使用 OCSP 钉扎进行 TLS 握手时可能发送的在线证书状态协议 (OCSP) 响应。如果未收到确定性响应或根本未收到任何响应,则该列表为空。

另请参阅 QSslConfiguration::setOcspStaplingEnabled()。

QSslCertificate QSslSocket::peerCertificate() const

返回对端的数字证书(即您所连接的主机的直接证书),如果对端未分配证书,则返回空证书。

对等方证书会在握手阶段自动进行验证,因此该函数通常用于获取证书以供显示或进行连接诊断。该证书包含有关对等方的信息,包括其主机名、证书签发者以及对等方的公钥。

由于对等方证书是在握手阶段设置的,因此通过连接到sslErrors()信号或encrypted()信号的插槽访问对等方证书是安全的。

如果返回空证书,可能意味着 SSL 握手失败,也可能意味着您连接的主机没有证书,或者根本没有建立连接。

若要检查对端的完整证书链,请使用peerCertificateChain() 一次性获取所有证书。

另请参阅 peerCertificateChain()。

QList<QSslCertificate> QSslSocket::peerCertificateChain() const

返回对等方的数字证书链,或一个空的证书列表。

在握手阶段会自动验证对等方的证书。该函数通常用于获取证书以供显示,或用于执行连接诊断。证书包含有关对等方和证书签发者的信息,包括主机名、签发者名称以及签发者的公钥。

对等方证书在握手阶段会被设置到QSslSocket 中,因此从连接到sslErrors()信号或encrypted()信号的插槽中调用此函数是安全的。

如果返回一个空列表,则可能意味着 SSL 握手失败,也可能意味着您连接的主机没有证书,或者可能意味着没有连接。

若仅需获取对端的直接证书,请使用peerCertificate()。

另请参阅 peerCertificate()。

int QSslSocket::peerVerifyDepth() const

返回在 SSL 握手阶段需检查的对等方证书链中的最大证书数量;如果未设置最大深度,则返回 0(默认值),表示应检查整个证书链。

证书按签发顺序进行验证,从对等方的自身证书开始,然后是其签发者的证书,依此类推。

另请参阅 setPeerVerifyDepth() 和peerVerifyMode()。

[signal] void QSslSocket::peerVerifyError(const QSslError &error)

QSslSocket 在 SSL 握手过程中,在加密建立之前,可能会多次发出此信号,以表明在确定对端身份时发生了错误。error 通常表明QSslSocket 无法安全地识别对端。

该信号可在出现问题时为您提供早期预警。通过监听此信号,您可以在握手完成之前,从已连接的插槽内部手动选择终止连接。如果不采取任何行动,QSslSocket 将继续发出QSslSocket::sslErrors() 信号。

另请参阅 sslErrors()。

QSslSocket::PeerVerifyMode QSslSocket::peerVerifyMode() const

返回套接字的验证模式。该模式决定QSslSocket 是否应向对端请求证书(即客户端向服务器请求证书,或服务器向客户端请求证书),以及是否应要求该证书有效。

默认模式为AutoVerifyPeer ,这会指示QSslSocket 对客户端使用VerifyPeer ,对服务器使用QueryPeer 。

另请参阅 setPeerVerifyMode()、peerVerifyDepth() 和mode()。

QString QSslSocket::peerVerifyName() const

返回用于证书验证的不同主机名,该主机名由setPeerVerifyName 或connectToHostEncrypted 设置。

另请参阅 setPeerVerifyName() 和connectToHostEncrypted()。

[signal] void QSslSocket::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)

QSslSocket 在协商 PSK 密码套件时会发出此信号,因此随后需要进行 PSK 身份验证。

使用预共享密钥(PSK)时,客户端必须向服务器发送有效的身份信息和有效的预共享密钥,以便 SSL 握手继续进行。应用程序可以通过连接到该信号的插槽提供这些信息,方法是根据需要填充传入的 `authenticator ` 对象。

注意:忽略 此信号或未能提供所需的凭据,将导致握手失败,从而导致连接中止。

注意: authenticator 对象由套接字所有,应用程序不得将其删除。

另请参阅 QSslPreSharedKeyAuthenticator 。

QSslKey QSslSocket::privateKey() const

返回该套接字的私钥。

另请参阅 setPrivateKey() 和localCertificate()。

QSsl::SslProtocol QSslSocket::protocol() const

返回套接字的 SSL 协议。默认情况下,使用QSsl::SecureProtocols 。

另请参阅 setProtocol()。

[override virtual protected] qint64 QSslSocket::readData(char *data, qint64 maxlen)

重构了:QAbstractSocket::readData (char *data, qint64 maxSize)。

[override virtual] void QSslSocket::resume()

重写了:QAbstractSocket::resume()。

在套接字暂停后继续数据传输。如果已对该套接字调用了“setPauseMode(QAbstractSocket::PauseOnSslErrors);”,且接收到sslErrors()信号,则必须调用此方法才能使套接字继续工作。

另请参阅 QAbstractSocket::pauseMode() 和QAbstractSocket::setPauseMode()。

QSslCipher QSslSocket::sessionCipher() const

返回套接字的加密算法cipher ,如果连接未加密,则返回空加密算法。套接字在握手阶段会设置该会话的加密算法。该加密算法用于对通过套接字传输的数据进行加密和解密。

QSslSocket 此外,还提供了用于设置加密算法有序列表的函数,握手阶段将最终从该列表中选择会话加密算法。该有序列表必须在握手阶段开始之前就已准备就绪。

另请参阅 QSslConfiguration::ciphers()、QSslConfiguration::setCiphers() 和QSslConfiguration::supportedCiphers()。

QSsl::SslProtocol QSslSocket::sessionProtocol() const

返回套接字的 SSL/TLS 协议;如果连接未加密,则返回 UnknownProtocol。该套接字在握手阶段会为当前会话设置相应的协议。

另请参阅 protocol() 和setProtocol()。

[static, since 6.1] bool QSslSocket::setActiveBackend(const QString &backendName)

如果名称为backendName 的后端已被设为活动后端,则返回 true。backendName 必须是availableBackends() 返回的名称之一。

注意:应用程序 不能同时混合使用不同的后端。这意味着在使用QSslSocket 或相关类(例如QSslCertificate 或QSslKey )之前,必须先选择一个非默认后端。

该函数于 Qt 6.1 版本中引入。

另请参阅 activeBackend() 和availableBackends()。

void QSslSocket::setLocalCertificate(const QSslCertificate &certificate)

将套接字的本地证书设置为certificate 。如果您需要向对端确认身份,则必须设置本地证书。该证书需与私钥配合使用;如果设置了本地证书,则必须同时设置私钥。

对于服务器套接字,本地证书和私钥始终是必需的;而对于客户端套接字,如果服务器要求客户端进行身份验证,则通常也会用到它们。

注意: macOS 上的Secure Transport SSL 后端可能会通过导入您的本地证书和密钥来更新默认钥匙串(默认钥匙串很可能是您的登录钥匙串)。 这还可能导致当您的应用程序使用这些私钥时,系统会弹出对话框请求权限。如果不希望出现此类行为,请将环境变量 QT_SSL_USE_TEMPORARY_KEYCHAIN 设置为非零值;这将促使QSslSocket 使用其自身的临时钥匙串。

另请参阅 localCertificate() 和setPrivateKey()。

void QSslSocket::setLocalCertificate(const QString &path, QSsl::EncodingFormat format = QSsl::Pem)

将套接字的本地certificate 设置为在文件path 中找到的第一个,该文件将根据指定的format 进行解析。

这是一个重载函数。

void QSslSocket::setLocalCertificateChain(const QList<QSslCertificate> &localChain)

将SSL握手过程中向对端出示的证书链设置为localChain 。

另请参阅 localCertificateChain() 和QSslConfiguration::setLocalCertificateChain()。

void QSslSocket::setPeerVerifyDepth(int depth)

将SSL握手阶段中需检查的对等方证书链中的证书最大数量设置为depth 。将深度设为0表示未设置最大深度,即应检查整个证书链。

证书按签发顺序进行验证,从对等方的自身证书开始,然后是其签发者的证书,依此类推。

另请参阅 peerVerifyDepth() 和setPeerVerifyMode()。

void QSslSocket::setPeerVerifyMode(QSslSocket::PeerVerifyMode mode)

将套接字的验证模式设置为mode 。该模式决定QSslSocket 是否应向对端请求证书(即客户端向服务器请求证书,或服务器向客户端请求证书),以及是否应要求该证书有效。

默认模式为AutoVerifyPeer ,这指示QSslSocket 对客户端使用VerifyPeer ,对服务器使用QueryPeer 。

在加密开始后设置此模式对当前连接没有影响。

另请参阅 peerVerifyMode()、setPeerVerifyDepth() 和mode()。

void QSslSocket::setPeerVerifyName(const QString &hostName)

为证书验证设置一个不同的主机名(由hostName 指定),而非用于 TCP 连接的主机名。

另请参阅 peerVerifyName() 和connectToHostEncrypted()。

void QSslSocket::setPrivateKey(const QSslKey &key)

将套接字的私钥key 设置为key 。私钥和本地证书certificate 用于必须向SSL对等方证明其身份的客户端和服务器。

若要创建 SSL 服务器套接字,则必须同时提供密钥和本地证书。若要创建 SSL 客户端套接字,当客户端必须向 SSL 服务器证明其身份时,则必须提供密钥和本地证书。

另请参阅 privateKey() 和setLocalCertificate()。

void QSslSocket::setPrivateKey(const QString &fileName, QSsl::KeyAlgorithm algorithm = QSsl::Rsa, QSsl::EncodingFormat format = QSsl::Pem, const QByteArray &passPhrase = QByteArray())

读取文件fileName 中的字符串,并使用指定的algorithm 和编码format 对其进行解码,以构建SSL key 。如果编码后的密钥经过加密,则使用passPhrase 对其进行解密。

套接字的私钥将设置为生成的密钥。当客户端和服务器需要向 SSL 对等方证明其身份时,会使用该私钥和本地certificate 。

若要创建 SSL 服务器套接字,则必须同时提供密钥和本地证书。若要创建 SSL 客户端套接字,当客户端必须向 SSL 服务器证明其身份时,则需同时提供密钥和本地证书。

这是一个重载函数。

另请参阅 privateKey() 和setLocalCertificate()。

void QSslSocket::setProtocol(QSsl::SslProtocol protocol)

将套接字的 SSL 协议设置为protocol 。这将影响接下来发起的握手过程;若在已加密的套接字上调用此函数,则不会影响该套接字的协议。

另请参阅 protocol()。

[override virtual] void QSslSocket::setReadBufferSize(qint64 size)

重写了:QAbstractSocket::setReadBufferSize (qint64 类型)。

将QSslSocket 的内部读取缓冲区大小设置为size 字节。

[override virtual] bool QSslSocket::setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState state = ConnectedState, QIODeviceBase::OpenMode openMode = ReadWrite)

重写:QAbstractSocket::setSocketDescriptor (qintptr socketDescriptor, QAbstractSocket::SocketState socketState, QIODeviceBase::OpenMode openMode)。

使用本地套接字描述符 `socketDescriptor` 初始化 `QSslSocket `。如果 `socketDescriptor ` 被接受为有效的套接字描述符,则返回 `true `;否则返回 `false`。套接字将以 `openMode` 指定的模式打开,并进入 `state` 指定的套接字状态。

注意:无法 使用同一个本机套接字描述符初始化两个套接字。

另请参阅 socketDescriptor()。

[override virtual] void QSslSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)

重写了:QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)。

将给定的option 设置为value 所描述的值。

另请参阅 socketOption()。

void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)

将套接字的 SSL 配置设置为configuration 中的内容。该函数将本地证书、加密套件、私钥和 CA 证书设置为configuration 中存储的值。

无法设置与 SSL 状态相关的字段。

另请参阅 sslConfiguration()、setLocalCertificate()、setPrivateKey()、QSslConfiguration::setCaCertificates() 以及QSslConfiguration::setCiphers()。

[override virtual protected] qint64 QSslSocket::skipData(qint64 maxSize)

重实现了:QAbstractSocket::skipData (qint64 maxSize)。

[override virtual] QVariant QSslSocket::socketOption(QAbstractSocket::SocketOption option)

重写了:QAbstractSocket::socketOption (QAbstractSocket::SocketOption option)。

返回option 选项的值。

另请参阅 setSocketOption()。

QSslConfiguration QSslSocket::sslConfiguration() const

返回套接字的 SSL 配置状态。套接字的默认 SSL 配置是使用默认的加密套件和默认的 CA 证书,且不使用本地私钥或证书。

SSL 配置中还包含一些字段,这些字段可能会随时间变化,且不会另行通知。

另请参阅 setSslConfiguration()、localCertificate()、peerCertificate()、peerCertificateChain()、sessionCipher()、privateKey()、QSslConfiguration::ciphers() 以及QSslConfiguration::caCertificates()。

[signal] void QSslSocket::sslErrors(const QList<QSslError> &errors)

QSslSocket 在 SSL 握手完成后发出此信号,以指示在确定对端身份的过程中发生了一个或多个错误。这些错误通常表明QSslSocket 无法安全地识别对端。除非采取任何措施,否则在发出此信号后,连接将被终止。

若您希望在出现错误的情况下仍继续连接,必须在连接到该信号的插槽内调用QSslSocket::ignoreSslErrors()。若您需要在后续访问错误列表,可调用sslHandshakeErrors()。

errors 包含一个或多个错误,导致QSslSocket 无法验证对等方的身份。

注意: 连接到此信号时不能使用Qt::QueuedConnection ,否则调用QSslSocket::ignoreSslErrors()将无效。

另请参阅 peerVerifyError()。

QList<QSslError> QSslSocket::sslHandshakeErrors() const

返回最近发生的SSL错误列表。该列表与QSslSocket 通过sslErrors()信号传递的列表相同。如果连接已加密且未发生错误,则该函数将返回一个空列表。

另请参阅 connectToHostEncrypted()。

[static] long QSslSocket::sslLibraryBuildVersionNumber()

返回编译时所用 SSL 库的版本号。如果不支持 SSL,则返回 -1。

另请参阅 sslLibraryVersionNumber()。

[static] QString QSslSocket::sslLibraryBuildVersionString()

返回编译时所用 SSL 库的版本字符串。如果未启用 SSL 支持,则返回空值。

另请参阅 sslLibraryVersionString()。

[static] long QSslSocket::sslLibraryVersionNumber()

返回正在使用的 SSL 库的版本号。请注意,这是运行时使用的库版本,而非编译时版本。如果未提供 SSL 支持,则返回 -1。

[static] QString QSslSocket::sslLibraryVersionString()

返回正在使用的 SSL 库的版本字符串。请注意,这是运行时使用的库版本,而非编译时版本。如果未启用 SSL 支持,则该方法将返回空值。

[slot] void QSslSocket::startClientEncryption()

为客户端连接启动延迟 SSL 握手。当套接字处于“ConnectedState ”状态但仍处于“UnencryptedMode ”状态时,可以调用此函数。如果尚未建立连接,或者已经加密,则此函数无效。

实现 STARTTLS 功能的客户端通常会使用延迟 SSL 握手。大多数其他客户端可以通过使用connectToHostEncrypted() 来避免直接调用此函数,该函数会自动执行握手。

另请参阅 connectToHostEncrypted() 和startServerEncryption()。

[slot] void QSslSocket::startServerEncryption()

启动服务器连接的延迟 SSL 握手。当套接字处于“ConnectedState ”状态但仍处于“UnencryptedMode ”状态时,可以调用此函数。如果套接字未连接或已加密,则该函数无效。

对于服务器套接字,调用此函数是启动 SSL 握手过程的唯一方式。 大多数服务器会在收到连接请求后立即调用此函数,或者在收到进入 SSL 模式的特定协议命令后调用(例如,服务器在收到字符串“STARTTLS\r\n ”时,可能会通过调用此函数来响应)。

实现 SSL 服务器的最常见方法是创建QTcpServer 的子类,并重写QTcpServer::incomingConnection() 函数。随后将返回的套接字描述符传递给QSslSocket::setSocketDescriptor()。

另请参阅 connectToHostEncrypted() 和startClientEncryption()。

[static, since 6.1] QList<QSsl::SupportedFeature> QSslSocket::supportedFeatures(const QString &backendName = {})

该函数返回名为backendName 的后端所支持的功能。若backendName 为空,则视为对当前活动后端的查询。

该函数于 Qt 6.1 中引入。

另请参阅 QSsl::SupportedFeature 和activeBackend()。

[static, since 6.1] QList<QSsl::SslProtocol> QSslSocket::supportedProtocols(const QString &backendName = {})

如果存在名为backendName 的后端,则该函数返回该后端支持的TLS协议版本列表。空的backendName 被视为对当前活动后端的查询。否则,该函数返回一个空列表。

该函数在 Qt 6.1 中引入。

另请参阅 availableBackends()、activeBackend() 和isProtocolSupported()。

[static] bool QSslSocket::supportsSsl()

如果该平台支持 SSL,则返回 `true `;否则,返回 `false`。如果平台不支持 SSL,套接字将在连接阶段失败。

[override virtual] bool QSslSocket::waitForBytesWritten(int msecs = 30000)

重实现:QAbstractSocket::waitForBytesWritten (int msecs)。

[override virtual] bool QSslSocket::waitForConnected(int msecs = 30000)

重写自:QAbstractSocket::waitForConnected(int msecs)。

等待直到套接字建立连接,或者等待msecs 毫秒,以先发生者为准。如果连接已建立,该函数返回true ;否则返回false 。

另请参阅 QAbstractSocket::waitForConnected()。

[override virtual] bool QSslSocket::waitForDisconnected(int msecs = 30000)

重写了:QAbstractSocket::waitForDisconnected (int msecs)。

等待直到套接字断开连接,或者等待msecs 毫秒,以先发生者为准。如果连接已断开,该函数返回true ;否则返回false 。

另请参阅 QAbstractSocket::waitForDisconnected()。

bool QSslSocket::waitForEncrypted(int msecs = 30000)

等待套接字完成 SSL 握手并发出encrypted() 信号,或等待msecs 毫秒,以先发生者为准。如果已发出encrypted() 信号,则该函数返回 true;否则(例如,套接字已断开连接,或 SSL 握手失败),则返回 false。

以下示例最多等待一秒钟,直到套接字完成加密:

socket->connectToHostEncrypted("imap", 993);
if(socket->waitForEncrypted(1000))
    qDebug("Encrypted!");

如果 msecs 的值为 -1,则该函数不会超时。

另请参阅 startClientEncryption()、startServerEncryption()、encrypted() 以及isEncrypted()。

[override virtual] bool QSslSocket::waitForReadyRead(int msecs = 30000)

重写了:QAbstractSocket::waitForReadyRead (int msecs)。

[override virtual protected] qint64 QSslSocket::writeData(const char *data, qint64 len)

重写了:QAbstractSocket::writeData (const char *data, qint64 size)。

相关的非成员函数

[since 6.0] enum class AlertLevel

描述警报消息的级别

此枚举描述了已发送或接收的警报消息的级别。

常量值描述
QSslSocket::AlertLevel::Warning0非致命警报消息
QSslSocket::AlertLevel::Fatal1致命警报消息,底层后端将正确处理此类警报并关闭连接。
QSslSocket::AlertLevel::Unknown2严重程度未知的警报。

此枚举在 Qt 6.0 中引入。

[since 6.0] enum class AlertType

列举了警报消息可能包含的代码

有关可能的值及其含义,请参阅RFC 8446 第 6 节。

常量值描述
QSslSocket::AlertType::CloseNotify0,
QSslSocket::AlertType::UnexpectedMessage10 
QSslSocket::AlertType::BadRecordMac20 
QSslSocket::AlertType::RecordOverflow22 
QSslSocket::AlertType::DecompressionFailure30 
QSslSocket::AlertType::HandshakeFailure40 
QSslSocket::AlertType::NoCertificate41 
QSslSocket::AlertType::BadCertificate42 
QSslSocket::AlertType::UnsupportedCertificate43 
QSslSocket::AlertType::CertificateRevoked44 
QSslSocket::AlertType::CertificateExpired45 
QSslSocket::AlertType::CertificateUnknown46 
QSslSocket::AlertType::IllegalParameter47 
QSslSocket::AlertType::UnknownCa48 
QSslSocket::AlertType::AccessDenied49 
QSslSocket::AlertType::DecodeError50 
QSslSocket::AlertType::DecryptError51 
QSslSocket::AlertType::ExportRestriction60 
QSslSocket::AlertType::ProtocolVersion70 
QSslSocket::AlertType::InsufficientSecurity71 
QSslSocket::AlertType::InternalError80 
QSslSocket::AlertType::InappropriateFallback86 
QSslSocket::AlertType::UserCancelled90 
QSslSocket::AlertType::NoRenegotiation100 
QSslSocket::AlertType::MissingExtension109 
QSslSocket::AlertType::UnsupportedExtension110 
QSslSocket::AlertType::CertificateUnobtainable111 
QSslSocket::AlertType::UnrecognizedName112 
QSslSocket::AlertType::BadCertificateStatusResponse113 
QSslSocket::AlertType::BadCertificateHashValue114 
QSslSocket::AlertType::UnknownPskIdentity115 
QSslSocket::AlertType::CertificateRequired116 
QSslSocket::AlertType::NoApplicationProtocol120 
QSslSocket::AlertType::UnknownAlertMessage255 

该枚举类型是在 Qt 6.0 中引入的。

[since 6.1] enum class ImplementedClass

列举 TLS 后端所实现的类

在QtNetwork 中,某些类具有后端特有的实现,因此可以不进行实现。该枚举中的枚举项指示了哪些类在后端中具有可运行的实现。

常量值描述
QSslSocket::ImplementedClass::Key0类QSslKey 。
QSslSocket::ImplementedClass::Certificate1类QSslCertificate 。
QSslSocket::ImplementedClass::Socket2QSslSocket 类。
QSslSocket::ImplementedClass::DiffieHellman3QSslDiffieHellmanParameters 类。
QSslSocket::ImplementedClass::EllipticCurve4QSslEllipticCurve 类。
QSslSocket::ImplementedClass::Dtls5QDtls 类。
QSslSocket::ImplementedClass::DtlsCookie6类QDtlsClientVerifier 。

该枚举类型在 Qt 6.1 中引入。

[since 6.1] enum class SupportedFeature

列举 TLS 后端可能支持的功能

在QtNetwork 中,TLS相关类具有公共API,某些后端可能未实现这些API,例如,我们的SecureTransport后端不支持服务器端ALPN。SupportedFeature枚举中的枚举项表示特定功能是否受支持。

常量值描述
QSslSocket::SupportedFeature::CertificateVerification0表示后端已实现QSslCertificate::verify() 方法。
QSslSocket::SupportedFeature::ClientSideAlpn1客户端 ALPN(应用层协议协商)。
QSslSocket::SupportedFeature::ServerSideAlpn2服务器端 ALPN。
QSslSocket::SupportedFeature::Ocsp3OCSP 钉合(在线证书状态协议)。
QSslSocket::SupportedFeature::Psk4预共享密钥。
QSslSocket::SupportedFeature::SessionTicket5会话票证。
QSslSocket::SupportedFeature::Alerts6关于已发送和已接收警报消息的信息。

该枚举在 Qt 6.1 中引入。

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