如何在我的 Twisted SSL 客户端中验证 SSL 服务器证书?
我对 SSL 完全是初学者,我已经浏览了 Twisted SSL 教程,但仍然有些不清楚。
我的问题是:
如何使用
twisted.internet.ssl
模块验证 SSL 服务器证书?ssl.ClientContextFactory.getContext
方法在处理 SSL 时有什么用处?如何告诉 Twisted SSL 客户端公钥文件的位置?
如何在我的 Twisted SSL 客户端中验证 SSL 服务器证书?
我对 SSL 完全是初学者,我已经浏览了 Twisted SSL 教程,但仍然有些不清楚。
我的问题是:
如何使用 twisted.internet.ssl
模块验证 SSL 服务器证书?
ssl.ClientContextFactory.getContext
方法在处理 SSL 时有什么用处?
如何告诉 Twisted SSL 客户端公钥文件的位置?
optionsForClientTLS
是最好的方法来实现这一点:from twisted.internet.ssl import optionsForClientTLS
from twisted.internet.endpoints import SSL4ClientEndpoint
ctx = optionsForClientTLS(hostname=u"example.com")
endpoint = SSL4ClientEndpoint(reactor, host, port, ctx)
factory = ...
d = endpoint.connect(factory)
...
optionsForClientTLS
还有其他(可选)参数,这些参数也可能有用。
在 Twisted 14.0 之前,该过程稍微复杂一些:
当连接建立并且 SSL 握手成功完成后(这意味着证书当前是有效的,其有效期在 notBefore
和 notAfter
值之间,并且它由您指定为受信任的证书颁发机构证书签署),您可以从传输中获取证书:
certificate = self.transport.getPeerCertificate()
subject_name = certificate.get_subject()
common_name = subject_name.commonName
这是一个字符串,例如"example.com"
。
如果您需要检查subjectAltName
(很可能是这样),那么您可以在证书的扩展中找到此信息:
extensions = certificate.get_extensions()
这是一个pyOpenSSL X509Extension实例列表。您需要解析每个实例以查找subjectAltName
及其值。