首先,我知道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 请求再次工作?
这是我根据请求使用的当前卷曲选项...
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
httpd.conf
这里是来自...的 SSL/TLS 相关选项
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 版本和密码。
一个有用的错误消息本来是有帮助的,但本质上这归结为 curl 没有协商一个有限的(但可用的)密码,因此在握手期间失败。我不得不手动强制 curl 使用 TLS1.2,以及服务器限制的特定密码。这是我添加到 curlopt 列表中的内容...
没有更多的错误。希望这能帮助别人避免我浪费在这上面的 2 天。