curl: (35) 错误:0A000152:SSL例程::不安全的遗留重新协商已禁用

21

curlwget这样的命令会出现以下错误:curl: (35) error:0A000152:SSL routines::unsafe legacy renegotiation disabled。我正在使用WSL2 Ubuntu,并且在公司防火墙下。我已经将我的受信任的根CA证书导出到WSL并更新了证书。然而,当下载Jenkins、Terraform等工具时仍然遇到问题。例如,在尝试获取Jenkins时。

curl -fsSL http://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee   /usr/share/keyrings/jen
kins-keyring.asc > /dev/null
curl: (35) error:0A000152:SSL routines::unsafe legacy renegotiation disabled

我正在使用企业 VPN。如果没有 VPN,命令可以正常工作,但是在企业网络上使用 VPN 时,我会遇到这些错误。如果我与防火墙团队进行 SSL 绕过,则可以解决问题。不确定还有其他问题。

sudo vim /etc/ssl/openssl.cnf

`#
# OpenSSL example configuration file.
# See doc/man5/config.pod for more info.
#
# This is mostly being used for generation of certificate requests,
# but may be used for auto loading of providers

# Note that you can include other files from the main configuration
# file using the .include directive.
#.include filename

# This definition stops the following lines choking if HOME isn't
# defined.
HOME                    = .

 # Use this in order to automatically load providers.
openssl_conf = openssl_init

# Comment out the next line to ignore configuration errors
config_diagnostics = 1

# Extra OBJECT IDENTIFIER info:
# oid_file       = $ENV::HOME/.oid
oid_section = new_oids

# To use this configuration file with the "-extfile" option of the
# "openssl x509" utility, name here the section containing the
# X.509v3 extensions to use:
# extensions            =
# (Alternatively, use a configuration file that has only
# X.509v3 extensions in its main [= default] section.)

[ new_oids ]
# We can add new OIDs in here for use by 'ca', 'req' and 'ts'.
"/etc/ssl/openssl.cnf" 397L, 12419B            `

1
当我使用_OpenSSL 3.0.2 2022年3月15日(库:OpenSSL 3.0.2 2022年3月15日)_时,我遇到了类似的错误。而且我没有使用任何公司代理。我的朋友使用_OpenSSL 1.1.1f 2020年3月31日_,一切正常。这可能是openSSL版本的问题吗? - Daniel
当我尝试运行命令 curl https://publicinfobanjir.water.gov.my/hujan/data-hujan/?state=PLS&lang=en 时,我遇到了相同的错误信息。我通过将https替换为http来解决这个问题。这个解决方案可能对一些人有帮助。 - Ahwar
2个回答

27

此错误是由于远程服务器不支持RFC5746安全重新协商(或者您的公司防火墙不支持)引起的。在OpenSSL 1.1.1中,设置了标识SSL_OP_LEGACY_SERVER_CONNECT,但在OpenSSL 3中并非如此,参见 迁移指南

TLS连接现在默认需要安全重新协商SSL或TLS连接默认情况下现在需要支持RFC 5746安全重新协商才能成功。需要连接到旧对等方的应用程序将需要明确设置SSL_OP_LEGACY_SERVER_CONNECT。因此, SSL_OP_LEGACY_SERVER_CONNECT 不再作为 SSL_OP_ALL 的一部分设置。

可以通过在您的OpenSSL conf中设置选项UnsafeLegacyServerConnect来再次打开此标志:

UnsafeLegacyServerConnect:仅允许OpenSSL客户端使用不安全的传统重协商。相当于SSL_OP_LEGACY_SERVER_CONNECT。

来源:https://www.openssl.org/docs/man3.0/man3/SSL_CONF_cmd.html

一个包含此设置的最小 OpenSSL 配置:

openssl_conf = openssl_init

[openssl_init]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
Options = UnsafeLegacyServerConnect

您也可以在现有的/etc/ssl/openssl.cnf文件中的[system_default_sect]下添加Options = UnsafeLegacyServerConnect

NB. 在 OpenSSL < 3.0.4 存在一个错误,会忽略UnsafeLegacyServerConnect选项。如果您使用的是<= 3.0.3版本,则可以使用(更不安全的)UnsafeLegacyRenegotiation代替。


3
非常感谢!我在尝试从一个服务器下载时遇到了这个问题,可能是由于一些证书问题(没有使用VPN)。使用选项“--no-check-certificate”运行wget是可以的,但是使用选项“-k”或“--insecure”运行curl却不起作用,直到将上述代码块添加到“/etc/ssl/openssl.cnf”中。但是这样会降低我的系统安全性吗?难道不能只针对特定域名实现这个功能吗? - Sadi
最近更新的openssl 3.0.10-1(debian testing)中,添加此选项现在没有任何区别。也许他们决定完全禁止这种不安全的连接了? - Sadi
1
使用以下命令检查您的 openssl 版本:openssl version :-) - NeilG
刚刚在将PHP从8.1升级到8.2时遇到了问题。非常感谢你! - undefined

10
如果您不想对系统进行永久更改,可以尝试在内存中运行配置,像这样:
OPENSSL_CONF=<(cat /etc/ssl/openssl.cnf ; echo Options = UnsafeLegacyRenegotiation) curl https://something.com/
展开形式如下:
OPENSSL_CONF=<(
   cat /etc/ssl/openssl.cnf
   echo Options = UnsafeLegacyRenegotiation
) curl https://something.com/

让我解释一下它的作用。
这部分将临时设置一个环境变量,供后续命令使用。大多数与SSL库链接的程序都会识别这个变量,并使用指定的配置文件:
OPENSSL_CONF="value" command
顺便说一下,我尝试过使用OPENSSL_CONF_INCLUDE变量,但那个没有起作用。
但是,我没有使用真实的文件,而是使用了这个bash构造<( ... ),它创建了一个临时虚拟文件,其内容是内部命令的输出:
OPENSSL_CONF=<( ... )
内部部分只是打印当前的openssl.cnf文件,然后是所需的配置行:
cat /etc/ssl/openssl.cnf ; echo Options = UnsafeLegacyRenegotiation
总之,我们使用一个添加了所需行的配置来运行curl。
在WSL的Ubuntu中对我有效。

1
我认为这是一个更好的解决方案,只在必要时使用,但不幸的是,在最近更新到openssl 3.0.10-1(debian testing)之后,这个选项现在没有任何区别。看起来他们决定完全禁止这种不安全的连接了? - Sadi
确认它与Ubuntu 22.04兼容。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接