如何在我的扭曲 SSL 客户端中验证 SSL 服务器证书?
我是 SSL 的初学者,我已经阅读了扭曲的 SSL 教程,但我仍然不清楚一些事情。
我的查询是:
twisted.internet.ssl
我应该如何使用模块验证 SSL 服务器证书,ssl.ClientContextFactory.getContext
方法在处理 SSL 时如何有用,如何告诉twisted SSL 客户端公钥文件的位置?
如何在我的扭曲 SSL 客户端中验证 SSL 服务器证书?
我是 SSL 的初学者,我已经阅读了扭曲的 SSL 教程,但我仍然不清楚一些事情。
我的查询是:
twisted.internet.ssl
我应该如何使用模块验证 SSL 服务器证书,
ssl.ClientContextFactory.getContext
方法在处理 SSL 时如何有用,
如何告诉twisted SSL 客户端公钥文件的位置?
自 Twisted 14.0 以来,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()
证书表示为 pyOpenSSL X509 实例。它有一个方法可以用来检索证书的主题名称:
subject_name = certificate.get_subject()
主题名称是一个专有名称,表示为 pyOpenSSL X509Name 实例。您可以检查其字段:
common_name = subject_name.commonName
这是一个字符串,例如"example.com"
。
如果您需要检查subjectAltName
而不是(您可能会这样做),那么您可以在证书的扩展中找到此信息:
extensions = certificate.get_extensions()
这是 pyOpenSSL X509Extension 实例的列表。你必须解析每一个来找到它subjectAltName
和它的值。