class QSslSocket#

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

Inheritance diagram of 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服务器为了保护一个传入的连接。假设你创建了一个作为QTcpServer子类的SSL服务器类。你将使用类似下例的代码重写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() 信号。在此情况下,如果未采取措施忽略错误,则连接将被断开。要继续使用,即使发生错误,也可以调用 QSslSocketignoreSslErrors() 方法,无论是在错误发生后此槽内部调用,还是在 QSslSocket 构造后、尝试连接之前。这将允许 QSslSocket 忽略在建立对等方身份时遇到的错误。在 SSL 握手过程中忽略错误应谨慎使用,因为安全连接的基本特征是应通过成功的握手来建立。

加密后,您可以使用 QSslSocket 作为常规的 QTcpSocket 使用。当 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握手过程中扩展默认CA证书列表,必须更新默认配置,如下所示:

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

注意

如果可用,Unix上的根证书(除macOS外)会按照请求从标准证书目录中加载。如果您不想按需加载根证书,需要在第一次SSL握手(例如,通过将其传递给QSslSocket::systemCaCertificates())之前调用 defaultConfiguration() .setCaCertificates() 或在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

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

QSslSocket.AutoVerifyPeer

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

__init__([parent=None])#
参数:

parentQObject

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

static activeBackend()#
返回类型:

str

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

注意

在隐式选择默认后端时,如果可用,QSslSocket 会优先使用 OpenSSL 后端。

alertReceived(level, type, description)#
参数:

当从对等方收到警告消息时,QSslSocket 会发出此信号。level 指示警告消息是否为致命或警告。type 是解释为什么发出警告的代码。当有可用文本描述警告消息时,它将提供在 description 中。

注意

这个信号主要用于信息性和调试目的,不需要应用程序处理。如果警告是致命的,基础后端将处理它并关闭连接。

注意

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

参见

alertSent() AlertLevel AlertType

alertSent(level, type, description)#
参数:

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

注意

这个信号主要用于信息性和调试目的,通常不需要应用程序采取任何行动。

注意

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

参见

alertReceived() AlertLevel AlertType

static availableBackends()#
返回类型:

.QString 列表

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

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

警告

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

开始到设备hostName的加密连接,使用port作为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()

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]])
参数:

这是一个重载函数。

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

continueInterruptedHandshake()#

如果一个应用想在接收到 handshakeInterruptedOnError() 信号后结束握手,必须调用此函数。此调用必须从与信号直接关联的槽函数中进行。信号-槽连接必须是直接的。

encrypted()#

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

encryptedBytesAvailable()#
返回类型:

int

返回等待解密的加密字节数。通常情况下,此函数将返回0,因为QSslSocket会尽快对其传入数据进行解密。

encryptedBytesToWrite()#
返回类型:

int

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

encryptedBytesWritten(totalBytes)#
参数:

totalBytes – int

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

handshakeInterruptedOnError(error)#
参数:

errorQSslError

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

ignoreSslErrors()#

此槽通知 QSslSocket 在握手阶段忽略错误并继续连接。如果您想在握手阶段即使出现错误也要继续连接,则必须调用此槽,无论是从连接到 sslErrors() 的槽中,还是在其他握手阶段之前。如果不调用此槽,无论是响应错误还是在其他握手阶段之前,当 sslErrors() 信号已发出后,连接都将断开。

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

警告

请务必让用户检查由 sslErrors() 信号报告的错误,并且在用户确认可以继续时才调用此方法。如果有意外错误,应中断连接。不检查实际错误而调用此方法可能会给您的应用程序带来安全风险。请谨慎使用!

参见

sslErrors()

ignoreSslErrors(errors)
参数:

errors – 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={}])#
参数:

backendName – str

返回类型:

.QSsl.ImplementedClass 列表

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

参见

ImplementedClass activeBackend() isClassImplemented()

static isClassImplemented(cl[, backendName={}])#
参数:
返回类型:

bool

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

isEncrypted()#
返回类型:

bool

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

加密套接字会在数据通过网络写入之前将其加密(通过调用 write() 或 putChar()),并在数据接收后调用 read()、readLine() 或 getChar() 之前将其解密。

QSslSocket 当它进入加密模式时,将发出 encrypted() 方法。

您可以通过调用 sessionCipher() 方法来找出您数据使用的加密密钥。

参见

mode()

static isFeatureSupported(feat[, backendName={}])#
参数:
返回类型:

bool

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

参见

SupportedFeature supportedFeatures()

静态 isProtocolSupported(protocol[, backendName={}])#
参数:
返回类型:

bool

如果 protocol 被名为 backendName 的后端支持,则返回 true。一个空的 backendName 被理解为是关于当前活跃后端的查询。

localCertificate()#
返回类型:

QSslCertificate

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

localCertificateChain()#
返回类型:

QSslCertificate 列表

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

mode()#
返回类型:

SslMode

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

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

参见

SslMode

modeChanged(newMode)#
参数:

newModeSslMode

QSslSocket 从非加密模式 UnencryptedMode 变更为 SslClientModeSslServerMode 时,会发出此信号。mode 是新模式。

参见

mode()

newSessionTicketReceived()#

如果在握手过程中协商了 TLS 1.3 协议,则在接收 QSslSocket 新会话票证消息后,会发出此信号。会话以及会话票证的存活时间提示在套接字配置中更新。会话可以用于今后 TLS 连接中的会话恢复(以及简化的握手)。

注意

仅通过 OpenSSL 后端启用此功能,需要 OpenSSL 版本 1.1.1 或更高。

ocspResponses()#
返回类型:

.QOcspResponse 列表

此函数返回服务器在 TLS 握手过程中使用 OCSP stapling 发送的在线证书状态协议响应。如果没有收到确定响应或没有收到任何响应,则列表为空。

peerCertificate()#
返回类型:

QSslCertificate

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

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

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

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

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

peerCertificateChain()#
返回类型:

QSslCertificate 列表

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

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

在对等证书握手阶段设置了QSslSocket 中的对等证书,因此可以在连接到sslErrors()encrypted()信号的任务中调用此函数。

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

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

peerVerifyDepth()#
返回类型:

int

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

按发行顺序检查证书,从对等的证书开始,然后是其发行者的证书,依此类推。

peerVerifyError(error)#
参数:

errorQSslError

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

该信号提供早期的错误指示。通过连接到这个信号,在握手完成之前,您可以手动选择从连接的槽内部断开连接。如果没有采取任何行动,QSslSocket 将继续发出 sslErrors()

参见

sslErrors()

peerVerifyMode()#
返回类型:

PeerVerifyMode

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

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

peerVerifyName()#
返回类型:

str

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

preSharedKeyAuthenticationRequired(authenticator)#
参数:

authenticatorQSslPreSharedKeyAuthenticator

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

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

注意

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

注意

authenticator 对象属于套接字,应用程序不得删除。

privateKey()#
返回类型:

QSslKey

返回此套接字的私钥。

protocol()#
返回类型:

SslProtocol

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

参见

setProtocol()

sessionCipher()#
返回类型:

QSslCipher

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

QSslSocket 还提供了设置顺序列表的函数,从该列表中最终会选择会话密文。这个顺序列表必须在握手阶段开始之前就位。

sessionProtocol()#
返回类型:

SslProtocol

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

static setActiveBackend(backendName)#
参数:

backendName – str

返回类型:

bool

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

注意

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

setLocalCertificate(certificate)#
参数:

certificateQSslCertificate

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

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

注意

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

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

这是一个重载函数。

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

setLocalCertificateChain(localChain)#
参数:

localChain – QSslCertificate列表

将SSL握手阶段要呈现给对等方的证书链设置为localChain

setPeerVerifyDepth(depth)#
参数:

depth – int

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

按发行顺序检查证书,从对等的证书开始,然后是其发行者的证书,依此类推。

setPeerVerifyMode(mode)#
参数:

modePeerVerifyMode

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

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

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

setPeerVerifyName(hostName)#
参数:

hostName – str

设置一个不同的主机名,由hostName提供,来代替TCP连接中使用的证书验证。

setPrivateKey(key)#
参数:

keyQSslKey

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

如果您正在创建 SSL 服务器套接字,则需要键和本地证书。如果您正在创建 SSL 客户端套接字,那么如果您的客户端必须向 SSL 服务器进行自我证明,则需要键和本地证书。

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

这是一个重载函数。

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

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

如果您正在创建 SSL 服务器套接字,则需要键和本地证书。如果您正在创建 SSL 客户端套接字,那么如果您的客户端必须向 SSL 服务器进行自我证明,则需要键和本地证书。

setProtocol(protocol)#
参数:

protocolSslProtocol

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

参见

protocol()

setSslConfiguration(config)#
参数:

configQSslConfiguration

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

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

sslConfiguration()#
返回类型:

QSslConfiguration

返回套接字的SSL配置状态。套接字的默认SSL配置是使用默认加密方式、默认CA证书、无本地私钥或证书。

SSL配置还包含一些随着时间的推移可能会更改的字段。

sslErrors(errors)#
参数:

errors – QSslError 列表

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

如果您想忽略已发生的错误继续连接,必须在此信号的槽内调用 ignoreSslErrors()。如果您需要在稍后访问错误列表,可以调用 sslHandshakeErrors() .

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

注意

在连接到此信号时不能使用 Qt::QueuedConnection,否则调用 ignoreSslErrors() 将没有作用。

sslHandshakeErrors()#
返回类型:

.QSslError 列表

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

static sslLibraryBuildVersionNumber()#
返回类型:

int

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

static sslLibraryBuildVersionString()#
返回类型:

str

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

static sslLibraryVersionNumber()#
返回类型:

int

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

static sslLibraryVersionString()#
返回类型:

str

返回正在使用的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={}])#
参数:

backendName – str

返回类型:

.QSsl.SupportedFeature 列表

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

参见

SupportedFeature activeBackend()

static supportedProtocols([backendName={}])#
参数:

backendName – str

返回类型:

.QSsl.SslProtocol 列表

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

static supportsSsl()#
返回类型:

bool

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

waitForEncrypted([msecs=30000])#
参数:

msecs – int

返回类型:

bool

警告

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

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

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

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

如果 msecs 是 -1,则此函数不会超时。