如何在Twisted SSL客户端中验证SSL服务器证书
我该如何在我的twisted SSL客户端中验证SSL服务器证书?
我对SSL还是个新手,虽然我看过了twisted SSL教程,但还是有些地方不太明白。
我有以下几个问题:
我该如何使用
twisted.internet.ssl
模块来验证SSL服务器证书?ssl.ClientContextFactory.getContext
这个方法在处理SSL时有什么用?我怎么告诉twisted SSL客户端公钥文件的位置?
1 个回答
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
及其值。