问题描述
我必须调用需要客户端证书身份验证的api。 我在邮递员中使用客户端证书测试了此api,并且它运行良好。 现在我想用PHP curl做到这一点。 我尝试了下面的代码,但它给了我以下错误。
$url = 'https://someurl';
$json = 'somejson';
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_VERBOSE,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,CURLOPT_SSL_VERIFYHOST,CURLOPT_SSLCERT,__DIR__."/certificate.pem");
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,__DIR__."/privatekey.key");
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
curl_setopt($ch,CURLOPT_POSTFIELDS,$json);
$responseData = curl_exec($ch);
if(curl_errno($ch)) {
echo curl_error($ch);
}
curl_close($ch);
解决方法
该错误消息包含您所需的所有线索: HTTP_1_1_REQUIRED
HTTP / 2不支持TLS客户端证书,因此您需要通过明确要求使用HTTP / 1.1来确保curl请求已完成。默认情况下,curl将在HTTPS URL上升级到HTTP / 2。
将CURLOPT_HTTP_VERSION
设置为CURL_HTTP_VERSION_1_1
。