CURLOPT_SSL_VERIFYHOST返回SSL证书问题:当Lets Encrypt颁发证书时,证书已过期.<



初始问题-忽略并滚动到更新部分

我正在执行cURL到远程URL。当我按照建议将CURLOPT_SSL_VERIFYHOST的第二个参数设置为2时,它返回SSL certificate problem: certificate has expired

然而,很明显,我的远程域一个有效的证书。

问题似乎消失了,如果我执行cURL直接到https://www.sub.domain.com/,并出现当我执行cURL到文件夹/参数地址,我需要从那里获得数据(即https://www.sub.domain.com/index.php?param=one)

然而,我也用https://whatsmychaincert.com/测试了这个URL,当然,证书链是有效的

这是我的代码:

$url = 'https://www.sub.domain.com/folder/index.php';
$ch = curl_init( $url . '?param=test' );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 2 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
$content  = @curl_exec( $ch );
if( curl_errno( $ch ) ) {
$content = curl_error( $ch );
}
$code = curl_getinfo( $ch, CURLINFO_RESPONSE_CODE );
curl_close( $ch );
error_log( print_r( $content, true ), 0 );

日志在本例中显示为SSL certificate problem: certificate has expired。如果$url = 'https://www.sub.domain.com/folder/index.php';$url = 'www.sub.domain.com';,则不会抛出该错误。但这毫无意义。链是完整的,只要sub.domain.com有一个有效的证书,就不需要(而且据我所知是不可能的)为https://www.sub.domain.com/folder/index.php生成证书。

嫌疑犯让加密成为问题原因这个问题发生在我尝试过的所有域名,除非那些使用CloudFlare或亚马逊颁发的证书。其他问题发生的地方,都使用Lets Encrypt证书。有效的、未过期的证书,但在这种情况下,颁发机构不是CF或Amazon,而是Lets Encrypt。非常容易复制,只需使用以下代码:

$ch = curl_init();
// set url 
curl_setopt($ch, CURLOPT_URL, "https://example.com/");
//return the transfer as a string 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$errorFile = dirname(__FILE__) . '/curl_error.txt';
$out       = fopen($errorFile, "w");
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $out);
// $output contains the output string 
$output = curl_exec($ch);
curl_close($ch);
fclose($out);

在LE证书上,您将获得SSL certificate problem: certificate has expired在(例如)netflix.com或类似的Amazon/CF颁发的证书上,您将不会得到任何错误。

也发生在letsencrypt.org域名上!

让我们加密有问题。任何其他发行者不存在此问题。

问题是本地证书过期。

在我的例子中,我使用了MAMP。MAMP似乎没有更新证书,您需要手动进行更新。由于LE的主证书于2021年9月下旬到期,而MAMP没有更新它- cURL当然失败了。

最简单的方法是安装从他们的网站上新下载的MAMP的新版本,因为当MAMP(应用程序)执行更新时,他们无法这样做。

最新更新