精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
我在公司的笔记本电脑上使用 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 ---
“不安全的旧版重新协商”是一个 SSL 标志,在 Openssl v3+ 中默认处于禁用状态。以前的版本(自 ~2010 年起)启用了此标志。
安全的重新协商
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
要解决此错误,我们需要修改 file/etc/ssl/openssl.cnf
重要信息 对此文件的更改将应用于整个系统。
转到文件末尾,您应该会看到以下几行:
[ssl_sect] system_default = system_default_sect [system_default_sect] CipherString = DEFAULT:@SECLEVEL=2
由于 OpenSSL v3.0.2 中的缺陷,该标志无效。通过运行 command 检查您的 SSL 版本,第一行包含版本。我有UnsafeLegacyServerConnectopenssl version -a
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 =
Options = UnsafeLegacyRenegotiation
Options = UnsafeLegacyServerConnect
https://www.openssl.org/docs/man3.0/man3/SSL_CONF_cmd.html
UnsafeLegacyRenegotiation:允许使用不安全的旧版重新协商。相当于 SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION。
UnsafeLegacyServerConnect:仅允许对 OpenSSL 客户端使用不安全的旧版重新协商。相当于 SSL_OP_LEGACY_SERVER_CONNECT。
使用以下方式测试更改:s_client
echo | openssl s_client -connect ubuntu.com:443
输出现在应包含服务器证书链,指示连接成功。
我仅在使用 TLSv1.2 协议时看到此错误。另一种解决方案是设置允许的最低协议版本。为此,不要添加上面的行,而是添加:Options =
MinProtocol = TLSv1.3
使用上述方法测试更改。s_client
在输出中,您可以识别协议版本,类似于以下内容(密码可能因您连接到的服务器而异):
New, TLSv1.2, Cipher is AES256-GCM-SHA384
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
我的指令中有:将 .pem 文件复制到(所以不是 crt 文件,当然除非它是 pem 格式)(cat server.crt server.key >server.pem
/usr/local/share/ca-certificates/
并执行
sudo update-ca-certificates
这应该会在需要时将证书添加到 wget 命令。
如果需要,您还可以通过 2 种方式将 wget 与证书(至少)本身一起使用:
wget --ca-certificate={file.pem}
或将其添加到~/.wgetrc
ca_certificate={file.pem}