gpt4 book ai didi

python - 在 Python 中通过 TCP 代理连接发送 SSL 数据

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:50 29 4
gpt4 key购买 nike

我面临以下情况:我被迫使用 HTTP 代理连接到 HTTPS 服务器。由于多种原因,我需要访问原始数据(加密前),因此我使用套接字库而不是 HTTP 特定库之一。因此,我首先将 TCP 套接字连接到 HTTP 代理并发出连接命令。

此时,HTTP 代理接受连接并似乎将所有进一步的数据转发到目标服务器。但是,如果我现在尝试切换到 SSL,我会收到

error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

表示套接字尝试与 HTTP 代理而非 HTTPS 目标握手。

这是我目前的代码:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('proxy',9502))
s.send("""CONNECT en.wikipedia.org:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:15.0) Gecko/20100101 Firefox/15.0.1
Proxy-Connection: keep-alive
Host: en.wikipedia.org

""")

print s.recv(1000)

ssl = socket.ssl(s, None, None)
ssl.connect(("en.wikipedia.org",443))

连接到 HTTP 代理后,打开到目标服务器的 SSL 套接字的正确方法是什么?

最佳答案

(请注意,通常情况下,使用现有的 HTTPS 库(如 PyCurl)会更容易,而不是自己全部实现。)

首先,不要调用变量 ssl。此名称已被 ssl 模块使用,因此您不想隐藏它。

其次,不要再次使用connect。你已经连接好了,你需要的是包裹套接字。由于 Python 默认不进行任何证书验证,因此您需要验证远程证书并验证主机名。

以下是涉及的步骤:

  • 建立您的纯文本连接并使用 CONNECT,就像您在前几行中所做的那样。
  • 阅读您收到的 HTTP 响应,并确保收到 2​​00 状态代码。 (您需要逐行阅读标题)。
  • 使用 ssl_s = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLS1, ca_certs='/path/to/cabundle.pem') 包装套接字。然后,验证主机名。值得一读this answer : connect 方法及其在包装套接字后的作用。
  • 然后,像使用普通套接字一样使用 ssl_s。不要再调用 connect

关于python - 在 Python 中通过 TCP 代理连接发送 SSL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15238255/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com