【问题标题】:PHP CURL error: SSL certificate problem: unable to get local issuer certificatePHP CURL 错误:SSL 证书问题:无法获取本地颁发者证书
【发布时间】:2026-02-20 04:50:02
【问题描述】:

我查看了 * 上列出的每个解决方案。没有什么能解决这个问题。我遇到的问题只是当我将一个端口(在本例中为 5443)附加到 cURL PHP 代码时。如果我在没有端口的情况下执行 CLI,它就可以工作。在代码中,如果我只做一个直接的 URL https://HOSTNAME/api/test 而不分配端口,它就可以工作。无论哪种方式,我都可以看到 GET 进入。这都是关于认证验证的。服务器上的端口是开放的。

我有一个 GoDaddy G2 证书。我有一个带有 CA 包的新建服务器,我尝试使用根证书,来自

的证书包
"https://curl.haxx.se/docs/caextract.html"

以及其他所有组合。添加端口号时,我总是遇到同样的错误:

“SSL 证书问题:无法获取本地颁发者证书”

$url = "https://HOSTNAME/api/test";
$curl = curl_init();

if ($curl === false)
{
echo "Failure";

} else
{

curl_setopt($curl, CURLOPT_PORT, 5443);
curl_setopt($curl, CURLOPT_HTTPGET, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);


// Turn on SSL certificate verification
curl_setopt($curl, CURLOPT_CAPATH, "/fully_resolved_path/");

// and tried this way too

curl_setopt($curl, CURLOPT_CAPATH, "/fully_resolved_path");

// 试过了

curl_setopt($curl,CURLOPT_CAINFO,"/fully_resolved_path/cacert.pem"); 

//这个其实是默认设置,不再支持1,在这种情况下对最终结果没有影响。

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);

// 当这是 TRUE 时失败! FALSE 时不执行检查

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE);


    $result = curl_exec($curl);

   if ($result === false)
    {
       echo curl_error($curl);

    } else

    {
       echo $result; 
    }

    curl_close($curl);

}

一切都按预期设置并工作,返回一个 JSON 对象。只有当我添加端口号时,它才会窒息。 SSL 证书中的公用名与主机名匹配。如前所述,在我添加端口号之前它可以正常工作。

【问题讨论】:

    标签: php ssl curl libcurl


    【解决方案1】:

    我查看了 * 上列出的每个解决方案。没有什么能解决这个问题。

    哇。但不幸的是,这个“信息”是无用的,因为它没有说明你实际尝试过的任何内容。

    我遇到的问题只是当我将一个端口(在本例中为 5443)附加到 cURL PHP 代码时。如果我在没有端口的情况下执行 CLI,它可以工作。

    这是因为没有端口,它将使用端口 443。由于您明确使用端口 5443,因此您连接到具有不同设置的不同服务器,并且与端口 443 上的证书相比,该服务器提供不同的证书。只需尝试将端口明确设置为443,你会发现它有效。

    很可能端口 5443 上的服务器提供了一些自签名证书、一些未知 CA 颁发的证书或缺少必要的链证书(即配置错误)。这些是通常与此类错误相关的原因,您应该已经看到这一点并且也看到了解决方案,因为您“查看了 * 上列出的每个解决方案”。请记住,要修复,您需要查看端口 5443 的服务器,而不是端口 443 的默认服务器。

    【讨论】:

    • 证书中的公用名字段是验证过程的一部分。端口不应该与它有任何关系。您不会在证书上看到像 example.com:8443 这样的通用名称。它将简单地说明 example.com。我没有使用自签名,而是从 Godaddy CA 发出的。我放弃并简单地使用了代理。 . .这是完美无瑕的工作。 . .我拥有并控制硬件,所以我确切地知道证书到位。仅在设置端口时失败。关闭验证,SSL 仍然有效,只是警告被抑制。不再重要。问题仍然存在。
    • @MOKANA:端口本身与验证相同证书无关。但是不同的端口意味着您连接到不同的服务器或同一台服务器但配置不同,因此最终可能会使用不同的证书进行验证。