我被要求使用 php 5.2.6 实现 OIDC,但在 fetchURL 期间遇到“连接中未知的 SSL 协议错误”:
curl_setopt($ch, CURLOPT_URL $url);
if (isset($this->certPath)){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, $this->certPath);
}
else{
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
if (curl_exec($ch) === false{
throw new OpenIDConnectioClientException('Curl error: ' . curl_error($ch));
}
已搜索并尝试以下操作,但没有帮助”
目前,只有以下操作可以得到目标服务的响应:
我希望php使用curl和CA文件应该没问题(就像我在linuxcurl中所做的那样),有谁知道在不同系统中产生不同结果的原因以及如何解决问题?非常感谢!
版本:
TL;DR:您可能需要升级旧的软件堆栈才能解决问题。
- php 5.2.6 与curl 7.16.0
这是 16 年前(2008 年)发布的 PHP 版本,多年来一直不受支持。包含的 curl 7.16.0 甚至更旧 - 2006 年发布。可能链接到此 PHP 的 openssl 版本是类似的旧版本。
OpenSSL 1.0.1 是第一个支持 TLS1.2 的版本,于 2012 年发布(但现在也已经结束了很长时间),即在 PHP 版本之后很多年,因此不太可能包含在内,但任何低于 TLS 的 SSL/TLS 版本1.2 目前已被认为已过时,因此您访问的服务器可能不会接受它。 Linux 下的curl 使用 OpenSSL 1.1.1,它支持 TLS 1.2 和 TLS 1.3 - 但即使 OpenSSL 1.1.1 现在也已停产。
除了无法在如此旧的软件堆栈中使用现代 TLS 之外,出于安全原因使用如此旧的版本也是严重疏忽的。此版本包含几个关键问题,包括未经身份验证的代码执行。