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

3

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

我对 SSL 完全是初学者,我已经浏览了 Twisted SSL 教程,但仍然有些不清楚。

我的问题是:

  • 如何使用 twisted.internet.ssl 模块验证 SSL 服务器证书?

  • ssl.ClientContextFactory.getContext 方法在处理 SSL 时有什么用处?

  • 如何告诉 Twisted SSL 客户端公钥文件的位置?


请解释一下您所说的“验证”是什么意思。通常情况下,这是底层SSL实现的工作来进行“验证”。根据您的意思,这可能已经完成了,或者您需要编写额外的代码来完成它。 - Jean-Paul Calderone
验证是指检查有效时间、主机名和验证证书。 - neotam
只有主机名检查尚未为您完成。 - Jean-Paul Calderone
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及其值。


如何指定“.pem”文件,即如何告诉Twisted SSL客户端我的“.pem”文件位置。 - neotam
一个“.pem”文件可以包含任意数量的内容。我不确定你在问什么。它是否包含服务器需要呈现的确切证书?它是否包含必须签署服务器证书的证书颁发机构证书?它是否包含证书链?请查看pyOpenSSL上下文文档,以了解处理这些要求的API。 - Jean-Paul Calderone
它包含证书链。 - neotam
那个选项其实是一个技巧。除非你在客户端使用证书来向服务器进行身份验证,否则客户端没有必要拥有证书链文件。 - Jean-Paul Calderone
谢谢,我使用了“subject_name = certificate.get_subject()”而不是“subject_name = certificate.get_subject_name()”。 - neotam
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接