无法安装Python包[SSL:TLSV1_ALERT_PROTOCOL_VERSION]

Nis*_*ede 162 python pip ssl-certificate python-2.7

我正在尝试使用安装Python库pip,收到SSL错误:

~/projects/base ? pre-master±  pip install xdict

Collecting xdict
  Could not fetch URL https://pypi.python.org/simple/xdict/: There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590) - skipping
  Could not find a version that satisfies the requirement xdict (from versions: )
No matching distribution found for xdict
Run Code Online (Sandbox Code Playgroud)

点数版本:pip 9.0.1

我该如何解决这个错误?

Anu*_*pam 429

升级点如下:

curl https://bootstrap.pypa.io/get-pip.py | python
Run Code Online (Sandbox Code Playgroud)

注意:sudo python如果不在虚拟环境中,则可能需要使用上述内容.

(请注意,pip使用pipie进行pip install --upgrade pip升级也不会正确升级.这只是一个鸡与鸡蛋的问题.pip除非使用TLS> = 1.2,否则无法正常工作.)

正如在这个详细的答案中所提到的,这是由于最近对pip的TLS弃用.Python.org站点已停止支持 TLS版本1.0和1.1.

从Python状态页面:

已完成 - 滚动限制已完成,TLSv1.0和TLSv1.1已禁用.4月11日15:37 UTC


对于PyCharm(virtualenv)用户:

  1. 使用shell运行虚拟环境.(将"./venv/bin/activate"替换为您自己的路径)

    source ./venv/bin/activate
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行升级

    curl https://bootstrap.pypa.io/get-pip.py | python
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重新启动PyCharm实例,并在Preference中检查Python解释器.

  • 需要sudo才能工作:`curl https://bootstrap.pypa.io/get-pip.py | sudo python` (34认同)
  • 这对我有用!由于权限被拒绝,我不得不在前面添加`sudo`。谢谢! (2认同)
  • @Simar @Wallace是的,如果不是在虚拟环境中,可能需要`sudo`.现在在答案中添加了这一位. (2认同)
  • 在OSX上,这对我来说效果更好`curl https://bootstrap.pypa.io/get-pip.py | 须藤-H python3` (2认同)

Ale*_* C. 25

但是,如果curl命令本身因错误而失败,或者"tlsv1 alert protocol version"即使在升级后仍然存在pip,则表示操作系统的底层OpenSSL库版本< 1.0.1或Python版本< 2.7.9(或< 3.4在Python 3中)不支持更新的TLS 1.2协议这pip需要连接到PyPI中,因为大约一年前.您可以在Python解释器中轻松检查它:

>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 0.9.8o 01 Jun 2010'
>>> ssl.PROTOCOL_TLSv1_2
 AttributeError: 'module' object has no attribute 'PROTOCOL_TLSv1_2'
Run Code Online (Sandbox Code Playgroud)

AttributeError(而不是预期的"5")是指你的Python STDLIB ssl模块,对旧的OpenSSL的lib编译,缺乏对TLSv1.2工作协议(即使OpenSSL库可以或可以在以后更新)的支持.

幸运的是,它可以在不升级Python(和整个系统)的情况下通过手动安装额外的Python包来解决 - Stackoverflow上提供了详细的逐步指南.

注意,curlpipwget所有依赖于相同的OpenSSL lib中建立SSL连接(使用$ openssl version命令).libcurl支持TLS 1.2,因为curl版本为7.34,但是如果你有OpenSSL版本1.0.2(或更高版本),那么旧的curl版本应该能够连接.


PS
对于Python 3中,请使用python3pip3无处不在(除非你是在一个VENV/virtualenv中),包括curl从命令上面:
$ curl https://bootstrap.pypa.io/get-pip.py | python3 --user

  • 我也意识到我必须运行`pip3`,而不仅仅是'pip` - 使用命令`-V`检查版本以确保你正在运行正确的点! (4认同)

小智 9

关于@Anupam对OS X的回答导致我出现以下错误,无论我使用以下权限运行它:

由于EnvironmentError导致无法安装软件包:[Errno 13]权限被拒绝:...

最终工作的是从我的浏览器直接从PyPI下载更新的pip包(9.0.3) - https://pypi.org/simple/pip/,提取内容,然后在本地pip安装包:

pip install ./pip-9.0.3/
Run Code Online (Sandbox Code Playgroud)

这解决了我的[SSL: TLSV1_ALERT_PROTOCOL_VERSION]错误.


Ily*_*man 6

@Anupam的解决方案对我有用.但是,我必须使用sudo并指定我的虚拟Python环境的确切位置:

curl https://bootstrap.pypa.io/get-pip.py | sudo /Users/{your user name}/{path to python}/bin/python
Run Code Online (Sandbox Code Playgroud)


小智 6

要升级本地版本,我使用了一个轻微的变体:

curl https://bootstrap.pypa.io/get-pip.py | python - --user
Run Code Online (Sandbox Code Playgroud)

如果您按照此要点中的描述将pip和包保留在主目录下,则会出现此问题.


Vit*_*lan 5

检查您的 TLS 版本:

python2 -c "import urllib2,json; print(json.loads(urllib2.urlopen('https://www.howsmyssl.com/a/check').read())['tls_version'])"
Run Code Online (Sandbox Code Playgroud)

如果您的 TLS 版本低于 1.2,您必须升级它,因为 PyPI 存储库正处于弃用早期 TLS 的限制期。

来源 - 是时候升级您的 Python:TLS v1.2 将很快成为强制性要求

您可以使用以下命令升级 TLS 版本:

sudo apt-get update && sudo apt-get install openssl libssl-dev
Run Code Online (Sandbox Code Playgroud)

这应该可以解决您的问题。祝你好运!

编辑:无论 TLS 版本如何,您都可以使用自己的私有 python 包存储库下载包。 私有 Python 包存储库


小智 5

以下解决方案适合我:

brew install python2
Run Code Online (Sandbox Code Playgroud)

它还升级pip到1.10.1版