PySide6.QtNetwork.QSslSocket

class QSslSocket

QSslSocket 类为客户端和服务器提供了一个SSL加密的套接字。更多

PySide6.QtNetwork.QSslSocket 的继承图

概要

方法

插槽

信号

静态函数

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

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

SSL加密在套接字进入ConnectedState后,在现有的TCP流之上进行操作。使用QSslSocket有两种简单的方法来建立安全连接:一种是立即进行SSL握手,另一种是在未加密模式下建立连接后进行延迟的SSL握手。

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

socket = QSslSocket(self)
socket.encrypted.connect(self.ready)
socket.connectToHostEncrypted("imap.example.com", 993)

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

请注意,数据可以在从connectToHostEncrypted()返回后立即写入套接字(即在encrypted()信号发出之前)。数据将在QSslSocket中排队,直到encrypted()信号发出。

使用延迟SSL握手来保护现有连接的一个例子是SSL服务器保护传入连接的情况。假设你创建了一个SSL服务器类作为QTcpServer的子类。你可以像下面的例子一样重写incomingConnection(),首先构造一个QSslSocket的实例,然后调用setSocketDescriptor()将新套接字的描述符设置为传入的现有描述符。然后通过调用startServerEncryption()来启动SSL握手。

def incomingConnection(self, socketDescriptor):

    serverSocket = QSslSocket()
    if serverSocket.setSocketDescriptor(socketDescriptor):
        addPendingConnection(serverSocket)
        serverSocket.encrypted.connect(self.ready)
        serverSocket.startServerEncryption()
    else:
        del serverSocket

如果发生错误,QSslSocket 会发出 sslErrors() 信号。在这种情况下,如果不采取任何措施来忽略错误,连接将被断开。为了在发生错误的情况下继续,你可以调用 ignoreSslErrors(),无论是在错误发生后在这个槽内调用,还是在 QSslSocket 构建后和尝试连接之前的任何时间调用。这将允许 QSslSocket 忽略在建立对等方身份时遇到的错误。在SSL握手期间忽略错误应谨慎使用,因为安全连接的一个基本特征是它们应该通过成功的握手来建立。

一旦加密,你可以像使用普通的QTcpSocket一样使用QSslSocket。当readyRead()信号发出时,你可以调用read()、canReadLine()和readLine(),或者getChar()来从QSslSocket的内部缓冲区读取解密的数据,你也可以调用write()或putChar()将数据写回对端。QSslSocket会自动为你加密写入的数据,并在数据写入对端后发出encryptedBytesWritten()信号。

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

socket = QSslSocket()
socket.connectToHostEncrypted("http.example.com", 443)
if not socket.waitForEncrypted():
    print(socket.errorString())
    return False

socket.write("GET / HTTP/1.0\r\n\r\n")
while socket.waitForReadyRead():
    print(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握手之前调用defaultConfiguration() .setCaCertificates()(例如,通过将QSslSocket::systemCaCertificates()传递给它),或者在SSL握手之前在您的QSslSocket实例上调用defaultConfiguration() ::setCaCertificates()。

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

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

注意

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

class SslMode

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

常量

描述

QSslSocket.UnencryptedMode

套接字未加密。其行为与QTcpSocket相同。

QSslSocket.SslClientMode

该套接字是一个客户端SSL套接字。它要么已经加密,要么处于SSL握手阶段(参见isEncrypted())。

QSslSocket.SslServerMode

该套接字是一个服务器端的SSL套接字。它要么已经加密,要么处于SSL握手阶段(参见isEncrypted())。

class PeerVerifyMode

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

常量

描述

QSslSocket.VerifyNone

QSslSocket 将不会向对等方请求证书。如果您不关心连接的另一方的身份,可以设置此模式。连接仍然会被加密,并且如果被请求,您的套接字仍然会将其本地证书发送给对等方。

QSslSocket.QueryPeer

QSslSocket 会向对等方请求证书,但不要求此证书有效。当您希望向用户显示对等证书详细信息而不影响实际的SSL握手时,这非常有用。此模式是服务器的默认模式。注意:在Schannel中,此值与VerifyNone的行为相同。

QSslSocket.VerifyPeer

QSslSocket 将在 SSL 握手阶段请求对等方的证书,并要求该证书有效。如果失败,QSslSocket 将发出 sslErrors() 信号。此模式是客户端的默认模式。

QSslSocket.AutoVerifyPeer

QSslSocket 将自动为服务器套接字使用 QueryPeer,为客户端套接字使用 VerifyPeer。

另请参阅

peerVerifyMode()

__init__([parent=None])
Parameters:

父对象QObject

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

static activeBackend()
Return type:

字符串

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

注意

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

alertReceived(level, type, description)
Parameters:

QSslSocket 如果从对等方接收到警报消息,则会发出此信号。level 告诉警报是致命的还是警告。type 是解释为什么发送警报的代码。当警报消息的文本描述可用时,它会在 description 中提供。

注意

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

注意

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

alertSent(level, type, description)
Parameters:

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

注意

此信号主要是信息性的,可用于调试目的,通常不需要应用程序采取任何操作。

注意

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

static availableBackends()
Return type:

.QString 列表

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

另请参阅

activeBackend()

connectToHostEncrypted(hostName, port[, mode=QIODeviceBase.OpenModeFlag.ReadWrite[, protocol=QAbstractSocket.NetworkLayerProtocol.AnyIPProtocol]])
Parameters:

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

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

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

在启动SSL客户端握手后,如果无法建立对等方的身份,则会发出sslErrors()信号。如果你想忽略错误并继续连接,你必须调用ignoreSslErrors(),无论是在连接到sslErrors()信号的槽函数内部,还是在进入加密模式之前。如果没有调用ignoreSslErrors(),连接将被断开,发出disconnected()信号,并且QSslSocket返回到未连接状态。

如果SSL握手成功,QSslSocket 会发出 encrypted()

socket = QSslSocket()
socket.encrypted.connect(receiver.socketEncrypted)
socket.connectToHostEncrypted("imap", 993)
socket.write("1 CAPABILITY\r\n")

注意

上面的例子显示,在请求加密连接后,可以在encrypted()信号发出之前立即将文本写入套接字。在这种情况下,文本会在对象中排队,并在连接建立且encrypted()信号发出后写入套接字。

mode 的默认值是 ReadWrite。

如果你想在连接的服务器端创建一个QSslSocket,你应该在通过QTcpServer接收到传入连接时调用startServerEncryption()

另请参阅

connectToHost() startClientEncryption() waitForConnected() waitForEncrypted()

connectToHostEncrypted(hostName, port, sslPeerName[, mode=QIODeviceBase.OpenModeFlag.ReadWrite[, protocol=QAbstractSocket.NetworkLayerProtocol.AnyIPProtocol]])
Parameters:

这是一个重载函数。

除了connectToHostEncrypted的原始行为外,这个重载方法允许使用不同的主机名(sslPeerName)进行证书验证,而不是用于TCP连接的主机名(hostName)。

continueInterruptedHandshake()

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

encrypted()

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

encryptedBytesAvailable()
Return type:

整数

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

encryptedBytesToWrite()
Return type:

整数

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

encryptedBytesWritten(totalBytes)
Parameters:

totalBytes – int

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

另请参阅

bytesWritten()

handshakeInterruptedOnError(error)
Parameters:

错误QSslError

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

ignoreSslErrors()

这个插槽告诉 QSslSocketQSslSocket 的握手阶段忽略错误并继续连接。如果您希望在握手阶段发生错误时仍然继续连接,那么您必须调用这个插槽,无论是从连接到 sslErrors() 的插槽中调用,还是在握手阶段之前调用。如果您不调用这个插槽,无论是响应错误还是在握手之前,连接将在 sslErrors() 信号发出后断开。

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

警告

请务必始终让用户检查由sslErrors()信号报告的错误,并且只有在用户确认继续操作后才调用此方法。如果出现意外错误,应中止连接。在不检查实际错误的情况下调用此方法很可能会对您的应用程序构成安全风险。请谨慎使用!

另请参阅

sslErrors()

ignoreSslErrors(errors)
Parameters:

错误 – .QSslError 列表

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

这是一个重载函数。

此方法告诉QSslSocket仅忽略errors中给出的错误。

注意

因为大多数SSL错误都与证书相关,所以对于大多数错误,您必须设置此SSL错误相关的预期证书。例如,如果您想连接到使用自签名证书的服务器,请考虑以下代码片段:

cert = QSslCertificate.fromPath("server-certificate.pem")
error = QSslError(QSslError.SelfSignedCertificate, cert.at(0))
expectedSslErrors = QList()
expectedSslErrors.append(error)
socket = QSslSocket()
socket.ignoreSslErrors(expectedSslErrors)
socket.connectToHostEncrypted("server.tld", 443)

多次调用此函数将替换之前调用中传递的错误列表。您可以通过传递一个空列表来调用此函数,以清除您想要忽略的错误列表。

static implementedClasses([backendName={}])
Parameters:

backendName – str

Return type:

QSsl.ImplementedClass的列表

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

static isClassImplemented(cl[, backendName={}])
Parameters:
Return type:

布尔

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

另请参阅

implementedClasses()

isEncrypted()
Return type:

布尔

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

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

QSslSocket 在进入加密模式时会发出 encrypted()

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

另请参阅

mode()

static isFeatureSupported(feat[, backendName={}])
Parameters:
Return type:

布尔

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

static isProtocolSupported(protocol[, backendName={}])
Parameters:
Return type:

布尔

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

另请参阅

supportedProtocols()

localCertificate()
Return type:

QSslCertificate

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

localCertificateChain()
Return type:

QSslCertificate的列表

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

mode()
Return type:

SslMode

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

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

另请参阅

SslMode

modeChanged(newMode)
Parameters:

newModeSslMode

QSslSocketUnencryptedMode切换到SslClientModeSslServerMode时,会发出此信号。mode是新的模式。

另请参阅

mode()

newSessionTicketReceived()

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

注意

此功能仅在OpenSSL后端启用,并且需要OpenSSL v 1.1.1或更高版本。

ocspResponses()
Return type:

QOcspResponse的列表

此函数返回服务器在使用OCSP装订的TLS握手期间可能发送的在线证书状态协议响应。如果未收到明确响应或根本没有收到响应,则列表为空。

peerCertificate()
Return type:

QSslCertificate

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

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

因为对等证书是在握手阶段设置的,所以从连接到sslErrors()信号或encrypted()信号的插槽访问对等证书是安全的。

如果返回了空证书,这可能意味着SSL握手失败,或者意味着你连接的主机没有证书,或者意味着没有连接。

如果你想检查对等方的完整证书链,使用peerCertificateChain()一次性获取所有证书。

另请参阅

peerCertificateChain()

peerCertificateChain()
Return type:

QSslCertificate的列表

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

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

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

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

如果你只想获取对等方的直接证书,请使用 peerCertificate()

另请参阅

peerCertificate()

peerVerifyDepth()
Return type:

整数

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

证书按照颁发顺序进行检查,从对等方自己的证书开始,然后是颁发者的证书,依此类推。

peerVerifyError(error)
Parameters:

错误QSslError

QSslSocket 可以在SSL握手期间多次发出此信号,在加密建立之前,表示在建立对等方身份时发生了错误。error 通常表示 QSslSocket 无法安全地识别对等方。

此信号在出现问题时为您提供早期指示。通过连接到此信号,您可以在握手完成之前手动选择从连接的槽中拆除连接。如果不采取任何操作,QSslSocket 将继续发出 sslErrors()

另请参阅

sslErrors()

peerVerifyMode()
Return type:

PeerVerifyMode

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

默认模式是AutoVerifyPeer,它告诉QSslSocket对客户端使用VerifyPeer,对服务器使用QueryPeer

peerVerifyName()
Return type:

字符串

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

preSharedKeyAuthenticationRequired(authenticator)
Parameters:

认证器QSslPreSharedKeyAuthenticator

QSslSocket 在协商PSK加密套件时发出此信号,因此需要PSK认证。

使用PSK时,客户端必须向服务器发送有效的身份和有效的预共享密钥,以便SSL握手继续进行。应用程序可以通过根据其需求填充传递的authenticator对象,在连接到该信号的槽中提供此信息。

注意

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

注意

authenticator 对象由套接字拥有,应用程序不得删除它。

privateKey()
Return type:

QSslKey

返回此套接字的私钥。

protocol()
Return type:

SslProtocol

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

另请参阅

setProtocol()

sessionCipher()
Return type:

QSslCipher

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

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

sessionProtocol()
Return type:

SslProtocol

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

另请参阅

protocol() setProtocol()

static setActiveBackend(backendName)
Parameters:

backendName – str

Return type:

布尔

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

注意

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

setLocalCertificate(certificate)
Parameters:

证书QSslCertificate

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

本地证书和私钥对于服务器套接字始终是必要的,但如果服务器要求客户端进行身份验证,客户端套接字也很少使用它们。

注意

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

setLocalCertificate(fileName[, format=QSsl.Pem])
Parameters:

这是一个重载函数。

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

setLocalCertificateChain(localChain)
Parameters:

localChain – QSslCertificate 的列表

设置要在SSL握手期间呈现给对等方的证书链为localChain

setPeerVerifyDepth(depth)
Parameters:

深度 – int

设置SSL握手阶段要检查的对等方证书链中的最大证书数量为depth。设置深度为0意味着没有设置最大深度,表示应检查整个证书链。

证书按照颁发顺序进行检查,从对等方自己的证书开始,然后是颁发者的证书,依此类推。

setPeerVerifyMode(mode)
Parameters:

modePeerVerifyMode

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

默认模式是AutoVerifyPeer,它告诉QSslSocket对客户端使用VerifyPeer,对服务器使用QueryPeer

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

setPeerVerifyName(hostName)
Parameters:

hostName – str

为证书验证设置一个不同的主机名,由hostName给出,而不是用于TCP连接的主机名。

setPrivateKey(key)
Parameters:

keyQSslKey

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

如果您正在创建一个SSL服务器套接字,密钥和本地证书都是必需的。如果您正在创建一个SSL客户端套接字,并且您的客户端必须向SSL服务器标识自己,那么密钥和本地证书也是必需的。

setPrivateKey(fileName[, algorithm=QSsl.Rsa[, format=QSsl.Pem[, passPhrase=QByteArray()]]])
Parameters:

这是一个重载函数。

读取文件fileName中的字符串,并使用指定的algorithm和编码format进行解码,以构建一个SSL key。如果编码的密钥被加密,则使用passPhrase来解密它。

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

如果您正在创建一个SSL服务器套接字,密钥和本地证书都是必需的。如果您正在创建一个SSL客户端套接字,当您的客户端必须向SSL服务器标识自己时,密钥和本地证书也是必需的。

setProtocol(protocol)
Parameters:

协议SslProtocol

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

另请参阅

protocol()

setSslConfiguration(config)
Parameters:

配置QSslConfiguration

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

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

sslConfiguration()
Return type:

QSslConfiguration

返回套接字的SSL配置状态。套接字的默认SSL配置是使用默认的加密算法、默认的CA证书,没有本地私钥或证书。

SSL配置还包含可能随时间变化而无需通知的字段。

sslErrors(errors)
Parameters:

错误 – .QSslError 列表

QSslSocket 在SSL握手后发出此信号,表示在建立对等方身份时发生了一个或多个错误。这些错误通常表明 QSslSocket 无法安全地识别对等方。除非采取任何措施,否则在发出此信号后,连接将被断开。

如果你想在发生错误的情况下继续连接,你必须从连接到这个信号的槽中调用ignoreSslErrors()。如果你需要在稍后访问错误列表,你可以调用sslHandshakeErrors()

errors 包含一个或多个错误,这些错误阻止了 QSslSocket 验证对等方的身份。

注意

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

另请参阅

peerVerifyError()

sslHandshakeErrors()
Return type:

QSslError的列表

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

static sslLibraryBuildVersionNumber()
Return type:

整数

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

static sslLibraryBuildVersionString()
Return type:

字符串

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

static sslLibraryVersionNumber()
Return type:

整数

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

static sslLibraryVersionString()
Return type:

字符串

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

startClientEncryption()

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

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

startServerEncryption()

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

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

实现SSL服务器的最常见方法是创建一个QTcpServer的子类并重新实现incomingConnection()。然后返回的套接字描述符传递给setSocketDescriptor()

static supportedFeatures([backendName={}])
Parameters:

backendName – str

Return type:

QSsl.SupportedFeature的列表

此函数返回名为backendName的后端支持的功能。空的backendName被视为对当前活动后端的查询。

static supportedProtocols([backendName={}])
Parameters:

backendName – str

Return type:

QSsl.SslProtocol 的列表

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

static supportsSsl()
Return type:

布尔

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

waitForEncrypted([msecs=30000])
Parameters:

msecs – 整数

Return type:

布尔

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

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

以下示例最多等待一秒钟以使套接字加密:

socket.connectToHostEncrypted("imap", 993)
if socket.waitForEncrypted(1000):
    qDebug("Encrypted!")

如果 msecs 为 -1,此函数将不会超时。