文档章节

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

slagga
 slagga
发布于 2016/10/27 18:31
字数 473
阅读 369
收藏 0

官方文档:

http://www.php.net/manual/zh/function.curl-setopt.php#10692

官方举例:

<?php
curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
curl_setopt($ch, CURLOPT_CAINFO,  getcwd().'/cert/ca.crt');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/cert/mycert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'password');
?>

由于业务原因,后台登陆需要使用SSL双向认证,即web服务器有证书,浏览器客户端也需要安装证书

然后这样的话,php接口文件就需要走443端口来访问了

直接附上代码:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

/**

 * @name ssl Curl Post数据

 * @param string $url 接收数据的api

 * @param string $vars 提交的数据

 * @param int $second 要求程序必须在$second秒内完成,负责到$second秒后放到后台执行

 * @return string or boolean 成功且对方有返回值则返回

 */

function curl_post_ssl($url, $vars, $second=30,$aHeader=array())

{

                $ch = curl_init();

                //curl_setopt($ch,CURLOPT_VERBOSE,'1');

                curl_setopt($ch,CURLOPT_TIMEOUT,$second);

                curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);

                curl_setopt($ch,CURLOPT_URL,$url);

                curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

                curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

                curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');

                curl_setopt($ch,CURLOPT_SSLCERT,'/data/cert/php.pem');

                curl_setopt($ch,CURLOPT_SSLCERTPASSWD,'1234');

                curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');

                curl_setopt($ch,CURLOPT_SSLKEY,'/data/cert/php_private.pem');

 

                if( count($aHeader) >= 1 ){

                        curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);

                }

 

                curl_setopt($ch,CURLOPT_POST, 1);

                curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);

                $data = curl_exec($ch);

                curl_close($ch);

                if($data)

                        return $data;

                else   

                        return false;

}

参数解释:

 

CURLOPT_TIMEOUT:超时时间

CURLOPT_RETURNTRANSFER:是否要求返回数据

CURLOPT_SSL_VERIFYPEER:是否检测服务器的证书是否由正规浏览器认证过的授权CA颁发的

CURLOPT_SSL_VERIFYHOST:是否检测服务器的域名与证书上的是否一致

CURLOPT_SSLCERTTYPE:证书类型,"PEM" (default), "DER", and"ENG".

CURLOPT_SSLCERT:证书存放路径

CURLOPT_SSLCERTPASSWD:证书密码

CURLOPT_SSLKEYTYPE:私钥类型,"PEM" (default), "DER", and"ENG".

CURLOPT_SSLKEY:私钥存放路径

 

 

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

PKCS#12 到 PEM 的转换

openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem
验证 
openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem

© 著作权归作者所有

slagga

slagga

粉丝 19
博文 150
码字总数 132112
作品 0
深圳
后端工程师
私信 提问
https HttpsURLConnection请求的单向认证

参考链接 android httpClient(https/http)的优化构建方式一 android httpClient(https/http)的优化构建方式二 Java https请求 HttpsURLConnection php使用curl库进行ssl双向认证 OpenSSL生成...

IamOkay
2015/09/03
6.2K
0
curl 证书访问https站点

curl+个人证书(又叫客户端证书)访问https站点(双向认证) 什么是双向认证模式?对于面向公众用户的https的网站,大部分属于单向认证模式,它不需要对客户端进行认证,不需要提供客户端的个...

TsingCall
2016/01/03
0
0
NGINX 配置 SSL 双向认证

背景 对于 NGINX 的 HTTPS 配置,通常情况下我们只需要实现服务端认证就行,因为浏览器内置了一些受信任的证书颁发机构(CA),服务器端只需要拿到这些机构颁发的证书并配置好,浏览器会自己...

88250
2016/11/08
3K
16
你想要了解但是却羞于发问的有关SSL的一切

你想要了解但是却羞于发问的有关SSL的一切 或者更准确的说,“我所知的关于的SSL的实事”。本文(以及Spring Boot应用指南)将告诉你在一些通用服务(web服务器、浏览器认证、单元和集成测试)...

drkaka
2016/01/11
7.9K
17
curl post file PHP

网上示例方式 使用结果 PHP5.5及以上版本 示例

o0无忧亦无怖
2016/08/12
21
0

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(四)——复合Lambda

在一起来学Java8(二)——Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda。 Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用Lambda表达式实现函...

猿敲月下码
16分钟前
6
0
debian10使用putty配置交换机console口

前言:Linux的推广普及,需要配合解决实际应用方能有成效! 最近强迫自己用linux进行实际工作,过程很痛苦,还好通过网络一一解决,感谢各位无私网友博客的帮助! 系统:debian10 桌面:xfc...

W_Lu
47分钟前
10
0
aelf Enterprise 0.8.0 beta有奖公测,“Bug奖金计划”重磅开启

2019年9月30日,aelf Enterprise 0.8.0 beta版正式发布。aelf Enterprise 0.8.0 beta是一个完备的区块链系统, 包含完备的区块链系统、开发套件、开发文档、以及配套的基础应用和基础服务。 ...

AELF开发者社区
49分钟前
8
0
oracle 初始化数据库脚本

create user lpf identified by 123456; create tablespace lpf_ts_cms datafile '/opt/app/oracle/product/11.2.0/lpf.dbf' size 200M; alter user lpf default tablespace lpf_ts_cms; sel......

internetafei
53分钟前
8
0
深入了解Redis底层数据结构

说明 说到Redis的数据结构,我们大概会很快想到Redis的5种常见数据结构:字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted Set),以及他们的特点和运用场景。不过它们是...

TurboSanil
54分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部