基本身份验证 HTTPS 代理套接字在建立连接后显示 TLSv1 解码错误



>我正在尝试使用基本身份验证连接到经过https身份验证的代理(user:pass with b64编码(。我能够使非身份验证代理正常工作,但我最近购买了代理,现在我需要使身份验证工作。这看起来很简单,我所要做的就是添加一个"代理授权"标头,它就可以工作。这样做后它起作用了,它给了我一个"200 连接已建立"响应。完成此操作后,我尝试使用 "ssl" 库包装套接字。这导致我收到以下错误:"tlsv1 解码错误"。在查看了一些堆栈帖子后,我认为我应该更改正在使用的协议版本,我尝试使用所有其他可用版本,但由于某种原因仍然导致我上面所说的错误(这很奇怪,因为我没有使用"tlsv1"。

credentials = base64.encodebytes(b"user:pass").decode().strip(r"n")
s.connect((proxy[0], int(proxy[1])))
s.send(f"CONNECT site.com:443 HTTP/1.1rnProxy-Authorization: Basic {credentials}rnHost: site.comrnrn".encode())
connect_response = s.recv(4096)
print(connect_response)
s = wrap_socket(s)

经过更多的研究,我发现它可能与"领域"响应标头有关。我找不到任何关于此的文档,也不知道它的用途。这让我相信我做错了什么,在尝试包装插座之前,我应该有更多的步骤。 我的问题是为什么我在尝试包装套接字时收到此错误/回溯,我该如何解决这个问题?

如果您在发送请求之前打印出来,您将看到以下内容:

b'CONNECT google.com:443 HTTP/1.1rnProxy-Authorization: Basic dXNlcjpwYXNznrnHost: google.comrnrn'

请注意Proxy-Authorization标头末尾的nrn。这是完全错误的,即它应该只rn

由于无关紧要n这些字符实际上被解释为 HTTP 标头的结尾,其余Host: google.comrnrn目前将被服务器读取。只有当TLS握手达到预期时,它才会被读取,即服务器将Host: google.comrnrn解释为TLS ClientHello的一部分,因此TLS握手将失败。

解决方法是消除最后的错误n。虽然您已经尝试过strip(r"n")但正确的方法只会strip("n"):您希望消除 1 字节字符"n"而不是 2 字节字符串r"n"

最新更新