初始问题-忽略并滚动到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出现问题。任何其他颁发者都不会出现此问题。
1条答案
按热度按时间pcww981p1#
问题是过期的 * 本地 * 证书。
在我的例子中,我使用的是MAMP。MAMP似乎并不更新证书,你需要手动更新。由于LE的主证书于2021年9月底到期,MAMP并没有更新它-cURL当然失败了。
最简单的是 * 安装一个新版本的MAMP* 新鲜下载从他们的网站,因为他们无法做到这一点时,MAMP(应用程序)执行更新。