当我将我的 Linux 升级到 22.04 和 openssl3.0.2(php7.4-fpm)时,我的网站出现此错误:
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000126:SSL routines::unexpected eof while reading
答案1
如何启用 Legacy 提供程序?
我在 Ubuntu 22.04 上的 Nextcloud 上看到了类似的问题,最后我通过这个更改避免了这个问题。
--- /etc/ssl/openssl.cnf~original 2022-03-16 08:35:51.000000000 +0000
+++ /etc/ssl/openssl.cnf 2022-05-04 02:37:30.336530711 +0000
@@ -56,6 +56,7 @@
# List of providers to load
[provider_sect]
default = default_sect
+legacy = legacy_sect
# The fips section name should match the section name inside the
# included fipsmodule.cnf.
# fips = fips_sect
@@ -69,7 +70,9 @@
# OpenSSL may not work correctly which could lead to significant system
# problems including inability to remotely access the system.
[default_sect]
-# activate = 1
+activate = 1
+[legacy_sect]
+activate = 1
https://gist.github.com/rdh27785/97210d439a280063bd768006450c435d
答案2
Ubuntu 22.04 将 OpenSSL 升级到 3.0.2 版本,其安全策略更加严格。我猜您正在尝试从过时的服务器下载文件,而 OpenSSL 3.0.2 默认不允许连接到该服务器。
OpenSSL 手册描述了允许尽管存在漏洞但仍进行连接的选项标志:
SSL_OP_IGNORE_UNEXPECTED_EOF
某些 TLS 实现在关闭时不会发送强制性的 close_notify 警报。如果应用程序尝试等待 close_notify 警报,但对等端关闭连接而不发送该警报,则会产生错误。启用此选项后,对等端无需发送 close_notify 警报,并且已关闭的连接将被视为已收到 close_notify 警报。
实际上,该SSL_OP_IGNORE_UNEXPECTED_EOF
选项需要通过 OpenSSL API 进行设置,但您很可能使用某些更高级的函数来操作 HTTPS 连接(如 curl)。我认为最好的办法是找出该函数是否允许设置 OpenSSL 选项。
答案3
好的,我可以验证以下内容:如果您在 Ubuntu 22.04 上安装了 OpenSSL3.0.2 并收到此错误,请验证您使用的 PHP 版本。PHP8.0 及更低版本与 OpenSSL3.0.2 不兼容。您需要升级到 PHP8.1 或更高版本。我在 Ubuntu22.04 上运行 zabbix 服务器,并且在我的许多服务器上都收到此错误,但在更新到 PHP8.1 后,所有服务器都上线且没有错误。
https://github.com/php/php-src/issues/8369#issuecomment-1126935451 PHP 8.0 不支持 OpenSSL 3.0,因此不适用。
答案4
我遇到了类似的问题,并通过安装旧的 libssl 包版本(libssl1.1_1.1.1-1ubuntu2.1~18.04.20_amd64.deb)并删除 ubuntu 22.04 上的默认 libssl 版本(libssl.so.3)解决了该问题,我按照以下步骤操作:
- 获得http://us.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1-1ubuntu2.1~18.04.20_amd64.deb
- sudo dpkg -i libssl1.1_1.1.1-1ubuntu2.1~18.04.20_amd64.deb
- sudo rm /usr/lib/x86_64-linux-gnu/libssl.so.3
- sudo ldconfig