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

mzmfm0qo  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(209)

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

我正在执行指向远程URL的cURL。当我按照建议将CURLOPT_SSL_VERIFYHOST第二个参数设置为2时,它返回SSL certificate problem: certificate has expired
然而,很明显,我的远程域 * 有 * 一个有效的证书。
如果我直接对https://www.sub.domain.com/执行cURL,问题似乎消失了,但当我对需要从中获取数据的文件夹/参数地址(即https://www.sub.domain.com/index.php?param=one)执行cURL时,问题出现了
但是,我也用https://whatsmychaincert.com/测试了该URL,当然,证书链是 valid 的。
这是我的代码:

$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';,那么它不会抛出该错误。但这没有意义。链是完整的,应该没有必要(据我所知,无论如何也不可能)为https://www.sub.domain.com/folder/index.php生成证书,只要sub.domain.com有一个有效的证书。

更新

怀疑Lets Encrypt是问题的原因这个问题发生在我尝试的所有域上,除非使用CloudFlare或Amazon颁发的证书。其他发生问题的域,都使用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域名也是如此!

Lets Encrypt出现问题。任何其他颁发者都不会出现此问题。

pcww981p

pcww981p1#

问题是过期的 * 本地 * 证书。
在我的例子中,我使用的是MAMP。MAMP似乎并不更新证书,你需要手动更新。由于LE的主证书于2021年9月底到期,MAMP并没有更新它-cURL当然失败了。
最简单的是 * 安装一个新版本的MAMP* 新鲜下载从他们的网站,因为他们无法做到这一点时,MAMP(应用程序)执行更新。

相关问题