如何解决企业代理背后的 SSL 问题?

如何解决企业代理背后的 SSL 问题?

我在公司笔记本电脑上使用 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}

(注意 _;它不是拼写错误

相关内容