【问题标题】:basic authentication https proxy sockets displaying tlsv1 decode error after connection established建立连接后显示 tlsv1 解码错误的基本身份验证 https 代理套接字
【发布时间】:2020-06-21 00:27:05
【问题描述】:

我正在尝试使用基本身份验证(用户:使用 b64 编码的传递)连接到经过 https 身份验证的代理。我能够使非身份验证代理正常工作,但我最近购买了代理,现在我需要使身份验证工作。这看起来很简单,我所要做的就是添加一个“代理授权”标题,它就可以工作了。这样做后它工作了,它给了我一个“200连接建立”的响应。完成此操作后,我尝试使用“ssl”库对套接字进行 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.1\r\nProxy-Authorization: Basic {credentials}\r\nHost: site.com\r\n\r\n".encode())
connect_response = s.recv(4096)
print(connect_response)
s = wrap_socket(s)

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

【问题讨论】:

    标签: python sockets ssl http-proxy python-sockets


    【解决方案1】:

    如果您在发送之前打印出请求,您会看到:

    b'CONNECT google.com:443 HTTP/1.1\r\nProxy-Authorization: Basic dXNlcjpwYXNz\n\r\nHost: google.com\r\n\r\n'
    

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

    由于无关的\n,这些字符实际上被解释为HTTP 标头的结尾,而其余的Host: google.com\r\n\r\n 将暂时不被服务器读取。它仅在预期 TLS 握手时读取,即 Host: google.com\r\n\r\n 将被服务器解释为 TLS ClientHello 的一部分,因此 TLS 握手将失败。

    解决方法是在最后消除错误的\n。虽然您已尝试使用 strip(r"\n") 进行此操作,但正确的方法是仅限 strip("\n"):您希望消除 1 字节字符 "\n" 而不是 2 字节字符串 r"\n"

    【讨论】:

    • 似乎总是超级小东西,感谢它的工作。我一直使用 r"\n" 但现在我知道为什么在某些情况下不应该使用。
    猜你喜欢
    • 2012-02-04
    • 2014-10-11
    • 2016-04-24
    • 2014-03-21
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多