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