如何在Twisted SSL客户端中验证SSL服务器证书

3 投票
1 回答
2281 浏览
提问于 2025-04-17 16:46

我该如何在我的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 握手成功完成后(这意味着证书在 notBeforenotAfter 的值范围内是有效的,并且它是由你信任的证书颁发机构签发的),你可以从传输中获取证书:

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 及其值。

撰写回答