文档章节

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

slagga
 slagga
发布于 2016/10/27 18:31
字数 473
阅读 362
收藏 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

粉丝 18
博文 141
码字总数 123811
作品 0
深圳
程序员
私信 提问
https HttpsURLConnection请求的单向认证

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

IamOkay
2015/09/03
6.1K
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
19
0

没有更多内容

加载失败,请刷新页面

加载更多

Go 关闭 channel 的 close 方法

在 Go 中我们所以 close() 来关闭一个 channel 官方的注释如下 The close built-in function closes a channel, which must be either bidirectional or send-only. It should be executed o......

mickelfeng
27分钟前
3
0
语音转文字什么方法比较简单

在很多时候一些比较重要的对话需要录制下来,在录制完成后还需要整理出文字,可是长时间的录音内容想要整理出文字是非常的麻烦的。需要花费大量的时间将录制的声音转换成文字,那么想要简单快...

401恶户
31分钟前
5
0
IIS7配置thinkphp5项目到public目录下

有个项目,tp5写的,要配置到项目的public目录下,一开始报错了...后面删除了配置,重新配置成功了,记录一下过程 1.首先,将网站根目录变为你的public目录下 2.添加解析程序的CGI,这里选择你需要解...

老bia同学
35分钟前
10
0
Redis主从复制的配置和实现原理

Redis的持久化功能在一定程度上保证了数据的安全性,即便是服务器宕机的情况下,也可以保证数据的丢失非常少。通常,为了避免服务的单点故障,会把数据复制到多个副本放在不同的服务器上,且...

TurboSanil
37分钟前
8
0
counsul 集群

1 master节点 cat << EOF > /lib/systemd/system/consul.service[Unit]Description=consul-masterAfter=network-online.target [Service]ExecStart=/bin/sh -c 'consul agent ......

拜了个拜
37分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部