通过HTTPS代理的Python请求失败,出现代理错误

2024-06-16 17:32:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在实验室中设置了一个squid代理,用python请求库复制生产问题

Squid设置: -客户-->;HTTPS上的Squid -Squid没有进行任何TLS拦截/碰撞 -从卷曲开始就可以很好地工作。 -不需要密码 -squid服务器上的有效证书

Curl输出工作正常:

curl -I -x https://squid-signed.hacksbrain.com:3128 https://www.google.com
HTTP/1.1 200 Connection established 
HTTP/2 200
date: Sat, 04 Apr 2020 00:20:50 GMT
... Content from google.com ...

但是,当我尝试从Python请求进行调用时,会出现以下错误:

requests.exceptions.ProxyError: HTTPSConnectionPool(host='google.com', port=443): Max retries exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', ConnectionResetError(54, 'Connection reset by peer')))

我在squid服务器上捕获了数据包,我看到三方握手完成,python客户端推送数据包,然后squid服务器进行TCP重置

我在squid日志中看到与此连接尝试对应的以下条目:

1585958924.312      0 192.168.1.100 NONE/000 0 NONE error:transaction-end-before-headers - HIER_NONE/- -

用于创建端到端隧道的CONNECT命令从未从python客户端发送

def main():
  proxies = {'https': 'https://squid-signed.hacksbrain.com:3128'}
  headers = {'User-Agent': 'curl/7.64.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
  r = requests.get('https://google.com', headers=headers, proxies=proxies)

我的怀疑是,请求客户不知道如何处理客户-->;https上的squid与http上的squid。在我的生产环境中,这是必需的,因为它是一个经过身份验证的代理,在头中以明文形式发送凭据,因此到squid的https连接是一个硬要求

更新:我在wireshark中打开了工作cURL会话和python会话的捕获。我想我看到了问题所在。Python请求将CONNECT命令以明文形式发送到代理服务器,而不是在https隧道内。我没有从工作旋度捕获中看到这种行为。 python packet capture


Tags: httpsgt服务器comnone代理客户google