通常情况下,在部署 https 的时候,是基于 ssl 单向认证的,也就是说只要客户端认证服务器,而服务器不需要认证客户端。
但在一些安全性较高的场景,通常会要求进行客户端认证。从而实现 ssl 的双向认证。
准备工作
- ca 证书
- 客户端证书
代码实例
代码中使用 stream_context_create()
函数,创建创建 资源流上下文
。具体参数可参考上下文(Context)选项和参数 https://www.php.net/manual/zh/context.php
。
/**
* https 双向验证接口
* @param string $url 请求链接
* @param mixed $data body 参数
* @param array $header 附加header参数
* @param string $reqType 请求类型
* @return false|string
*/
function SendHttps($url,$data,$header=['Content-Type:application/json;charset=utf-8'],$reqType='POST'){
$opts = [
'http' => [
'method' => $reqType,
'header' => $header,
'content' => $data,
],
'ssl' => [
"verify_peer" => true,
"verify_peer_name" => false,// 忽略客户端证书验证
'cafile'=>'ca.crt', // 根证书
'allow_self_signed'=>true, // 是否允许自签名证书
'local_cert'=>'client.crt', // 客户端证书
'local_pk'=>'client.key', // 客户端私钥
]
];
$opts = stream_context_create($opts);
return @file_get_contents(trim($url), false, $opts);
}