php使用curl库进行ssl双向认证

361次阅读
没有评论

共计 1924 个字符,预计需要花费 5 分钟才能阅读完成。

提醒:本文最后更新于2021-05-19 22:40,文中所关联的信息可能已发生改变,请知悉!

请求基础方法

private function request($url, $data = [], $method = 'get', $options = [], $returnArray = true) {
        $curl = curl_init(); // 启动一个CURL会话

//        is_array($data) && $data = http_build_query($data);
        $method = strtoupper($method);
        if ($method == 'GET') {
            is_array($data) && $data = http_build_query($data);
            $url .= stripos($url, '?') !== false ? '&' : '?';
            $url .= $data;
        } else {
            curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
        }

        unset($options[CURLOPT_URL], $options[CURLOPT_POST], $options[CURLOPT_POSTFIELDS]); //防止错误覆盖导致相关问题

        $_options = [
            CURLOPT_URL => $url,// 要访问的地址
            CURLOPT_SSL_VERIFYPEER => 0,// 对认证证书来源的检查
            CURLOPT_SSL_VERIFYHOST => 0,// 从证书中检查SSL加密算法是否存在
            CURLOPT_FOLLOWLOCATION => 1,// 使用自动跳转
//            CURLOPT_FOLLOWLOCATION => 0,// 使用自动跳转
            CURLOPT_AUTOREFERER => 1,// 自动设置Referer
            CURLOPT_TIMEOUT => 10,// 设置超时限制防止死循环
            CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',// 模拟用户使用的浏览器
            CURLOPT_HEADER => 0, //不输出响应头
            CURLOPT_CUSTOMREQUEST => $method, //请求方式
            CURLOPT_RETURNTRANSFER => 1, //获取的信息以文件流的形式返回
        ];

        $options = ($_options + $options);

        curl_setopt_array($curl, $options);

        $return = curl_exec($curl); // 执行操作
        $resinfo = curl_getinfo($curl);
        //关闭URL请求
        curl_close($curl);

        if ($resinfo[http_code] != 200) {
            var_dump($data);
            var_dump($resinfo);
            var_export($return);
            exit;
//            return $return;
        }

        if (true === $returnArray) {
            $return = json_decode($return, true);
        }

        return $return;
    }

调用时

$options = [
                CURLOPT_HTTPHEADER => $header,
                CURLOPT_SSLCERTTYPE => 'PEM', // PHP的 CURL 只支持 PEM 方式
                CURLOPT_SSLCERT => 'cert.pem文件路径',
                CURLOPT_SSLCERTPASSWD => '证书密码',
                CURLOPT_SSLKEYTYPE => 'PEM', // PHP的 CURL 只支持 PEM 方式
                CURLOPT_SSLKEY => 'private.pem 文件路径',
            ];

$this->request('url','json字符串', 'POST', $options);

由于php的curl只支持pem格式、der、eng格式,而之前生成的是p12的格式,所以需要转换一下 p12 pfx 证书 转换命令

PKCS#12 到 PEM 的转换
openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem
验证
openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
pfx 到 PEM 的转换
openssl pkcs12 -nocerts -nodes -in cert.pfx -out private.pem
验证
openssl pkcs12 -clcerts -nokeys -in cert.pfx -out cert.pem

正文完
 0
Eric chan
版权声明:本站原创文章,由 Eric chan 于2020-11-25发表,共计1924字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。