【问题标题】:How to validate the SSL server certificate in twisted SSL client如何在扭曲的 SSL 客户端中验证 SSL 服务器证书
【发布时间】:2013-02-08 05:04:19
【问题描述】:

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

我是 SSL 的初学者,我已经通过了twisted SSL tutorials,但我仍然不清楚一些事情。

我的查询是:

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

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

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

【问题讨论】:

  • 请解释您所说的“验证”是什么意思。通常,进行“验证”是底层 SSL 实现的工作。根据您的意思,这可能已经完成,或者您可能需要编写额外的代码来完成。
  • 在检查有效时间、主机名和验证证书的意义上进行验证。
  • 只有主机名检查尚未为您完成。

标签: python ssl ssl-certificate twisted


【解决方案1】:

自 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”文件位置。
  • 一个“.pem”文件可以包含任意数量的东西。我不确定你在问什么。它是否包含服务器需要提供的确切证书?它是否包含必须签署服务器证书的证书颁发机构证书?它是否包含证书链?查看 pyOpenSSL Context 文档,了解现有的用于处理这些要求的 API。
  • 它包含证书链。
  • 实际上,这是一个技巧选项。客户端拥有证书链文件是没有意义的,除非您在客户端使用证书向服务器验证自己的身份。
  • 是否可以给我一个工作示例(扭曲的 ssl 客户端),它将将从 ssl 服务器接收到的证书与 .pem 文件进行比较,并且它会检查它的域地址正在使用收到的证书进行连接,并检查 ,not after , not before。否则请告诉我从哪里可以掌握那里的东西
猜你喜欢
  • 2016-05-24
  • 2015-10-20
  • 1970-01-01
  • 2014-09-19
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多