在与原始请求相同的服务器上出现 SSL 错误“读取时出现意外的 eof”

在与原始请求相同的服务器上出现 SSL 错误“读取时出现意外的 eof”

首先,我知道该SSL Library Error: error:0A000126:SSL routines::unexpected eof while reading错误源于 OpenSSL 3 重新引入了一项防止截断攻击的功能。

我的问题是,为什么当我从报告错误的同一服务器通过 PHP 进行 curl 调用时会看到此错误?

我正在运行 Rocky Linux 9.1、PHP 8.0.27,并拥有 OpenSSL 3.0.1(最新版本可用)。由于缺少该版本尚未提供的库,我无法通过 dnf 模块升级到 PHP8.1。

由于我正在从服务器向自身发出 curl 调用,因此有人会认为,如果它足够新,能够识别错误,它就会正确发出请求。“错误”报告表明,这通常是由不合规的服务器发出的请求,那么我应该在系统中的哪里查找以更正请求格式,以便使自己符合要求并再次使 curl 请求正常工作?

以下是我在请求中使用的当前 curl 选项...

CURLOPT_HTTPGET => TRUE,
CURLOPT_HEADER => FALSE,
CURLOPT_FAILONERROR => FALSE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 60,
CURLOPT_SSL_CIPHER_LIST => NULL,
CURLOPT_CAINFO => '/path/to/ca-certs.pem',
CURLOPT_SSL_VERIFYPEER => TRUE,
CURLOPT_SSL_VERIFYHOST => 2

以下是 SSL/TLS 相关选项httpd.conf...

SSLProtocol -all +TLSv1.3 +TLSv1.2
SSLProxyProtocol -all +TLSv1.3 +TLSv1.2

SSLCipherSuite    TLSv1.3   TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
SSLCipherSuite    SSL       AES256+EECDH:AES256+EDH:!SHA1:!SHA256:!SHA384

SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off

SSLOpenSSLConfCmd Curves X25519:secp521r1:prime256v1

谢谢你尽你所能的帮助!


编辑:下面的解决方案,tldr;必须在客户端请求中指定 TLS 版本和密码。

答案1

有用的错误消息会很有帮助,但本质上这归结为 curl 没有协商有限(但可用)的密码之一,因此在握手期间失败。我不得不手动强制 curl 使用 TLS1.2 和服务器限制的特定密码。以下是我添加到 curlopt 列表中的内容...

CURLOPT_SSLVERSION = CURL_SSLVERSION_TLSv1_2,
CURLOPT_SSL_CIPHER_LIST = 'AES256+EECDH:AES256+EDH' 

不再有错误。希望这可以帮助人们避免像我一样浪费两天时间。

相关内容