php - 客户端证书身份验证出现卷曲错误
问题描述
我必须调用一个需要客户端证书身份验证的 api。我在邮递员中通过客户认证测试了这个 api,并且它工作得很好。现在我想用 php curl 来做。我尝试了下面的代码,但它给了我以下错误。
HTTP/2 流 0 未完全关闭:HTTP_1_1_REQUIRED(错误 13)
$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, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($ch, 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 客户端证书,因此您需要通过明确要求确保您的 curl 请求是使用 HTTP/1.1 完成的。curl 将默认升级到 HTTPS URL 上的 HTTP/2,否则。
设置CURLOPT_HTTP_VERSION
为CURL_HTTP_VERSION_1_1
。
推荐阅读
- c# - 困惑如何在有死胡同的无向图中找到循环
- haskell - 如何在 Haskell 中将 getZonedTime 的输出更改为格式为“年-月-日”的字符串?
- kubernetes - Drupal AKS 部署损坏的图像检索
- python - Ubuntu:Python3.8 - Apache2 - WSGI - Numpy 模块未找到错误
- vue.js - 不使用突变直接改变 Vuex 状态
- javascript - Dart/Flutter 箭头函数表达混乱
- reactjs - TypeError:无法读取未定义的属性“过滤器”。有什么建议吗?
- oracle - ODP.NET 连接池和 Azure 混合连接到本地数据库
- r - R Ggplot2 Dot Plot - 是否可以根据不同变量的频率重新排序轴类别/值?
- json - 有什么方法可以在 Prismic.io 自定义类型中添加键值对对象?