QSslSocket 类

QSslSocket 类提供客户端和服务器使用的 SSL 加密套接字。 更多...

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

注意: 此类中的所有函数都是可重入的

公共类型

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

公共函数

QSslSocket(QObject *parent = nullptr)
virtual~QSslSocket()
voidconnectToHostEncrypted(const QString &hostName, quint16 port, QIODeviceBase::OpenMode mode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
voidconnectToHostEncrypted(const QString &hostName, quint16 port, const QString &sslPeerName, QIODeviceBase::OpenMode mode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
(自 6.0) voidcontinueInterruptedHandshake()
qint64encryptedBytesAvailable() const
qint64encryptedBytesToWrite() const
voidignoreSslErrors(const QList<QSslError> &errors)
boolisEncrypted() const
QSslCertificatelocalCertificate() const
QList<QSslCertificate>localCertificateChain() const
QSslSocket::SslModemode() const
QList<QOcspResponse>ocspResponses() const
QSslCertificatepeerCertificate() const
QList<QSslCertificate>peerCertificateChain() const
intpeerVerifyDepth() const
QSslSocket::PeerVerifyModepeerVerifyMode() const
QStringpeerVerifyName() const
QSslKeyprivateKey() const
QSsl::SslProtocolprotocol() const
QSslCiphersessionCipher() const
QSsl::SslProtocolsessionProtocol() const
voidsetLocalCertificate(const QSslCertificate &certificate)
voidsetLocalCertificate(const QString &path, QSsl::EncodingFormat format = QSsl::Pem)
voidsetLocalCertificateChain(const QList<QSslCertificate> &localChain)
voidsetPeerVerifyDepth(int depth)
voidsetPeerVerifyMode(QSslSocket::PeerVerifyMode mode)
voidsetPeerVerifyName(const QString &hostName)
voidsetPrivateKey(const QSslKey &key)
voidsetPrivateKey(const QString &fileName, QSsl::KeyAlgorithm algorithm = QSsl::Rsa, QSsl::EncodingFormat format = QSsl::Pem, const QByteArray &passPhrase = QByteArray())
voidsetProtocol(QSsl::SslProtocol protocol)
voidsetSslConfiguration(const QSslConfiguration &configuration)
QSslConfigurationsslConfiguration() const
QList<QSslError>sslHandshakeErrors() const
boolwaitForEncrypted(int msecs = 30000)

重写的公共函数

virtual boolatEnd() const override
virtual qint64bytesAvailable() const override
virtual qint64bytesToWrite() const override
virtual boolcanReadLine() const override
virtual voidclose() override
virtual voidresume() override
virtual voidsetReadBufferSize(qint64 size) override
virtual boolsetSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState state = ConnectedState, QIODeviceBase::OpenMode openMode = ReadWrite) override
virtual voidsetSocketOption(QAbstractSocket::SocketOption option, const QVariant &value) override
virtual QVariantsocketOption(QAbstractSocket::SocketOption option) override
virtual boolwaitForBytesWritten(int msecs = 30000) override
virtual boolwaitForConnected(int msecs = 30000) override
virtual boolwaitForDisconnected(int msecs = 30000) override
virtual boolwaitForReadyRead(int msecs = 30000) override

公共槽

信号

voidalertReceived(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
voidalertSent(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
voidencrypted()
voidencryptedBytesWritten(qint64 written)
voidhandshakeInterruptedOnError(const QSslError &error)
voidmodeChanged(QSslSocket::SslMode mode)
voidnewSessionTicketReceived()
voidpeerVerifyError(const QSslError &error)
voidpreSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)
voidsslErrors(const QList<QSslError> &errors)

静态公共成员

(since 6.1) QStringactiveBackend()
(since 6.1) QList<QString>availableBackends()
(自6.1开始) QList<QSsl::ImplementedClass>implementedClasses(const QString &backendName = {})
(自6.1开始) boolisClassImplemented(QSsl::ImplementedClass cl, const QString &backendName = {})
(自6.1开始) boolisFeatureSupported(QSsl::SupportedFeature ft, const QString &backendName = {})
(自6.1开始) boolisProtocolSupported(QSsl::SslProtocol protocol, const QString &backendName = {})
(自6.1开始) boolsetActiveBackend(const QString &backendName)
longsslLibraryBuildVersionNumber()
QStringsslLibraryBuildVersionString()
longsslLibraryVersionNumber()
QStringsslLibraryVersionString()
(自6.1开始) QList<QSsl::SupportedFeature>supportedFeatures(const QString &backendName = {})
(自6.1开始) QList<QSsl::SslProtocol>supportedProtocols(const QString &backendName = {})
boolsupportsSsl()

重写受保护的函数

virtual qint64readData(char *data, qint64 maxlen) override
virtual qint64skipData(qint64 maxSize) override
virtual qint64writeData(const char *data, qint64 len) override
(自6.0开始) enum classAlertLevel { 警告, 严重, 未知 }
(自6.0开始) enum classAlertType { 关闭通知, 未预期消息, 记录MAC错误, 记录溢出, 解压缩失败, …, 未知警报消息 }
(自6.1开始) enum classImplementedClass { 密钥, 证书, 套接字, Diffie-Hellman, 椭圆曲线, …, DtlsCookie }
(自6.1开始) enum classSupportedFeature { 证书验证, 客户端ALPN, 服务器ALPN, OCSP, Psk, …, 警报 }

详细信息

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

SSL加密在套接字进入ConnectedState后,在现有的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服务器保护入站连接时。假设你创建一个SSL服务器类作为QTcpServer的子类。你将使用下面的示例覆盖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()信号。在这种情况下,如果不采取行动忽略错误(s),则将断开连接。为了继续,即使发生错误,你也可以在错误发生后的插槽内部调用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()),或者在 QSslSocket 实例上调用 QSslConfiguration::defaultConfiguration()::setCaCertificates()。

有关关于加密和证书的更多信息,请参阅 QSslCipherQSslCertificate

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

注意: 请注意 bytesWritten() 信号和 encryptedBytesWritten() 信号之间的区别。对于 QTcpSocket,当数据被写入 TCP 套接字时,bytesWritten() 将被发出。对于 QSslSocket,当数据正在加密时 bytesWritten() 将被发出,而当数据被写入 TCP 套接字时 encryptedBytesWritten() 将被发出。

另请参阅 QSslCertificateQSslCipherQSslError

成员类型文档

枚举 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()。

枚举 QSslSocket::SslMode

描述 QSslSocket 可用的连接模式。

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

成员函数文档

[明确] QSslSocket::QSslSocket(QObject *parent = nullptr)

构造QSslSocket对象。将parent传递给QObject的构造函数。新套接字的安全套件密钥组合设置为静态方法defaultCiphers()返回的值。

[虚拟、无抛出异常] QSslSocket::~QSslSocket()

销毁QSslSocket。

[静态,自6.1版本起] QString QSslSocket::activeBackend()

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

注意:当隐式选择默认后端时,如果可用,QSslSocket倾向于OpenSSL后端。如果不可用,则在Windows上默认选择Schannel后端,在Darwin平台上默认选择Secure Transport。如果这些都不满足,如果找到自定义TLS后端,则使用它。如果没有找到其他后端,则选择“仅证书”后端。有关TLS插件的更多信息,请参见从源代码构建Qt时启用和禁用SSL支持

此函数是在Qt 6.1中引入的。

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

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

QSslSocket在收到从对等方的警告消息时发出此信号。level告诉警告是致命的还是警告。type解释了发送警告的原因。当有警告消息的文本描述可供使用时,它会在description中提供。

注意:该信号主要用于信息和调试目的,不需要在应用程序中进行任何处理。如果警告是致命的,则在底层后端将其处理并关闭连接。

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

另请参阅:alertSent(),QSsl::AlertLevel,和 QSsl::AlertType

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

QSslSocket在向对等方发送警告消息时发出此信号。level描述了是警告还是致命错误。type给出警告消息的代码。如果可用,则文本描述在description中提供。

注意:此信号主要用于信息和调试目的,通常不需要应用程序执行任何操作。

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

另请参阅 alertReceived(),QSsl::AlertLevelQSsl::AlertType

[覆盖虚函数] bool QSslSocket::atEnd() const

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

[静态,自6.1起] QList<QString> QSslSocket::availableBackends()

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

此函数是在Qt 6.1中引入的。

另请参阅 activeBackend

[覆盖虚函数] qint64 QSslSocket::bytesAvailable() const

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

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

[覆盖虚函数] qint64 QSslSocket::bytesToWrite() const

重新实现: QAbstractSocket::bytesToWrite() const

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

[覆盖虚函数] bool QSslSocket::canReadLine() const

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

如果您可以读取一个由单个ASCII '\n' 字符终止的行(解密字符),则返回 true;否则返回 false

[覆盖虚函数] void QSslSocket::close()

重新实现: QAbstractSocket::close

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

启动对 hostNameport 的设备的加密连接,使用 mode 作为 OpenMode。这相当于调用 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()信号后写入套接字。

默认的模式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的原生行为外,此重载方法还允许使用不同的主机名(即sslPeerName)来验证证书,而不是用于TCP连接的(即hostName)。

参见connectToHostEncrypted

[since 6.0] void QSslSocket::continueInterruptedHandshake()

如果应用程序希望在接收到handshakeInterruptedOnError()信号后仍然完成握手,则必须调用此函数。此调用必须从附加到信号的槽函数中执行。信号-槽连接必须是直接的。

此函数是在Qt 6.0中引入的。

参见handshakeInterruptedOnError()和QSslConfiguration::setHandshakeMustInterruptOnError

[信号] void QSslSocket::encrypted()

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

参见QSslSocket::connectToHostEncrypted()和QSslSocket::isEncrypted

qint64 QSslSocket::encryptedBytesAvailable() const

返回等待解密的加密字节数。通常,此函数将返回0,因为 QSslSocket 会尽快解密其接收到的数据。

qint64 QSslSocket::encryptedBytesToWrite() const

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

[信号] void QSslSocket::encryptedBytesWritten(qint64 written)

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

另请参阅QIODevice::bytesWritten

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

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

另请参阅continueInterruptedHandshakesslErrorsQSslConfiguration::setHandshakeMustInterruptOnError

[槽] void QSslSocket::ignoreSslErrors()

此槽通知 QSslSocket 在握手阶段忽略错误并继续连接。如果您想在握手阶段出现错误的情况下继续连接,则必须从此槽或握手阶段之前调用此槽。如果不调用此槽,则在发出 sslErrors() 信号后,连接将被终止。

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

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

另请参阅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()。

[静态,自6.1以来] QList<QSsl::ImplementedClass> QSslSocket::implementedClasses(const QString &backendName = {})

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

此函数是在Qt 6.1中引入的。

另请参阅:QSsl::ImplementedClassactiveBackend() 和 isClassImplemented()。

[静态,自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()。

[静态,自6.1以来] bool QSslSocket::isFeatureSupported(QSsl::SupportedFeature ft, const QString &backendName = {})

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

此函数是在Qt 6.1中引入的。

另请参阅:QSsl::SupportedFeaturesupportedFeatures()。

[静态,自6.1版本起] bool QSslSocket::isProtocolSupported(QSsl::SslProtocol protocol, const QString &backendName = {})

如果名为backendName的后端支持protocol,则返回true。一个空的backendName表示关于当前活动后端的查询。

此函数是在Qt 6.1中引入的。

另请参阅 supportedProtocols

QSslCertificate QSslSocket::localCertificate() const

返回套接字的本地证书,如果没有分配本地证书,则返回空证书。

另请参阅 setLocalCertificate() 和 privateKey

QList<QSslCertificate> QSslSocket::localCertificateChain() const

返回套接字的本地证书链,如果没有分配本地证书,则返回空列表。

另请参阅 setLocalCertificateChain

QSslSocket::SslMode QSslSocket::mode() const

返回套接字当前的模式;要么是UnencryptedMode,其中QSslSocket的行为与QTcpSocket相同,要么是SslClientModeSslServerMode之一,在这种情况下,客户端正在协商或处于加密模式。

当模式改变时,QSslSocket将触发modeChanged()

另请参阅 SslMode

[信号] void QSslSocket::modeChanged(QSslSocket::SslMode mode)

QSslSocketQSslSocket::UnencryptedMode改为QSslSocket::SslClientModeQSslSocket::SslServerMode时,将发出此信号。mode是新的模式。

另请参阅 QSslSocket::mode

[信号] void QSslSocket::newSessionTicketReceived()

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

注意:此功能仅在OpenSSL后端启用,并要求OpenSSL v 1.1.1或更高版本。

另请参阅 QSslSocket::sslConfigurationQSslConfiguration::sessionTicketQSslConfiguration::sessionTicketLifeTimeHint

QList<QOcspResponse> QSslSocket::ocspResponses() const

此函数返回服务器在TLS握手期间使用OCSP stapling发送的在线证书状态协议(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()。

[信号] 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

返回由 setPeerVerifyNameconnectToHostEncrypted 设置的不同主机名,用于证书验证。

请参见 setPeerVerifyName() 和 connectToHostEncrypted

[信号] 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

[重写虚保护] qint64 QSslSocket::readData(char *数据, qint64 maxlen)

重新实现:QAbstractSocket::readData(char *data, qint64 maxSize).

[重写虚] void QSslSocket::resume()

重新实现:QAbstractSocket::resume().

在暂停后继续在套接字上传输数据。如果在此套接字上调用过 "setPauseMode(QAbstractSocket::PauseOnSslErrors);" 并且接收到一个 sslErrors() 信号,则调用此方法对于套接字继续是必要的。

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

QSslCipher QSslSocket::sessionCipher() const

返回套接字的加密 加密器,如果没有加密则返回 null 加密器。套接字会话的加密器在握手阶段设置。加密器用于通过套接字加密和解密传输的数据。

QSslSocket 还提供了从其中最终选择会话加密器的有序加密器列表的设置函数。在握手阶段开始之前,必须放置这个有序列表。

另请参阅 QSslConfiguration::ciphers(),QSslConfiguration::setCiphers(),QSslConfiguration::setCiphers(),QSslConfiguration::ciphers() 和 QSslConfiguration::supportedCiphers().

QSsl::SslProtocol QSslSocket::sessionProtocol() const

返回套接字的 SSL/TLS 协议,如果不是加密连接则返回 UnknownProtocol。套接字会话的协议在握手阶段设置。

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

[静态,自 6.1 版以来] bool QSslSocket::setActiveBackend(const QString &backendName)

如果已设置了名为 backendName 的后端作为活动后端,则返回 true。《i translate="no">backendName》 必须是 availableBackends() 返回的名称之一。

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

此函数是在Qt 6.1中引入的。

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

void QSslSocket::setLocalCertificate(const QSslCertificate &证书)

将套接字的本地证书设置为 证书。如果需要向对等方确认您的身份,则需要本地证书。它用于与私钥一起;如果您设置了本地证书,则还必须设置私钥。

服务器套接字始终需要本地证书和私钥,但如果服务器要求客户端进行身份验证,客户端套接字很少使用这些信息。

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

参见:localCertificate() 和 setPrivateKey()。

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

这是一个重载函数。

将套接字的本地 证书 设置为在文件 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)

将套接字的私有 密钥 设置为 密钥。私有密钥和本地 证书 被用于必须证明其身份给 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 密钥。如果编码的密钥加密,则使用 passPhrase 解密。

将套接字的私有密钥设置为构造的密钥。私有密钥和本地 证书 被用于必须证明其身份给 SSL 对等的客户端和服务器。

如果你正在创建 SSL 服务器套接字,则需要密钥和本地证书。如果你正在创建 SSL 客户端套接字,如果你的客户端必须向 SSL 服务器进行身份验证,则需要密钥和本地证书。

另请参阅privateKey() 和 setLocalCertificate

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

将套接字的 SSL 协议设置为 protocol。这将影响下一次启动的握手;在已经加密的套接字上调用此函数不会影响套接字的协议。

另请参阅protocol

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

重新实现了 QAbstractSocket::setReadBufferSize(qint64 size).

将 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

[覆盖虚函数] 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().

[覆盖虚保护函数] qint64 QSslSocket::skipData(qint64 maxSize)

重写: QAbstractSocket::skipData(qint64 maxSize).

[覆盖虚函数] 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()、QSslConfiguration::ciphers() 以及 QSslConfiguration::caCertificates().

[信号] 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

[静态] long QSslSocket::sslLibraryBuildVersionNumber()

返回在编译时使用的SSL库的版本号。如果没有SSL支持,则返回-1。

另请参阅sslLibraryVersionNumber

[静态] QString QSslSocket::sslLibraryBuildVersionString()

返回在编译时使用的SSL库的版本字符串。如果没有SSL支持,则返回空值。

另请参阅sslLibraryVersionString

(此处内容与第7段重复,可能需要删除)

[静态] long QSslSocket::sslLibraryVersionNumber()

[静态] QString QSslSocket::sslLibraryVersionString()

返回在运行时使用的SSL库的版本字符串。请注意,这是运行时使用的库版本,而不是编译时版本。如果没有SSL支持,则返回空值。

[槽] void QSslSocket::startClientEncryption()

开始客户端连接的延迟SSL握手。当套接字处于 ConnectedState 但仍在 UnencryptedMode 时,可以调用此函数。如果尚未连接,或如果它已经被加密,则此函数将没有效果。

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

另请参阅connectToHostEncrypted() 和 startServerEncryption

[槽] void QSslSocket::startServerEncryption()

启动一个服务器连接的延迟SSL握手。该函数可以在套接字处于连接状态但仍然在非加密模式时调用。如果未连接或者已加密,则该函数没有作用。

对于服务器套接字,调用此函数是启动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::SupportedFeatureactiveBackend

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

如果可用名为backendName的后端,此函数返回该后端支持的TLS协议版本列表。空backendName被视为关于当前活动后端的查询。否则,此函数返回空列表。

此函数是在Qt 6.1中引入的。

另请参阅 availableBackends()、activeBackendisProtocolSupported

[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)。

等待套接字连接,或 bizarrely 科普riks riitree milliseconds, whereabouts neibors happens first. If the connection has been established, this function returns bizarrely 科普trains; otherwise it returns 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,则此函数不会超时。

另请参阅 startClientEncryptionstartServerEncryptionencryptedisEncrypted

[重载虚拟] bool QSslSocket::waitForReadyRead(int msecs = 30000)

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

[重载虚拟受保护] qint64 QSslSocket::writeData(const char *data, qint64 len)

重实现:QAbstractSocket::writeData(const char *data, qint64 size)。

相关非成员

[自 6.0] enum class AlertLevel

描述警报消息的水平

此枚举描述已发送或接收的警报消息的水平。

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

该枚举自 Qt 6.0 起引入。

[自 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 起引入。

[自6.1开始] enum class ImplementedClass

列出了TLS后端实现类别的枚举

QtNetwork中,某些类有后端特定的实现,因此可以不实现。此枚举中的枚举指示哪些类在后端有有效的实现。

常量描述
QSslSocket::ImplementedClass::Key0QSslKey
QSslSocket::ImplementedClass::Certificate1QSslCertificate
QSslSocket::ImplementedClass::Socket2QSslSocket
QSslSocket::ImplementedClass::DiffieHellman3QSslDiffieHellmanParameters
QSslSocket::ImplementedClass::EllipticCurve4QSslEllipticCurve
QSslSocket::ImplementedClass::Dtls5QDtls
QSslSocket::ImplementedClass::DtlsCookie6QDtlsClientVerifier

此枚举于Qt 6.1中引入。

[自6.1开始] enum class SupportedFeature

列出了TLS后端可能支持的功能枚举

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

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

此枚举于Qt 6.1中引入。

© 2024 Qt公司有限公司。此处包含的文档贡献属于其各自的拥有者。提供的文档是在自由软件基金会发布的GNU自由文档许可证版本1.3的条款下许可的。Qt和 respective logos是芬兰以及/或其他国家/地区的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。