【问题标题】:SSL in Python: Why it doesn't send certificate to server?Python中的SSL:为什么它不向服务器发送证书?
【发布时间】:2011-09-22 14:01:36
【问题描述】:

我正在编写一些应该从受 SSL 保护的网页获取信息的软件。下面是我用来连接服务器的一段代码。

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket (
    s,
    ca_certs = '/home/stilz/Desktop/Certyfikaty/GLOWNE_CA.cer',
    cert_reqs = ssl.CERT_REQUIRED,
    ssl_version = ssl.PROTOCOL_SSLv3,
)
ssl_sock.connect ((HOST, PORT))

但是,这不起作用。它抛出异常消息“握手警报失败”。我捕获了一些来自我的脚本的 TCP 数据包以及来自 Internet Explorer 的相应数据包,并发现我的脚本根本不发送证书(服务器返回类似“致命:未提供证书”),而 IE 正常发送它。据我所知,文件 ca.cer 是 x509 证书(以“-----BEGIN CERTIFICATE-----”开头)。

请帮助我,告诉我我做错了什么。如果我提供的信息很少,请告诉我。

问候

【问题讨论】:

  • 欢迎来到 SO。您可以通过编辑来更新您自己的问题。您可以为问题投票(赞成或反对),如果您得到满足您需求并回答了您的问题的答案,您可以将其标记为答案
  • 同意@Eugene。您可以在问题中说,这是关于在 Windows 下使用智能卡上的证书/私钥(如果它在 Windows 下?.../home/stilz/Desktop/ 看起来不像)。

标签: python ssl ssl-certificate x509 handshake


【解决方案1】:

首先,你需要确定是需要在服务器上对自己进行身份验证(这种情况下才向服务器发送证书)还是需要验证服务器的真实性(这种情况下,证书不会发送到服务器)服务器)。

现在关于代码中的问题:

案例 1:您不需要在服务器上进行身份验证。在这种情况下,您不需要指定您的证书,也不会向服务器发送任何内容。

案例 2:您需要在服务器上进行身份验证。在这种情况下,您需要在 keyfile 和 certfile 参数中提供您的证书和您的私钥文件。只有这样您的证书才会发送到服务器(并且在握手中使用私钥)。

我猜你实际上有案例 1。因此,首先您需要通过使用 Web 浏览器连接到服务器并检查站点的证书链来检查服务器是否提供了有效的证书。站点可能会发送其证书但忽略中间 CA 证书。

无论如何,我想提醒一下我建议您重新阅读的discussion about certificates in Python docs

【讨论】:

  • 显然我没有阅读您提供的部分。它解释了事情是如何运作的。现在我必须得到私钥(证书文件和公钥/私钥都在智能卡上)。帮助将不胜感激(请参阅下一篇文章下面的 cmets)。提前致谢
【解决方案2】:

如果服务器请求(并要求)客户端发送的证书,您需要提供 ssl.wrap_socket您的 证书的路径 (certfile) 及其匹配的私钥(keyfile)。 ca_certs 参数仅用于客户端根据已知 CA 证书验证服务器证书,与发送客户端证书无关。

您可能需要从 IE 中导出您的客户端证书和私钥(然后将它们转换为 PEM 格式)。

【讨论】:

  • IE 使用智能卡获取密钥。它是公共的还是私人的?据我所知,从智能卡中获取私钥是不可能的。我对吗?无论如何,我该怎么做才能从 IE 中导出这些东西?提前致谢。
  • 智能卡可能会同时提供证书和私钥。但是,它可能嵌入了加密功能,因此私钥不需要(或不能)离开智能卡。您可能无法以 PEM 格式获取私钥以供 ssl.ssl_wrap 使用。根据智能卡使用的接口,可能值得在 Python 中查找“PKCS#11”(或任何智能卡格式)。
  • 我已经尝试过 OpenSC 工具(pkcs11 和 pkcs15),但显然它们无法列出密钥。如果 IE 可以做到,我必须做同样的事情吗?我尝试了一些 USB 嗅探(它是 USB 阅读器),但我发现没有流量。
  • 可能您的卡与 PKCS#11 不兼容。尝试找出Windows下使用的驱动程序。
  • @stilz 这可能是 OpenSC 无法访问卡(某些设备会发生这种情况)。在 Windows 上使用 Python 有什么特别的原因吗?更适合 Windows(如 .NET)的东西可以通过 CryptoAPI(这是 IE 的工作方式)访问智能卡。
猜你喜欢
  • 2017-09-26
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 2015-10-20
  • 2016-05-10
  • 2015-05-11
  • 2017-05-19
相关资源
最近更新 更多