我正在尝试通过 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' 为空。
我在这里想念什么?