我正在尝试通过https连接到可用的API,并且还通过证书实现客户端身份验证。
我找不到使用为服务器提供的自定义证书和签名与php连接的方法。
以下是我用来连接到curl的API的代码:
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_CAINFO, getcwd() . 'server-custom-cert.crt');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
这些设置没有给出API的任何答案(我也尝试将服务器自定义证书转换为pem格式而没有任何成功),而当我使用这些设置而没有对同伴或主机进行任何验证时,我可以通常使用API:
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
当我使用以下方式查看有关会话的信息时:
$info = curl_getinfo($curl);
echo '<pre>' . print_r($info, true) . '</pre>';
我明白了:
Array
(
[url] => https://api.example.com
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => 0
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 0
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[certinfo] => Array
(
)
[primary_ip] =>
[primary_port] => 0
[local_ip] =>
[local_port] => 0
[redirect_url] =>
)
'httpStatusCode'为空。
我在这里缺少什么?