如果你使用PHP的cURL函数来请求一个HTTPS URL,你可能会遇到以下错误:
SSL证书问题:无法获得本地颁发者证书。(cURL error code 60)
当您试图使用PHP的cURL函数请求到HTTPS网站时,这是一个常见的错误。实际上,您的cURL客户端还没有配置启用ssl去请求URL网站。
快速修复。
如果您不关心安全性,并且正在寻找快速解决方案,那么您可以简单地禁用以下cURL选项:
CURLOPT\u SSL\u VERIFYHOST:这个选项告诉cURL它必须验证服务器证书中的主机名。
CURLOPT\u SSL\u VERIFYPEER:这个选项告诉cURL验证服务器上SSL证书的真实性。
禁用这两个选项将禁用SSL验证。
要禁用这两个选项,可以使用curl\u setopt函数,如下所示:
//The URL we are connecting to.
$url = 'https://google.com';
//Initiate cURL.
$ch = curl_init($url);
//Disable CURLOPT_SSL_VERIFYHOST and CURLOPT_SSL_VERIFYPEER by
//setting them to false.
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//Execute the request.
curl_exec($ch);
//Check for errors.
if(curl_errno($ch)){
throw new Exception(curl_error($ch));
上面的代码本质上告诉cURL,我们不关心服务器是否具有有效的SSL证书。我们无论如何都想连接到它。
这个方法的问题是它不安全,而且会让你受到中间人攻击。简单地说,这意味着攻击者可能会截获您在cURL请求中发送的数据。
在PHP的cURL函数中使用cert
要将证书与PHP的cURL函数一起使用,可以从官方网站下载cacert.pem公司证书, 一旦你下载了cacert.pem公司文件,您应该将其移动到对您和您的设置最有意义的目录。在Windows上,我把包移到了C:\wamp\cacert.pem公司
然后,您可以使用cURL\u setopt函数简单地告诉cURL您的证书包位于何处:
//Tell cURL where our certificate bundle is located.
$certificate = "C:\wamp\cacert.pem";
curl_setopt($ch, CURLOPT_CAINFO, $certificate);
curl_setopt($ch, CURLOPT_CAPATH, $certificate);
这允许我们向服务器发出安全请求,并防止任何中间人攻击。
将证书添加到php.ini文件文件。
如果您不喜欢在PHP代码中指定证书包的位置,那么可以将其路径信息添加到php.ini文件:
curl.cainfo="C:\wamp\cacert.pem"
openssl.cafile="C:\wamp\cacert.pem"
一旦你把上面的行添加到你的php.ini文件文件中,请确保重新启动web服务器/PHP进程,以便更改生效。