我在公司笔记本电脑上使用 Ubuntu 22.04。在家工作时一切都很好。但是,当我在办公室并使用公司代理工作时,我开始遇到 SSL 问题。
我已获得一个证书文件,并将其导入 Chrome 和 Firefox 浏览器。这样我的浏览器就可以正常运行。但是,curl/wget 以及基本上所有连接到 HTTPS 的其他工具都遇到了问题。
wget 失败示例
root@HOST:~# wget -v --no-check-certificate https://ubuntu.com/server/docs/security-trust-store
--2023-04-07 11:57:11-- https://ubuntu.com/server/docs/security-trust-store
Resolving ubuntu.com (ubuntu.com)... 185.125.190.20, 185.125.190.21, 185.125.190.29, ...
Connecting to ubuntu.com (ubuntu.com)|185.125.190.20|:443... connected.
OpenSSL: error:0A000152:SSL routines::unsafe legacy renegotiation disabled
Unable to establish SSL connection.
我已经通过运行这些命令从 CLI 添加了证书,但无济于事。
cp myorg.crt /usr/local/share/ca-certificates
update-ca-certificates
我还遗漏了什么? 感谢您的帮助。
更多调试信息
root@HOST:/usr/local/share/ca-certificates# openssl s_client -connect ubuntu.com:443 -CApath /etc/ssl/certs/
CONNECTED(00000003)
80BB91E2547F0000:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled:../ssl/statem/extensions.c:879:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 85 bytes and written 319 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID: 6BC5F74F9BD4FD98F598BFE7D0DFF4DF8D90CB2057DF2E3D6F3AB3138E5EE9D2
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1681111673
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: yes
---
答案1
“不安全的旧式重新协商”是一个 SSL 标志,在 Openssl v3+ 中已默认禁用。以前的版本(自 ~2010 年起)已启用此标志。
https://www.openssl.org/docs/man3.0/man3/SSL_get_secure_renegotiation_support.html
确保重新谈判
OpenSSL 始终尝试使用 RFC5746 中描述的安全重新协商。这可以抵御 CVE-2009-3555 和其他地方描述的前缀攻击。
[...]
已修补的 OpenSSL 客户端和未修补的服务器
如果选择SSL_OP_LEGACY_SERVER_CONNECT或者SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION已设置,则已打补丁的 OpenSSL 客户端与未打补丁的服务器之间的初始连接和重新协商将成功。如果未设置任何选项,则与未打补丁的服务器的初始连接将失败。
设置选项 SSL_OP_LEGACY_SERVER_CONNECT 有安全隐患;愿意连接到未实现 RFC 5746 安全重新协商的服务器的客户端容易受到 CVE-2009-3555 等攻击。
希望确保能够连接到未修补服务器的 OpenSSL 客户端应用程序应始终设置 SSL_OP_LEGACY_SERVER_CONNECT
为了解决错误,我们需要修改/etc/ssl/openssl.cnf
文件
重要的对此文件的更改将应用到整个系统。
转到文件末尾,您应该看到以下几行:
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = DEFAULT:@SECLEVEL=2
由于一个OpenSSL v3.0.2 中的缺陷,该UnsafeLegacyServerConnect
标志没有影响。通过运行openssl version -a
命令检查您的 SSL 版本,第一行包含版本。我有
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
built on: Wed May 24 17:12:55 2023 UTC
platform: debian-amd64
根据您的版本,在该CipherString =
行后立即添加以下行(中间没有空行):
对于 SSL v3.0.2 及更早版本
Options = UnsafeLegacyRenegotiation
对于 SSL v3.0.4+
Options = UnsafeLegacyServerConnect
https://www.openssl.org/docs/man3.0/man3/SSL_CONF_cmd.html
不安全的遗留重新协商:允许使用不安全的旧式重新协商。相当于 SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION。
不安全的旧版服务器连接:仅允许 OpenSSL 客户端使用不安全的旧式重新协商。相当于 SSL_OP_LEGACY_SERVER_CONNECT。
使用以下命令测试更改s_client
:
echo | openssl s_client -connect ubuntu.com:443
输出现在应该包含服务器证书链,表明连接成功。
替代方案:禁止使用 TLSv1.2
我只在使用 TLSv1.2 协议时才会看到此错误。另一种解决方案是设置允许的最低协议版本。为此,请Options =
添加以下行,而不是添加上面的行:
MinProtocol = TLSv1.3
使用上述方法测试更改s_client
。
在输出中,您可以识别协议版本,类似于以下内容(根据您连接的服务器,密码可能有所不同):
TLSv1.2
New, TLSv1.2, Cipher is AES256-GCM-SHA384
TLSv1.3
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
答案2
我的说明中有:将 .pem 文件复制到(所以不是 crt 文件,除非它是 pem 格式)(cat server.crt server.key >server.pem
/usr/local/share/ca-certificates/
并做
sudo update-ca-certificates
并且在需要时将证书添加到 wget 命令中。
如果需要,您还可以通过两种方式将 wget 与证书本身(至少)一起使用:
wget --ca-certificate={file.pem}
或将其添加到~/.wgetrc
ca_certificate={file.pem}
(注意 _;它不是拼写错误)