>我正在尝试使用基本身份验证连接到经过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"
。