首页 > 其他分享 >urllib 2.x版本下dh key too small 等SSL类错误的解决方法

urllib 2.x版本下dh key too small 等SSL类错误的解决方法

时间:2023-11-07 17:33:57浏览次数:34  
标签:dh ssl DEFAULT urllib3 urllib SSL context requests

问题

当我们使用python的requests访问目标网站的时候,有时会遇到以下这种错误(以 https://dh-composite.badssl.com/ 为例)

requests.exceptions.SSLError: HTTPSConnectionPool(host='dh-composite.badssl.com', port=443): Max retries exceeded with url: /
(Caused by SSLError(SSLError(1, '[SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:992)')))

这个时候我们在网上搜索解决办法往往是这种解决办法

import requests
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DEFAULT:@SECLEVEL=1'

# 或者
import urllib3
urllib3.util.ssl_.DEFAULT_CIPHERS = 'DEFAULT:@SECLEVEL=1'

但是在某些情况下我们发现是仍然没办法生效,或者直接提示没有DEFAULT_CIPHERS这个属性的。
这是因为urllib3在2023年4月升级到了2.0.0版本,并且在新版本中废弃了DEFAULT_CIPHERS属性,所以我们需要另辟蹊径。

原因

具体原因可以看这个回答
简单来说DH_KEY_TOO_SMALL的本质原因是目标网站的SECLEVEL设置为1,而这被认为是不安全的,所以访问会报错。解决办法就是强制将SECLEVEL设置为1或者0。在1.x的urllib3中,urllib3提供了DEFAULT_CIPHERS属性来自定义ssl相关的参数,但是在2.x版本中为了安全废弃了该属性。而由于requests实际上是调用urllib3请求网站,所以同样会出现这样的错误。

解决办法

在urllib3的issue中有位大佬提供了解决办法,也就是自定义HTTPAdapter的实例
以下是代码

import requests
import urllib3

# 自定义HTTPAdapter
class CustomSSLContextHTTPAdapter(requests.adapters.HTTPAdapter):
    def __init__(self, ssl_context=None, **kwargs):
        self.ssl_context = ssl_context
        super().__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = urllib3.poolmanager.PoolManager(
            num_pools=connections, maxsize=maxsize,
            block=block, ssl_context=self.ssl_context)

#自定义ssl_context
ctx = urllib3.util.create_urllib3_context()
ctx.load_default_certs()
ctx.set_ciphers("DEFAULT@SECLEVEL=0")

#替换原有的https的adapters
session = requests.session()
session.adapters.pop("https://", None)
session.mount("https://", CustomSSLContextHTTPAdapter(ssl_context=ctx))

response = requests.request(
    method= "GET",
    url='https://dh-composite.badssl.com/',
)
print(response.content)

这样就可以成功的请求目标网站了。同理对于其他ssl的错误也可以举一反三通过这样的方式更改ciphers的参数来进行解决。

标签:dh,ssl,DEFAULT,urllib3,urllib,SSL,context,requests
From: https://www.cnblogs.com/dingnosakura/p/17815410.html

相关文章

  • 谷歌浏览器 ERR_SSL_PROTOCOL_ERROR
    9月28日,Chromium提交了一个标题为DisableSHA1inTLSserverhandshakesbydefault的部署,默认禁用了TLS握手时的SHA1加密方法,这本是一次正常且正确的发布,因为SHA1已经被公认为不安全的。但是却没想到有一些老旧的系统依然使用了较低版本的OpenSSL,而低版本的OpenSSL存在bug,会强制......
  • Base64编码、解码 C语言例子(使用OpenSSL库)
    #include<stdio.h>#include<string.h>#include<unistd.h>#include<openssl/pem.h>#include<openssl/bio.h>#include<openssl/evp.h>intbase64_encode(char*in_str,intin_len,char*out_str){BIO*b64,*bio;......
  • linux(redhat系列 rpm软件管理)中确认是否安装指定的安装包
     001、rpm-qa|grep"packagename";例如:[root@pc1~]#rpm-qa|grep"wget"##确认是否安装了wget命令wget-1.14-18.el7_6.1.x86_64[root@pc1~]#rpm-qa|grep"lsb"##确认是否安装了lsb命令redhat-lsb-pr......
  • 使用MethodHandles来调用
    在Java中,我们想在程序运行时调用其方法,可以用JDK提供的反射相关API来实现,代码如下:Classclazz=Demo.class;Methodmethod=clazz.getMethod("studyHard",newClass[]{String.class});Demodemo=clazz.newInstance();method.invoke(demo,"哈哈");这样的代码看起来也挺......
  • LinkedHashMap
    概述Hashtableandlinkedlistimplementationofthe<tt>Map</tt>interface,withpredictableiterationorder.Thisimplementationdiffersfrom<tt>HashMap</tt>inthatitmaintainsadoubly-linkedlistrunningthroughallofitsen......
  • DHCP服务
    DHCP服务yuminstall–ydhcp* DHCP所需的软件包cp–p/usr/share/doc/dhcp.4.2.5/dhcp.conf.sample/etc/dhcp/dhcpd.conf 复制模板文件vim/etc/dhcp/dhcpd.confshared-networkxxx{}超级作用域subnet192.168.30.0netmask255.255.255.0{optio......
  • SSL证书加密是什么?加密原理和过程是怎样的?
    随着互联网的普及和发展,人们的日常生活与网络密切交织在一起。然而,由于网络通信的开放性,信息在传输过程中很容易被窃取、篡改或伪造,因此保护用户的隐私和数据安全显得尤为重要。SSL证书加密就是一种用于保护网络通信安全的技术,它将网站和用户之间的数据传输加密,使得数据在传输过程......
  • 20.8 OpenSSL 套接字SSL传输文件
    有了上面的基础那么传输文件的实现就变得简单了,在传输时通常我们需要打开文件,并每次读入1024个字节的数据包,通过SSL加密传输即可,此处的文件传输功能在原生套接字章节中也进行过详细讲解,此处我们还是使用原来的密钥对,实现一个服务端等待客户端上传,当客户端连接到服务端后则开始传输......
  • 职场小白必备知识点-DHCP协议介绍
    1.DHCP协议简介DHCP,全称是DynamicHostConfigurationProtocolo中文名为动态主机配置协议,它的前身是BOOTP,它工作在OSI的应用层,是一种帮助计算机从指定的DHCP服务器获取它们的配置信息的自举协议。DHCP使用客户端/服务器模式,请求配置信息的计算机叫做DHCP客户端,而提供信息的叫做D......
  • redhat --修改时区 转发 https://www.cnblogs.com/rongren/p/12600869.html
    LINUXredhat修改时间 在LINUX系统中,时间分为两个部分,一个是系统时间,只针对运行时,重启后就无用,二是主板时间,系统重启后,自动从主板中获取时间。一、查看时间  date命令:查看当前时间二、修改时间 时间修改有两种方法(一)修改系统时间,然后执行命令从系统同步时间 1、......