如何验证双绞线SSL客户端中的SSL服务器证书

时间:2013-02-22 14:36:14

标签: python ssl ssl-certificate twisted

如何验证扭曲的SSL客户端中的SSL服务器证书?

我非常熟悉SSL,我已经完成了twisted SSL tutorials,但我仍然不清楚某些事情。

我的疑问是:

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

  • ssl.ClientContextFactory.getContext方法在处理SSL时非常有用,

  • 如何告知扭曲的SSL客户端公钥文件的位置?

1 个答案:

答案 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握手成功完成后(这意味着证书当前基于其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及其值。