Python客户端错误“Connection reset by peer”

19

我编写了一个非常小的Python客户端来访问Confluence Restful API。我正在使用https协议连接到Confluence。我遇到了“Connection reset by peer”错误。 以下是完整的堆栈跟踪。

/Users/rakesh.kumar/.virtualenvs/wpToConfluence.py/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/Users/rakesh.kumar/.virtualenvs/wpToConfluence.py/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Traceback (most recent call last):
  File "wpToConfluence.py", line 15, in <module>
    main()
  File "wpToConfluence.py", line 11, in main
    headers={'content-type': 'application/json'})
  File "/Users/rakesh.kumar/.virtualenvs/wpToConfluence.py/lib/python2.7/site-packages/requests/api.py", line 71, in get
    return request('get', url, params=params, **kwargs)
  File "/Users/rakesh.kumar/.virtualenvs/wpToConfluence.py/lib/python2.7/site-packages/requests/api.py", line 57, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Users/rakesh.kumar/.virtualenvs/wpToConfluence.py/lib/python2.7/site-packages/requests/sessions.py", line 475, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/rakesh.kumar/.virtualenvs/wpToConfluence.py/lib/python2.7/site-packages/requests/sessions.py", line 585, in send
    r = adapter.send(request, **kwargs)
  File "/Users/rakesh.kumar/.virtualenvs/wpToConfluence.py/lib/python2.7/site-packages/requests/adapters.py", line 453, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', error(54, 'Connection reset by peer'))

这是我的客户端代码:

import requests


def main():
    auth = open('/tmp/confluence', 'r').readline().strip()

    username = 'rakesh.kumar'

    response = requests.get("https://<HOST-NAME>/rest/api/content/",
                            auth=(username, auth),
                            headers={'content-type': 'application/json'})
    print response

if __name__ == "__main__":
    main()

我正在虚拟环境中运行此脚本,以下是已安装在该环境中的软件包:

(wpToConfluence.py)➜  Python pip list
You are using pip version 6.1.1, however version 8.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
appnope (0.1.0)
backports.shutil-get-terminal-size (1.0.0)
decorator (4.0.10)
ipdb (0.10.1)
ipython (5.0.0)
ipython-genutils (0.1.0)
pathlib2 (2.1.0)
pexpect (4.2.0)
pickleshare (0.7.3)
pip (6.1.1)
prompt-toolkit (1.0.5)
ptyprocess (0.5.1)
Pygments (2.1.3)
requests (2.10.0)
setuptools (25.1.6)
simplegeneric (0.8.1)
six (1.10.0)
traitlets (4.2.2)
urllib3 (1.16)
wcwidth (0.1.7)

它确实抱怨Python版本号,但我不确定如何更新我的Mac /虚拟环境Python。

我尝试了curl命令和Postman,两者在给定参数的情况下都可以正常工作。


在文件中输入硬编码的密码并重试。它会抱怨你的pip版本过旧。你可以使用 sudo pip install --upgrade pip 命令来更新它。 - Doron Cohen
@DoronCohen 我已经将pip升级到8.1.2版本。我使用了这个命令来解决这个问题 pip install "requests[security]",它完美地解决了问题。 - Rakesh
很好。那就发布一个解决方案吧。 - Doron Cohen
@DoronCohen 刚刚发布了答案。感谢您回答我的问题。 - Rakesh
5个回答

48
在安装requests库时,它会跳过一些可选的安全包('pyOpenSSL'、'ndg-httpsclient'和'pyasn1'),而这些包是 SSL/Https 连接所必需的。 您可以通过运行以下命令来解决这个问题:
pip install "requests[security]"
pip install pyopenssl ndg-httpsclient pyasn1

1
安装pip install pyopenssl idna解决了我的问题。 - Rohit

3

我尝试安装上面答案中提供的所有可选安全包,但似乎都没有起作用。

一个重要的问题:请检查您的 URL 端点是否主动阻止编程访问。

查看网站根目录中的 robots.txt 文件:http://myweburl.com/robots.txt

如果它包含类似这样的文本:User-agent: * Disallow: /

该网站不喜欢并且不想被抓取。这会导致您遇到错误代码 54,对等方重置连接的相同错误。

以下是快照:

https://www.aclibrary.org/robots.txt

User-agent: discobot Disallow: / User-agent: AddThis.com Disallow: / User-agent: Yandex Disallow: / User-agent: Baiduspider Disallow: / User-agent: Baiduspider-video Disallow: / User-agent: Baiduspider-image Disallow: / User-agent: SemrushBot Disallow: / User-agent: SemrushBot-SA Disallow: / User-Agent: W3C-checklink Crawl-delay: 0 User-agent: Twitterbot Disallow: User-agent: * Crawl-delay: 10 Disallow: /er.php Disallow: /err.php Disallow: /go.php Disallow: /friendly.php Disallow: /ld.php Disallow: /srch.php Sitemap: https://aclibrary.org/sitemap.xml


3

我遇到了同样的问题,但安装可选的安全包对我也没有用。

我不得不将 requests 版本从 2.25.1 降级至 2.21.0


2

安装可选的安全包对我没有起作用,以防万一有人遇到相同的错误信息,请检查您尝试使用的URL是否正确。

例如,如果服务器期望在不同的端口上建立连接,则可能会出现此错误。


0
在我的情况下,我想从中获取响应的URL被我的服务器位置阻止。
确保你像这样使用它:res = requests.get(url, stream=True,verify=False) 之后,如果你有同样的问题,可以尝试以下几种方法:
  1. 对于本地机器,只需安装VPN(远程服务器也可以这样做)
  2. 对于远程服务器,必须确保该服务器位于允许此类URL的不同位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接