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

强制请求库使用TLSv1。1或TLSv1。2在Python中

莫选
2023-03-14

我正在尝试使用python中的请求库向服务器发送POST调用。早些时候,我能够成功地发送POST调用,但最近,服务器弃用了TLSv1。0,现在只支持TLSv1。1和TLSv1。2.现在,同一代码向我抛出了一个“requests.exceptions.SSLError:EOF违反了协议(_ssl.c:590)”错误。

我发现这个线程在stackoverflow Python请求requests.exceptions.SSLError:[Errno 8]_ssl. c: 504: EOF违反了协议,协议说我们需要对HTTPAdapter进行子类化,之后会话对象将使用TLSv1。我相应地改变了我的代码,这是我的新代码

class MyAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
    self.poolmanager = PoolManager(num_pools=connections,
                               maxsize=maxsize,
                               block=block,
                               ssl_version=ssl.PROTOCOL_TLSv1)

url="https://mywebsite.com/ui/"
headers={"Cookie":"some_value","X-CSRF-Token":"some value","Content-Type":"application/json"}    
payload={"name":"some value","Id":"some value"}    
s = requests.Session()
s.mount('https://', MyAdapter())

r=s.post(url,json=payload,headers=headers)
html=r.text
print html

但即使在使用这个,我得到同样的错误EOF发生在违反协议(_ssl. c: 590)。

我的第一个问题是,我在某个地方读到,默认情况下,请求使用ssl。我知道我的服务器使用了TLSv1。0,因为TLSv1,所以我的代码工作正常。0与ssl3具有向后兼容性。0 ?

我的第二个问题是,我上面提到的stackoverflow线程,我使用它将我的代码更改为子类HTTPAdapter,说这将适用于TLSv1。但是由于TLSv1.0在我的服务器中已经过时,这段代码还能工作吗?

共有2个答案

白昊东
2023-03-14

我得到随机连接错误从非常旧的服务器(它的额定F由https://www.ssllabs.com),直到我没有开始使用这个代码在我的HTTPAdapter:

def init_poolmanager(self, *args, **kwargs):
    ssl_context = ssl.create_default_context()

    # Sets up old and insecure TLSv1.
    ssl_context.options &= ~ssl.OP_NO_TLSv1_3 & ~ssl.OP_NO_TLSv1_2 & ~ssl.OP_NO_TLSv1_1
    ssl_context.minimum_version = ssl.TLSVersion.TLSv1

    # Also you could try to set ciphers manually as it was in my case.
    # On other ciphers their server was reset the connection with:
    # [Errno 104] Connection reset by peer
    # ssl_context.set_ciphers("ECDHE-RSA-AES256-SHA")

    # See urllib3.poolmanager.SSL_KEYWORDS for all available keys.
    kwargs["ssl_context"] = ssl_context

    return super().init_poolmanager(*args, **kwargs)
南门志
2023-03-14

TLS堆栈将自动使用可用的最佳版本。如果在服务器上禁用TLS 1.0支持时它不再工作,则通常意味着您的本地TLS堆栈根本不支持更新的协议版本,如TLS 1.2。MacOSX上经常出现这种情况,因为它附带了一个破旧的OpenSSL旧版本(0.9.8)。在这种情况下,没有任何python代码可以帮助您解决这个问题,但是您需要获得一个使用更新版本OpenSSL的python。

要检查您使用的openssl版本,请在python中执行以下命令:

import ssl
print(ssl.OPENSSL_VERSION)

要支持TLS 1.2,您需要OpenSSL版本1.0.2或1.0.1。如果你只有1.0.0或0.9.8,你需要升级你的Python OpenSSL。有关如何执行此操作的更多信息,请参阅更新python 2.7中的openssl。

 类似资料:
  • 出于向后兼容的原因,我需要一个Geode Jetty服务器来使用TLSv1,而不是1.1或1.2 在< code>gemfire.properties中设置了< code > ssl-enabled-components = web 和< code > SSL-protocols = tlsv 1.0 后,当我启动Geode并使用SSL实验室检查HTTPS连接时,我会得到一个TLS结果: 我正在寻

  • 当我尝试数据源后的测试连接,我收到SSL握手异常。SSL跟踪显示,我的webphere正在发送ClientHello,TLSv1,因为所有连接到postgresql的TLS1.2启用。 我在websphere中进行了以下配置,以强制TLSv1.2通信。但它总是启动TLSv1调用。 > 在“SSL 设置”的“保护质量 (QoP)”设置中,选择 TLSv1.2 作为原型。以前选择了SSL_TLSv2

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

  • 很抱歉另一个pip问题,但我已经尝试了几乎所有其他线程,到目前为止没有任何工作。所以我有问题,pip不安装任何包,由于使用TLSv1.0 我已经完成了curl以下载get_pip。py脚本然后用sudopython执行它。 我尝试过手动下载pip.tar.gz,提取它并通过pip安装安装。/pip.10.0.3 安装后,我完成了 我已经通过自制安装了python。 但是每次我仍然得到这个TLSv1

  • 我不是SSL/TLS专家。但遇到以下情况 我们从一个供应商连接到一个webservice并且“安全策略”是TLSv1,所有的工作都像一个魅力。该供应商将该安全策略升级到TLSV1_2016。 从那时起通信就失败了。当他们重新回滚所有的工作。 这似乎已经足够了。 在AWS上,我发现了以下概述 TLSV1.2支持足以支持SSLv3 TLSV1.0 TLSv1_2016 TLSV1.1_2016 TLS

  • 我有一个使用OpenSSL的服务器应用程序。我试图了解是什么类型的SSL连接击中了我的系统(即SSLv2、SSLv3、TLSv1、TLSv1.1、TLSv1.2)。特别是,我正在努力禁用SSLv3(re:POODLE)。在此之前,我想看看SSLv3上连接的是谁/什么 我目前使用的是SSL_CIPHER_DESCRIPION和SSL_CIPHER_get_name函数,它们提供了关于为每个连接协商的