如何验证扭曲的SSL客户端中的SSL服务器证书?
我非常熟悉SSL,我已经完成了twisted SSL tutorials,但我仍然不清楚某些事情。
我的疑问是:
如何使用twisted.internet.ssl
模块验证SSL服务器证书,
ssl.ClientContextFactory.getContext
方法在处理SSL时非常有用,
如何告知扭曲的SSL客户端公钥文件的位置?
答案 0 :(得分:4)
自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
及其值。