python - Python 中的 SSL : Why it doesn't send certificate to server?

标签 python ssl ssl-certificate x509 handshake

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

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

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

问候

最佳答案

首先,您需要确定您是否需要在服务器上验证自己(在这种情况下证书仅发送到服务器)或者您需要验证服务器的真实性(在这种情况下证书不会发送到服务器)。

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

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

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

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

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

关于python - Python 中的 SSL : Why it doesn't send certificate to server?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6477586/

相关文章:

Python:PyCharm 通过 "shape"显示 "mouse over"

python - Python 3 str.join() 是否保证顺序?

python - dt.time. Between 返回 pandas 中的空列

python - python 中本地 https 服务器上的 SSL 异常

node.js - 在 localhost 上设置 (https) SSL 以进行 meteor 开发

python - 输出文件上的间距存在问题 - 使用 itertools 产品进行循环,使用两个不同文本文件中的变量输出到第三个文件

python - 在带有 Google Cloud 服务的 Python 中使用多处理时出现 SSL 错误

http - 从 SSL 中排除子域

Java - 如何通过针对 Java keystore 或 Windows CertMgr 输入 URL 来验证 SSL 证书?

certificate - 如何使用 keytool 列出 PKCS12 keystore 中存储的证书?