当前位置: 首页 > 知识库问答 >
问题:

ssl。SSLError:tlsv1警报协议版本

程淮晨
2023-03-14

我正在为Cisco CMX设备使用REST API,并试图编写Python代码,该代码向API发出获取信息的GET请求。代码如下,与文件中的代码相同,只是更改了必要的信息。

from http.client import HTTPSConnection
from base64 import b64encode


# Create HTTPS connection
c = HTTPSConnection("0.0.0.0")

# encode as Base64
# decode to ascii (python3 stores as byte string, need to pass as ascii 
value for auth)
username_password = b64encode(b"admin:password").decode("ascii")
headers = {'Authorization': 'Basic {0}'.format(username_password)}

# connect and ask for resource
c.request('GET', '/api/config/v1/aaa/users', headers=headers)

# response
res = c.getresponse()

data = res.read()

然而,我不断得到以下错误:

Traceback (most recent call last):
  File "/Users/finaris/PycharmProjects/test/test/test.py", line 14, in <module>
    c.request('GET', '/api/config/v1/aaa/users', headers=headers)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1106, in request
    self._send_request(method, url, body, headers)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1151, in _send_request
    self.endheaders(body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1102, in endheaders
    self._send_output(message_body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 934, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 877, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1260, in connect
    server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 377, in wrap_socket
    _context=self)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 752, in __init__
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 988, in do_handshake
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 633, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:645)

我还尝试更新OpenSSL,但没有效果。

共有3个答案

曹泉
2023-03-14

我相信TLSV1\u ALERT\u PROTOCOL\u VERSION正在提醒您服务器不想与TLS v1对话。谢谢你。尝试指定TLS v1。2仅通过以下方式:

import ssl
from http.client import HTTPSConnection
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)

# Create HTTPS connection
c = HTTPSConnection("0.0.0.0", context=context)

注意,您可能需要足够新的Python版本(可能是2.7.9?)可能还有OpenSSL(我有“OpenSSL 1.0.2k 2017年1月26日”,上面的内容似乎有效,YMMV)

薛鹏飞
2023-03-14

你唯一要做的就是在你的虚拟环境中安装请求[Security]。你不应该使用Python 3(它应该在Python 2.7中工作)。此外,如果您使用的是最近版本的macOS,您也不必使用home brew来单独安装OpenSSL。

$ virtualenv --python=/usr/bin/python tempenv  # uses system python
$ . tempenv/bin/activate
$ pip install requests
$ python
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 0.9.8zh 14 Jan 2016'  # this is the built-in openssl
>>> import requests
>>> requests.get('https://api.github.com/users/octocat/orgs')
requests.exceptions.SSLError: HTTPSConnectionPool(host='api.github.com', port=443): Max retries exceeded with url: /users/octocat/orgs (Caused by SSLError(SSLError(1, u'[SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590)'),))
$ pip install 'requests[security]'
$ python  # install requests[security] and try again
>>> import requests
>>> requests.get('https://api.github.com/users/octocat/orgs')
<Response [200]>

请求[安全]允许请求在协商连接时使用最新版本的TLS。macOS上的内置openssl支持TLS v1。2.

在你安装你自己版本的OpenSSL之前,问一下这个问题:GoogleChrome加载https://github.com?

田瀚
2023-03-14

我也犯了同样的错误,谷歌把我带到了这个问题上,下面是我所做的,希望它能帮助其他处于类似情况的人。

这适用于OS X。

在终端中签入我拥有的OpenSSL版本:

$ python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
>> OpenSSL 0.9.8zh 14 Jan 2016

由于我的OpenSSL版本太旧,所以公认的答案不起作用。

所以我必须更新OpenSSL。为此,我使用自制软件将Python更新到最新版本(从3.5版到3.6版),并遵循此处建议的一些步骤:

$ brew update
$ brew install openssl
$ brew install python3

然后,我在路径和使用的python版本方面遇到了问题,因此我刚刚创建了一个新的virtualenv,确保采用了python的最新版本:

$ virtualenv webapp --python=python3.6

问题解决了。

 类似资料:
  • 以前有人遇到过这个错误吗?我是新来的SSL,我的客户有什么明显的问题吗?你好,我错过了吗?在没有ServerHello响应的情况下引发该异常。任何建议都很感激。 {http://xml.apache.org/axis/}stackTrace: ...

  • Secure Sockets Layer (SSL,安全套接字层)是在网络上应用最广泛的加密协议实现。SSL 使用结合加密过程来提供网络的安全通信。本节介绍 SSL 和它所使用的加密过程。 SSL 提供了一个安全的增强标准 TCP/IP 套接字用于网络通信协议。如表3所示,添加了安全套接字层传输层和应用层之间的标准 TCP/IP 协议栈。SSL的应用程序中最常用的是 Hypertext Trans

  • 根据下面的代码,如何将协议设置为TLSv1.2、TLSv1、SSLv3? 使用SoapUi,我可以使用以下配置请求服务:-dSOAPUI.https.protocols=TLSv1.2,TLSv1,SSLv3 使用CXF,我得到一个“javax.net.ssl.SSLHandShakeException:没有适当的协议(协议被禁用或密码套件不适当)” 很抱歉我对Soap和SSL的知识很差...

  • 问题内容: 我正在使用Apache HttpClient 4.3与hubic.com的API进行交互。我最小的可重现示例只是一个衬纸: 但是,抛出: 如果我运行以下是输出: 如果我尝试访问例如https://google.com,则不会引发任何异常。因此,它猜测Java上的SSL与SSL不能在我的系统上完全被破坏,但这与hubic.com的组合有关。 该错误不是很有帮助,但是在此问题中建议我的客户

  • 随着POODLE(CVE-2014-3566)最近的披露,包括支付网关在内的许多服务器都在其服务器上禁用SSLv3,并强制使用TLS。 有人知道ASP.NET Framework在内部使用哪种SSL协议来处理WebRequest之类的事情吗?如果它使用SSLv3,并且不会自动返回到TLS,那么有没有一种方法可以对此进行配置? 注意:我们已经通过注册表禁用了SSLv3,它似乎没有影响到我们网站的HT

  • 以前我使用pip安装包,但现在我试图使用pip安装Python库,得到一个SSL错误: OpenSSL和TLS版本 Pip版本 操作系统信息 我试过了 但这对我不起作用。收到的错误消息是 SSL例程:SSL23_GET_SERVER_HELLO: tlsv1警报协议版本 如何修复此错误?