我正在将运行 Debian 10 的服务器迁移到运行 Debian 12(和 6.x 内核)的服务器,最后一个似乎不起作用的是 TLS 1.0,我一直在试图弄清楚它。
我知道更改了SECLEVEL
和 ,MinProtocol
如下所述: https: //stackoverflow.com/a/61568390/6110631,但由于某种原因,这不起作用。
在工作系统上,我有:
[system_default_sect]
MinProtocol = TLSv1.0
CipherString = ALL:@SECLEVEL=1
我尝试在新系统上以相同的方式添加此内容,但 TLS 1.0 似乎仍然不起作用。在 Apache 服务器(取决于应用程序)中,我可以看到:
AH02039: Certificate Verification: Error (68): CA signature digest algorithm too weak
我有点预料到了这一点,因为我认为默认情况下 TLS 1.0 会被禁用,所以我进一步调整了配置。我所做的任何更改似乎都不起作用,并且通过端口镜像从客户端角度进行数据包捕获,我可以看到所有 TLS 协商都彻底失败(在 Client Hello 之后,Alert (Level: Fatal, Description: Protocol Version)
.
用 进行探测openssl s_client
,似乎 TLS 1.0 的某些东西完全被破坏了。
在现有的 Debian 10 服务器上,我得到:
# openssl version
OpenSSL 1.1.1n 15 Mar 2022
# openssl s_client -connect OLDHOST -tls1
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = OLDHOST
verify return:1
---
Certificate chain
0 s:CN = OLDHOST
i:C = US, O = Let's Encrypt, CN = R3
1 s:C = US, O = Let's Encrypt, CN = R3
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
然而,在新的 Debian 12 服务器上,我得到:
# openssl version
OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)
# openssl s_client -connect NEWHOST -tls1
CONNECTED(00000003)
140101680407744:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error:../ssl/record/rec_layer_s3.c:1544:SSL alert number 80
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 136 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1695085443
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
TLS 1.2 仍然可以正常工作,但我在 TLS 1.0 和 TLS 1.1 中得到了这个。
我尝试过使用DEFAULT:@SECLEVEL=1
,ALL:@SECLEVEL=1
以及 sec level 1、sec level 0、ALL、DEFAULT、LEGACY 等的其他组合。它们似乎都不起作用。我一直在更改之间定期重新启动 Apache 和整个服务器。
我还尝试将其添加到 Apache 配置中,因此我有以下内容:
Protocols h2 http/1.1
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ALL:@SECLEVEL=0
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
其他相关问题/答案,不幸的是没有产生更多的见解:
有几个地方似乎确实暗示,如今,您必须SECLEVEL
从 1 降低到 0 才能使其正常工作,例如对于 SHA1 证书,我已经完成了,但仍然没有雪茄。
OpenSSL 3 中尚未删除TLS 1.0 和 1.1 支持(我确实检查过),因此应该通过正确的配置来支持它。
所有记录的解决方案似乎都不适合我,而且在浪费了一整天的调试时间后,我似乎并没有更接近。还有其他人找到让旧密码工作的解决方案吗?我指定了ALL
0 级和 1 级的密码,但它似乎不服从我的指示,所以这看起来相当奇怪。
我知道这是可能的,而且很可能是配置混乱……确实,就是这样。
将 SECLEVEL 设置为 0 确实是必要的,但我在多个地方都有这个,并且没有在所有地方更新它。
特别是,特定的虚拟主机仍然有
SSLCipherSuite ALL:@SECLEVEL=1
,这与旧的 OpenSSL 版本一起工作得很好,但现在需要是SSLCipherSuite ALL:@SECLEVEL=0
.(我已经在一般的 Apache 配置以及 /etc/ssl/openssl.cf` 中设置了这个,但由于这是在虚拟主机级别设置的,所以它会覆盖它。所有其他虚拟主机碰巧已经处于级别 0 ,我只是碰巧使用一个被覆盖为 1 的虚拟主机进行测试,自然......)
我确实想重申,那些说最新内核、Apache 或 OpenSSL 不支持 TLS 1.0 的人(例如在对此问题的评论中)是错误的,他们确实可以使用正确的配置。这似乎是一个常见的误解。
目前,最终客户端仍然没有连接(TLS 握手失败),所以有些东西仍然关闭,但
openssl s_client
现在可以正常协商,与以前不同,这是进步。完整的解决方案还意识到,默认情况下 certbot 和 acme.sh 现在更喜欢 ECDSA,因此您需要显式请求 RSA 来获取丢失的密码。旧服务器“工作”正常,因为证书正在更新相同类型。