使用PHP和curl刮除客户端证书请求

时间:2019-05-16 21:14:55

标签: php ssl curl

我正在尝试下载需要通过客户端数字证书进行身份验证的文件,我已经拥有该证书,但是不知道如何在curl中进行配置。

$useragent = '...';
$post = array( ... );
$certPass = '123456';
$certPath = _DIR_PATH.'cert/';
$certPfx = $certPath.'certificate.pfx';
$cert = $certPath.'certificate.pem';

$url = 'https://www.url.com/path/to/access';

$ch = curl_init( $url );
$options = array(
          CURLOPT_FAILONERROR => true,
                        CURLOPT_RETURNTRANSFER => true,
                        CURLOPT_AUTOREFERER => true,
                        CURLOPT_HEADER => true,
                        CURLOPT_NOBODY => true,
                        CURLOPT_CAINFO => $cert,
                        CURLOPT_CAPATH => $certPath,
                        CURLOPT_SSH_PRIVATE_KEYFILE => $certPfx,
                        CURLOPT_SSLCERT => $cert,
                        CURLOPT_SSLCERTPASSWD => $certPass,
                        CURLOPT_SSL_VERIFYHOST => 2,
                        CURLOPT_SSL_VERIFYPEER => true,
                        CURLOPT_POST => true,
                        CURLOPT_POSTFIELDS => $post,
                        CURLOPT_USERAGENT => $useragent,
                        CURLOPT_COOKIE => 'ASP.NET_SessionId='.$cookie
                    );
curl_setopt_array( $ch, $options );
$resp = curl_exec($ch);

$ch_errno = curl_errno($ch);
$ch_erro = curl_error($ch);

curl_close($ch);

我总是收到以下消息:SSL证书问题:无法获取本地发行者证书。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

PHP cURL:修复了“ SSL证书问题:无法获取本地发行者证书”错误。

如果您使用PHP的cURL函数连接到HTTPS URL,则可能会遇到以下错误:

SSL证书问题:无法获取本地发行者证书。 (cURL错误代码60)

这是常见的错误,每当您尝试使用PHP的cURL函数连接到HTTPS网站时都会发生。本质上,您的cURL客户端尚未配置为连接到启用SSL的网站。

快速修复。

CURLOPT_SSL_VERIFYHOST: This option tells cURL that it must verify the host name in the server cert.
CURLOPT_SSL_VERIFYPEER: This option tells cURL to verify the authenticity of the SSL cert on the server.

例如。

$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));
}

答案 1 :(得分:0)

您需要使用当前(有效)证书对php.ini进行配置。

curl.cainfo    = "/etc/php7.2/cacert.pem"
openssl.cafile = "/etc/php7.2/cacert.pem"

查看https://curl.haxx.se/docs/caextract.html以下载当前版本。之后,重新启动您的Web服务器。

不要不要类似

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

这将起作用,但是会禁用任何验证和安全性。