- class QSslSocket#
QSslSocket
类为客户端和服务器提供了SSL加密套接字。 更多…概述#
方法#
def
__init__()
def
isEncrypted()
def
mode()
def
ocspResponses()
def
peerVerifyMode()
def
peerVerifyName()
def
privateKey()
def
protocol()
def
sessionCipher()
槽函数#
信号#
静态函数#
def
activeBackend()
def
supportsSsl()
注意
本文档可能包含从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()
信号。在此情况下,如果未采取措施忽略错误,则连接将被断开。要继续使用,即使发生错误,也可以调用QSslSocket
的ignoreSslErrors()
方法,无论是在错误发生后此槽内部调用,还是在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。以下功能也可以进行自定义
在握手阶段之前,可以使用
setCiphers()
方法自定义套接字的加密密码组。在握手阶段之前,可以使用
setLocalCertificate()
和setPrivateKey()
方法自定义套接字的本地证书和私钥。可以使用
addCaCertificate()
和addCaCertificates()
方法扩展和自定义CA证书数据库。
为了在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()。有关密码和证书的更多信息,请参阅
QSslCipher
和QSslCertificate
。本产品包括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 为客户端套接字。
构造一个
QSslSocket
对象。将parent
传递给 QObject 构造函数。新套接字的安全套接字配置设置为静态方法 defaultCiphers() 返回的套件组。- static activeBackend()#
- 返回类型:
str
返回
QSslSocket
和相关类使用的后端名称。如果没有显式设置活动后端,该函数将返回QSslSocket
从可用后端列表中隐式选定的默认后端名称。- alertReceived(level, type, description)#
- 参数:
level –
AlertLevel
type –
AlertType
description – str
当从对等方收到警告消息时,
QSslSocket
会发出此信号。level
指示警告消息是否为致命或警告。type
是解释为什么发出警告的代码。当有可用文本描述警告消息时,它将提供在description
中。注意
这个信号主要用于信息性和调试目的,不需要应用程序处理。如果警告是致命的,基础后端将处理它并关闭连接。
- alertSent(level, type, description)#
- 参数:
level –
AlertLevel
type –
AlertType
description – str
QSslSocket
在向对等方发送警告消息时会发出此信号。level
描述了是警告还是致命错误。type
给出了警告消息的代码。当有可用文本描述警告消息时,它将提供在description
中。注意
这个信号主要用于信息性和调试目的,通常不需要应用程序采取任何行动。
- static availableBackends()#
- 返回类型:
.QString 列表
返回当前可用的后端名称。这些名称是 lowercase,例如:“openssl”,“securetransport”,“schannel”(类似于 Qt 中已存在功能名称的 TLS 后端)。
- connectToHostEncrypted(hostName, port[, mode=QIODeviceBase.OpenModeFlag.ReadWrite[, protocol=QAbstractSocket.NetworkLayerProtocol.AnyIPProtocol]])#
- 参数:
hostName – str
port – int
mode –
OpenModeFlag
的组合protocol –
NetworkLayerProtocol
警告
本节包含自动从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]])
- 参数:
hostName – str
port – int
sslPeerName – 字符串
mode –
OpenModeFlag
的组合protocol –
NetworkLayerProtocol
这是一个重载函数。
除了原始的
connectToHostEncrypted
行为之外,这个重载方法允许使用不同的主机名(sslPeerName
)进行证书验证,而不是用于TCP连接的(hostName
)。- continueInterruptedHandshake()#
如果一个应用想在接收到
handshakeInterruptedOnError()
信号后结束握手,必须调用此函数。此调用必须从与信号直接关联的槽函数中进行。信号-槽连接必须是直接的。- encrypted()#
当
QSslSocket
进入加密模式时,将发出此信号。在此信号发出后,isEncrypted()
将返回 true,并且在此后通过套接字的所有传输都将被加密。- encryptedBytesAvailable()#
- 返回类型:
int
返回等待解密的加密字节数。通常情况下,此函数将返回0,因为
QSslSocket
会尽快对其传入数据进行解密。- encryptedBytesToWrite()#
- 返回类型:
int
返回等待写入网络的加密字节数。
- encryptedBytesWritten(totalBytes)#
- 参数:
totalBytes – int
当
QSslSocket
将其加密数据写入网络时,将发出此信号。参数written
包含成功写入的字节数。QSslSocket
发出此信号,如果发现证书验证错误,并且QSslConfiguration
启用了早期错误报告。应用程序应检查参数error
,并决定是否继续握手,或终止它并发送警报消息到对等方。信号-槽连接必须是直接的。- ignoreSslErrors()#
此槽通知
QSslSocket
在握手阶段忽略错误并继续连接。如果您想在握手阶段即使出现错误也要继续连接,则必须调用此槽,无论是从连接到sslErrors()
的槽中,还是在其他握手阶段之前。如果不调用此槽,无论是响应错误还是在其他握手阶段之前,当sslErrors()
信号已发出后,连接都将断开。如果在SSL握手阶段没有错误(即,对等方的身份没有问题),
QSslSocket
不会发出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={}])#
- 参数:
cl –
ImplementedClass
backendName – str
- 返回类型:
bool
如果名为
backendName
的后端实现了类cl
,则返回 true。空的backendName
被理解为对当前活动后端的查询。- isEncrypted()#
- 返回类型:
bool
如果套接字被加密,则返回
true
;否则返回false
。加密套接字会在数据通过网络写入之前将其加密(通过调用 write() 或 putChar()),并在数据接收后调用 read()、readLine() 或 getChar() 之前将其解密。
QSslSocket
当它进入加密模式时,将发出encrypted()
方法。您可以通过调用
sessionCipher()
方法来找出您数据使用的加密密钥。参见
- static isFeatureSupported(feat[, backendName={}])#
- 参数:
feat –
SupportedFeature
backendName – str
- 返回类型:
bool
如果名为
backendName
的后端支持功能ft
,则返回 true。空的backendName
被理解为对当前活动后端的查询。参见
SupportedFeature
supportedFeatures()
- 静态 isProtocolSupported(protocol[, backendName={}])#
- 参数:
protocol –
SslProtocol
backendName – str
- 返回类型:
bool
如果
protocol
被名为backendName
的后端支持,则返回 true。一个空的backendName
被理解为是关于当前活跃后端的查询。- localCertificate()#
- 返回类型:
返回套接字的本地
证书
,如果没有分配本地证书,则返回空证书。- localCertificateChain()#
- 返回类型:
返回套接字的本地
证书
链,如果没有分配本地证书,则返回空列表。返回套接字的当前模式;要么是
UnencryptedMode
,其中QSslSocket
的行为与QTcpSocket
相同,要么是SslClientMode
或SslServerMode
之一,其中客户端正在协商或处于加密模式。当模式改变时,
QSslSocket
会发出modeChanged()
参见
当
QSslSocket
从非加密模式UnencryptedMode
变更为SslClientMode
或SslServerMode
时,会发出此信号。mode
是新模式。参见
- newSessionTicketReceived()#
如果在握手过程中协商了 TLS 1.3 协议,则在接收
QSslSocket
新会话票证消息后,会发出此信号。会话以及会话票证的存活时间提示在套接字配置中更新。会话可以用于今后 TLS 连接中的会话恢复(以及简化的握手)。注意
仅通过 OpenSSL 后端启用此功能,需要 OpenSSL 版本 1.1.1 或更高。
- ocspResponses()#
- 返回类型:
.QOcspResponse 列表
此函数返回服务器在 TLS 握手过程中使用 OCSP stapling 发送的在线证书状态协议响应。如果没有收到确定响应或没有收到任何响应,则列表为空。
- peerCertificate()#
- 返回类型:
返回对等方的数字证书(即您所连接的主机的直接证书),如果没有分配证书,则返回空证书。
对等方证书在握手阶段自动检查,因此此函数通常用于获取证书以供显示或用于连接诊断目的。它包含有关对等方信息,包括其主机名、证书发布者和对等方的公钥。
因为对等方证书在握手阶段设置,所以可以从连接到
sslErrors()
信号或encrypted()
信号的槽中访问对等方证书。如果返回空证书,这可能意味着 SSL 握手失败,或者您所连接的主机没有证书,或者没有连接。
如果您想检查对等方的完整证书链,请使用
peerCertificateChain()
一次性获取所有证书。- peerCertificateChain()#
- 返回类型:
返回对方的数字证书链,或一个空的证书列表。
对等证书在握手阶段自动检查。此函数通常用于获取显示的证书,或执行连接诊断。证书包含有关对等信息和证书颁发者的信息,包括主机名、颁发者名称和颁发者公钥。
在对等证书握手阶段设置了
QSslSocket
中的对等证书,因此可以在连接到sslErrors()
或encrypted()
信号的任务中调用此函数。如果返回空列表,则可能意味着SSL握手失败,或者你连接到的宿主没有证书,或者没有连接。
如果你想只获取对方的直接证书,请使用
peerCertificate()
。- peerVerifyDepth()#
- 返回类型:
int
返回在SSL握手阶段检查的对等证书链中最大证书数,如果没有设置最大深度,则返回0(默认值),表示应检查整个证书链。
按发行顺序检查证书,从对等的证书开始,然后是其发行者的证书,依此类推。
QSslSocket
在建立加密之前,在SSL握手期间可以多次发出此信号,以指示在验证对方身份时发生错误。该错误
通常表明QSslSocket
无法安全地识别对方。该信号提供早期的错误指示。通过连接到这个信号,在握手完成之前,您可以手动选择从连接的槽内部断开连接。如果没有采取任何行动,
QSslSocket
将继续发出sslErrors()
。参见
- peerVerifyMode()#
- 返回类型:
返回套接字的验证模式。该模式决定了是否
QSslSocket
应从对等方(即客户端从服务器请求证书或服务器从客户端请求证书)请求证书,以及是否应要求该证书有效。默认模式是
AutoVerifyPeer
,这告诉QSslSocket
为客户端使用VerifyPeer
,为服务器使用QueryPeer
。- peerVerifyName()#
- 返回类型:
str
返回用于证书验证的不同主机名,由
setPeerVerifyName
或connectToHostEncrypted
设置。- 参数:
authenticator –
QSslPreSharedKeyAuthenticator
QSslSocket
在协商PSK密码套件时发出此信号,因此需要PSK身份验证。在使用PSK时,客户端必须向服务器发送有效的身份验证信息和有效的预共享密钥,以便SSL握手能够继续进行。应用程序可以通过连接到此信号的槽,根据需要填写传递的
authenticator
对象来提供这些信息。注意
忽略此信号或未能提供所需的凭证将导致握手失败,从而终止连接。
返回此套接字的私钥。
- protocol()#
- 返回类型:
返回套接字的SSL协议。默认情况下使用
SecureProtocols
。- sessionCipher()#
- 返回类型:
返回套接字的加密
cipher
,如果没有加密连接则为空密文。套接字会话的密文在握手阶段设置。密文用于加密和解密通过套接字传输的数据。QSslSocket
还提供了设置顺序列表的函数,从该列表中最终会选择会话密文。这个顺序列表必须在握手阶段开始之前就位。- sessionProtocol()#
- 返回类型:
返回套接字的SSL/TLS协议,如果连接未加密则返回
UnknownProtocol
。套接字会话的协议在握手阶段设置。- static setActiveBackend(backendName)#
- 参数:
backendName – str
- 返回类型:
bool
如果已设置名为
backendName
的后端为活动后端,则返回true。backendName
必须是availableBackends()
返回的名称之一。注意
应用程序不能同时混合使用不同后端。这意味着在选择使用
QSslSocket
或相关类(例如QSslCertificate
或QSslKey
)之前,必须先选择非默认后端。- setLocalCertificate(certificate)#
- 参数:
certificate –
QSslCertificate
将套接字的本地证书设置为了
certificate
。本地证书对于需要向对方确认身份时是必要的。它与私钥一起使用;如果设置了本地证书,也必须设置私钥。本地证书和私钥对于服务器套接字总是必要的,但是在服务器要求客户端进行身份验证时,客户端套接字也很少使用它们。
注意
macOS上的Secure Transport SSL后端可能会通过导入本地证书和密钥来更新默认密钥链(默认密钥链可能是您的登录密钥链)。这还可能导致在您的应用程序使用这些私钥时出现系统对话框并请求许可。如果不需要这种行为,请设置QT_SSL_USE_TEMPORARY_KEYCHAIN环境变量为非零值;这会提示
QSslSocket
使用自己的临时密钥链。- setLocalCertificate(fileName[, format=QSsl.Pem])
- 参数:
fileName – str
format –
EncodingFormat
这是一个重载函数。
将套接字的本地
证书
设置为在文件path
中找到的第一个证书,该文件将根据指定的格式
进行解析。- setLocalCertificateChain(localChain)#
- 参数:
localChain – QSslCertificate列表
将SSL握手阶段要呈现给对等方的证书链设置为
localChain
。- setPeerVerifyDepth(depth)#
- 参数:
depth – int
将SSL握手阶段要检查的对等方证书链中的证书的最大数量设置为
depth
。设置深度为0表示不设置最大深度,表示应该检查整个证书链。按发行顺序检查证书,从对等的证书开始,然后是其发行者的证书,依此类推。
- setPeerVerifyMode(mode)#
- 参数:
mode –
PeerVerifyMode
设置套接字的验证模式为
mode
。此模式决定QSslSocket
是否应要求对等方(即客户端从服务器请求证书,或服务器从客户端请求证书),以及是否要求此证书有效。默认模式是
AutoVerifyPeer
,这告诉QSslSocket
为客户端使用VerifyPeer
,为服务器使用QueryPeer
。在加密开始后设置此模式对当前连接无影响。
- setPeerVerifyName(hostName)#
- 参数:
hostName – str
设置一个不同的主机名,由
hostName
提供,来代替TCP连接中使用的证书验证。将套接字的私有
key
设置为key
。私有密钥和本地证书
由客户端和服务器使用,这些客户端和服务器必须向 SSL 对等方证明其身份。如果您正在创建 SSL 服务器套接字,则需要键和本地证书。如果您正在创建 SSL 客户端套接字,那么如果您的客户端必须向 SSL 服务器进行自我证明,则需要键和本地证书。
- setPrivateKey(fileName[, algorithm=QSsl.Rsa[, format=QSsl.Pem[, passPhrase=QByteArray()]]])
- 参数:
fileName – str
algorithm –
KeyAlgorithm
format –
EncodingFormat
passPhrase –
QByteArray
这是一个重载函数。
从文件
fileName
中读取字符串,并使用指定的algorithm
和编码format
进行解码,以构造SSL key
。如果编码的密钥已加密,则使用passPhrase
来解密它。将套接字的私有密钥设置为构造的密钥。客户端和服务器使用私有密钥和本地
证书
来证明其身份给 SSL 对等方。如果您正在创建 SSL 服务器套接字,则需要键和本地证书。如果您正在创建 SSL 客户端套接字,那么如果您的客户端必须向 SSL 服务器进行自我证明,则需要键和本地证书。
- setProtocol(protocol)#
- 参数:
protocol –
SslProtocol
将套接字的 SSL 协议设置为
protocol
。这将影响下一次发起的手柄;在已加密的套接字上调用此函数不会影响套接字的协议。参见
- setSslConfiguration(config)#
- 参数:
config –
QSslConfiguration
设置套接字的SSL配置为
configuration
的内容。此函数设置本地证书、加密方式、私钥和CA证书为存储在configuration
中的内容。无法设置与SSL状态相关的字段。
- sslConfiguration()#
- 返回类型:
返回套接字的SSL配置状态。套接字的默认SSL配置是使用默认加密方式、默认CA证书、无本地私钥或证书。
SSL配置还包含一些随着时间的推移可能会更改的字段。
- sslErrors(errors)#
- 参数:
errors – QSslError 列表
QSslSocket
在完成SSL握手后发出此信号,表示在建立对等体身份的过程中发生了一个或多个错误。这些错误通常表明QSslSocket
无法安全地识别对等体。除非采取任何行动,否则在此信号发出后,连接将被断开。如果您想忽略已发生的错误继续连接,必须在此信号的槽内调用
ignoreSslErrors()
。如果您需要在稍后访问错误列表,可以调用sslHandshakeErrors()
.errors
包含一个或多个错误,阻止QSslSocket
验证对等体的身份。- 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,则此函数不会超时。