OpenSSL 3.0.2 报 dh key too small 的问题

embedded/2025/3/29 1:40:17/

问题复现

运行命令 curl 访问一个 https 网站,可能会出现  "dh key too small" 的问题。

> curl -v --insecure  https://some_web_site
*   Trying 175.21.4.7:443...
* Connected to some_web_site (175.21.4.7) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.0 (IN), TLS handshake, Certificate (11):
* TLSv1.0 (IN), TLS handshake, Server key exchange (12):
* TLSv1.0 (OUT), TLS alert, handshake failure (552):
* OpenSSL/3.0.15: error:0A00018A:SSL routines::dh key too small
* Closing connection 0
curl: (35) OpenSSL/3.0.15: error:0A00018A:SSL routines::dh key too small

原因是服务器比较老,SSL 协议中使用了较短的 dh key。 而客户端的 openssl 版本较新,默认的安全级别高,当握手时,发现对方的服务器使用了 短的 dh key,就拒绝进一步连接,认为该服务器是不安全的。
然而,现存有大量这样的服务器。由于无法更改服务器的配置,因此不得不降低客户端openssl的安全策略。
 

通常的解决办法( openSSL 3.0 以下)

这个情况实际上已经出现很多年了,大部分的解决方案是修改 openssl 的配置文件 openssl.cnf

将 openssl_conf 修改如下

openssl_conf = default_conf

 并在 文件最后添加下面

[default_conf]
ssl_conf = ssl_sect[ssl_sect]
system_default = system_default_sect[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=1

更详细的解释可参考
https://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl-security-level 

新的解决办法( openSSL 3.0 及以上)

然而,对于 OpenSSL 3.0 以上的系统,例如 Debian 12 自带的是 openSSL 3.0.15, 则老的解决办法就不灵了。需要用另外一种方式。与老的方法差别体现在 【system_default_sect】段的定义

[system_default_sect]
CipherString = 'DEFAULT:!DH'
核心要义是 CipherString = 'DEFAULT:!DH'

问题解决后的效果

$ curl -v --insecure  https://some_web_site
*   Trying 175.21.4.7:443...
* Connected to some_web_site (175.21.4.7) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.0 (IN), TLS handshake, Certificate (11):
* TLSv1.0 (IN), TLS handshake, Server finished (14):
* TLSv1.0 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.0 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.0 (OUT), TLS handshake, Finished (20):
* TLSv1.0 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1 / AES256-SHA
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=some_web_site
*  start date: Jul 27 09:38:07 2022 GMT
*  expire date: Jul 24 09:38:07 2032 GMT
*  issuer: CN=some_web_site
*  SSL certificate verify result: self-signed certificate (18), continuing anyway.
* using HTTP/1.x
> GET / HTTP/1.1
> Host: some_web_site
> User-Agent: curl/7.88.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Thu, 20 Mar 2025 15:15:20 GMT
< Server: Apache
< Last-Modified: Mon, 25 Jul 2011 04:02:56 GMT
< ETag: "18b-4a8dce3dc9c00"
< Accept-Ranges: bytes
< Content-Length: 395
< Content-Type: text/html
< 
<!DOCTYPE htmlPUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN''http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="0;URL=svn/" http-equiv="refresh"/>
<title>VisualSVN Server</title>
</head>
<body>
<h1>Welcome to VisualSVN Server!</h1>
<p><a href="/svn/">Repositories</a></p>
</body>
</html>
* Connection #0 to host some_web_site left intact

受影响的范围

这个问题影响到通过 https:// 对外提供服务的各种老的应用。例如: 通过 https 的方式对外服务的 svn 或者 gitLab 服务。 如果服务器上的 openssl 安全设置配置较低,则会出现这个问题。但是,svn, git 等客户端的报错不一定会出现 “dh key too small” 的字样。可能是笼统的提示 SSL communication 错误。此时,通过 curl 命令,能够比较清晰的显示这个错误内容,如本文最前面所示。

关于这个问题的详细解释请参考:
S3 Connection Error `dh key too small` in Ubuntu 20.04 ($1058) · Snippets · GitLab


http://www.ppmy.cn/embedded/176243.html

相关文章

深度学习与计算机视觉方向

一、数学基础 模块具体内容应用场景示例学习资源推荐线性代数- 矩阵乘法、转置、逆矩阵 - 特征值/特征向量&#xff08;PCA降维&#xff09; - 张量&#xff08;Tensor&#xff09;基础PyTorch 张量操作、模型参数存储《线性代数应该这样学》、3Blue1Brown 视频微积分- 导数与偏…

【免费】2000-2019年各省地方财政城镇土地使用税数据

2000-2019年各省地方财政城镇土地使用税数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政城镇土地使用税 4、范围&#xff1a;31省 5、指标说明&#xff1a;城镇土地使用税是中国地方…

从零开始使用 Ansible 自动化部署 SpringBoot Web 应用(含 MySQL、Redis、Vue、Nginx)

文章目录 1. 安装 Ansible2. 创建 Ansible Playbook3. MySQL 自动化部署4. Redis 自动化部署5. Spring Boot 后端部署6. Vue 前端部署7. Nginx 配置8. 运行 Ansible Playbook9. 验证部署10. 总结 本教程使用 Ansible 实现全栈应用的自动化部署&#xff0c;包括&#xff1a; 后…

MySQL 字符集

目录 字符集的基本概念 常见MySQL字符集 ascii(单字节字符集) latin1(单字节字符集) utf8(多字节字符集) utf8mb4(多字节字符集) MySQL默认字符集 MySQL字符集的层次级别 服务器级别 数据库级别 表级别 列级别 连接字符集 字符集是计算机科学中的一个重要概念&…

STM32八股【3】------RAM和片上FLASH

1、RAM和FLASH构成 1.RAM ┌──────────────────────────┐ │ 栈区 (Stack) │ ← 从RAM顶端向下扩展&#xff08;存储局部变量、函数调用信息&#xff09; │--------------------------│ │ 堆区 (Heap) │ ← …

python爬虫可能遇到的小bug

一、正确代码展示: 由图可知,下面代码是没有任何问题的 二、错误代码展示: 下图和上面图片几乎一摸一样的,但运行出来就是空列表 三、原因分析: headers后面的字典写错了,User-Agent写成了User_Agent 记住,像这种headers字典里面的就是 User-Agent 细心一点 不要写错了 不…

Java爬虫抓取B站视频信息

依赖 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.17.2</version> <!-- 最新版可去官网查看 --></dependency>编码 public static List<VideoDto> parseSearchPage(Str…

深入理解Linux中的SCP命令:使用与原理

在Linux系统中&#xff0c;文件传输是一个常见的操作。无论是将文件从本地传输到远程服务器&#xff0c;还是从远程服务器下载文件到本地&#xff0c;SCP&#xff08;Secure Copy Protocol&#xff09;都是一个非常实用的工具。本文将详细介绍SCP命令的使用方法&#xff0c;并深…