2

我正在编写一些应该从受 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-----”开头)。

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

问候

4

2 回答 2

1

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

现在关于您的代码中的问题:

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

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

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

无论如何,我想提醒一下关于 Python 文档中证书的讨论,我建议您重新阅读。

于 2011-06-25T12:22:04.967 回答
0

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

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

于 2011-06-25T12:17:16.233 回答