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

问题描述:

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

我非常初学SSL,我已经通过了twisted SSL tutorials但我仍然对某些事情不清楚。

我的查询是:

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

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

  • 我怎么能告诉扭曲的SSL客户端有关公钥文件的位置?

+0

请解释您的意思是“验证”。通常,执行“验证”是底层SSL实施的工作。根据你的意思,这可能已经完成,或者你可能需要编写额外的代码来做到这一点。 – 2013-02-26 00:26:43

+0

验证检查有效时间,主机名和验证证书的意义。 – 2013-02-26 06:16:37

+0

只有主机名检查尚未完成。 – 2013-02-27 02:37:10

由于扭曲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采取其它(任选的)参数,以及它也可以是有用的。

此前扭曲的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及其值。

+0

如何指定“.pem”文件,即如何告诉将ssl客户端关于我的“.pem”文件位置。 – 2013-02-27 04:31:35

+0

“.pem”文件可以包含任何数量的内容。我不确定你在问什么。它是否包含服务器需要提供的确切证书?它是否包含必须签署服务器证书的证书颁发机构证书?它是否包含证书链?查看pyOpenSSL Context文档以查看处理这些需求的API。 – 2013-02-27 16:15:21

+0

它包含证书链。 – 2013-02-27 16:33:19