我尝试使用正确的 APP_ID、APP_SECRET 等发送 curl 请求到
https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI
我需要从中获取 access_token,但获取 FALSE 并 curl_error()
打印下一条消息:
60: SSL certificate problem: self signed certificate in certificate chain
我的代码是:
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, $url);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
if ( ! $output) {
print curl_errno($ch) .': '. curl_error($ch);
}
// close curl resource to free up system resources
curl_close($ch);
return $output;
当我手动移动到上面的链接时,我得到了 access_token。为什么它不适用于 curl?请帮忙。
.crt
扩展名的证书?但我不知道如何得到他
不应接受建议禁用 CURLOPT_SSL_VERIFYPEER
的答案。问题是“为什么它不适用于 cURL”,正如 Martijn Hols 正确指出的那样,这是危险的。
该错误可能是由于没有最新的 CA 根证书包引起的。这通常是一个带有一堆加密签名的文本文件,curl 使用它来验证主机的 SSL 证书。
您需要确保您的 PHP 安装具有这些文件之一,并且它是最新的(否则在此处下载一个:http://curl.haxx.se/docs/caextract.html)。
curl.cainfo = <absolute_path_to> cacert.pem
如果您在运行时设置它,请使用(其中 $ch = curl_init();
):
curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
这种解决方法很危险,不推荐:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
禁用 SSL 对等验证不是一个好主意。这样做可能会将您的请求暴露给 MITM 攻击者。
事实上,您只需要一个最新的 CA 根证书包。安装一个更新的很简单:
从 cURL 网站下载最新的 cacert.pem 文件并在 php.ini 文件中设置它的路径,例如在 Windows 上:curl.cainfo=c:\php\cacert.pem
而已!
保持安全。
php.ini
文件,您也可以在代码中设置此选项:curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
curl_init()
返回的 curl 资源处理程序。
如果 SSL 证书未正确安装在您的系统中,您可能会收到以下错误:
cURL 错误 60:SSL 证书问题:无法获取本地颁发者证书。
您可以通过以下方式解决此问题:
从 https://curl.haxx.se/ca/cacert.pem 下载包含更新的证书列表的文件
将下载的 cacert.pem
文件移动到系统中的某个安全位置
更新您的 php.ini
文件并配置该文件的路径:
openssl.cafile="C:/dev/ssl/mywebsite.local.crt"
重要提示:这个问题让我发疯了几天,我无法弄清楚我的 curl 和 openssl 安装发生了什么。我终于发现是我的中间证书(在我的例子中是 GoDaddy)已经过时了。我回到我的 Godaddy SSL 管理面板,下载了新的中间证书,问题就消失了。
我敢肯定这对你们中的一些人来说是个问题。
显然,由于安全问题,GoDaddy 在某个时候更改了他们的中间证书,因为他们现在显示以下警告:
“请务必使用下载包中包含的新 SHA-2 中间证书。”
希望这对你们中的一些人有所帮助,因为我疯了,这解决了我所有服务器上的问题。
为了添加更具体的答案,我在使用 PHP HTTP 请求包 Guzzle v7 时遇到了这个问题。 Guzzle 允许您像这样绕过它:
use GuzzleHttp\Client;
$this->client = new Client([
'verify' => false,
]);
原始来源评论:https://github.com/guzzle/guzzle/issues/1490#issuecomment-375667460
错误:SSL 证书问题:证书链中的自签名证书
Solution:
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
不定期副业成功案例分享