博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx、SSL双向认证、PHP、SOAP、Webservice、https
阅读量:6814 次
发布时间:2019-06-26

本文共 1923 字,大约阅读时间需要 6 分钟。

本文是1:1模式,N:1模式请参见新的一篇博客《SSL双向认证(高清版)》

----------------------------------------------------- 我是分割线 ---------------------------------------------------------

标题太长了不知道该怎么起,索性就把keyword列出来吧~

WebService的WS-*搞了一天没搞定,看样子PHP应该是彻底抛弃SOAP协议了,google翻烂了也没找到什么靠谱的解决方案。

合作方又不愿意自己去实现加解密签名那些东西,没办法,只好走https了,把这块儿从应用层抛到更底层去。

但是通信中的数据安全分几部分:保密性、不可篡改,不可抵赖

传统的https调用只是对数据做了加密,解决了保密以及不可篡改问题,解决不了客户端的身份验证问题,或者叫不可抵赖性。

所以需要使用两套证书的SSL双向认证。

目前的Nginx对SSL双向认证支持的比较好,配置很简单:

  1. ……  
  2. listen      443;  
  3. server_name test.com;  
  4.   
  5. ssl on;  
  6. ssl_certificate server.crt; //server端公钥  
  7. ssl_certificate_key server.key; //server端私钥  
  8. ssl_client_certificate client.crt; //client端公钥  
  9. ssl_session_timeout 5m;  
  10. ssl_verify_client on; //开启client验证  
  11. ……  

其实就是在常规https配置基础上增加了client端公钥设置,以及开启client验证。(更多配置信息参考nginx官方文档:)

服务端配好了后,原来的wsdl地址就需要通过https才可访问。但是,客户端访问时需要使用client端的证书。

先以curl测试,相关参数:

  1. ……  
  2. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书  
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 不检查证书中域名  
  4. curl_setopt($ch, CURLOPT_VERBOSE, '1'); //开发模式,会把通信时的信息显示出来  
  5. curl_setopt($ch, CURLOPT_SSLCERT, 'client.crt');  //客户端crt  
  6. curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '123456');  //客户端证书密码  
  7. curl_setopt($ch, CURLOPT_SSLKEY, 'client.key');  //客户端key  
  8. curl_setopt($ch, CURLOPT_POST, false); //不能用POST  
  9. ……  

我使用的是nusoap实现的webservice服务端(具体参见),此时会看到wsdl中的绑定接口地址已经是443端口地址。

下面改用SOAP调用,PHP自带的SoapClient就支持,只需设置如下header:

  1. ……  
  2. cert = "client.pem"; //包含crt和key内容的pem  
  3. $header = array(  
  4.         'local_cert' => $local_cert, //client证书信息  
  5.         'passphrase'=> '123456' //密码  
  6.         );  
  7. $client = new SoapClient($wsdl, $header);  

需要注意的一点是:此时client.pem的内容需要包含证书以及私钥信息,如下:

  1. -----BEGIN CERTIFICATE-----  
  2. MIICdTCCAd4C……  
  3. -----END CERTIFICATE-----  
  4.   
  5. -----BEGIN RSA PRIVATE KEY-----  
  6. MIICXQIBAAKB……  
  7. -----END RSA PRIVATE KEY-----  

此时会发现仍然有如下报错信息:

  1. SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://test.com/soap_test.php?wsdl' : Premature end of data in tag html line 1  

在google上翻到了一个哥们,结果和我意料的一样:事先取wsdl的时候soapclient根本没有使用证书信息! 用curl抓下来保存成本地文件进行调用,一切OK~

转载地址:http://hibzl.baihongyu.com/

你可能感兴趣的文章
juniper基本配置命令 自用
查看>>
hadoop学习笔记之--- HDFS原理学习
查看>>
ThinkPHP 学习笔记(四) ThinkPHP的配置
查看>>
win32 UNICODE 支持
查看>>
MySQL+DRBD+Corosync+Pacemaker CentOS6.5版
查看>>
在CentOS 6.5上安装和配Xen
查看>>
重载类的 new,delete,new[],delete[] 运算符成员函数
查看>>
Express 3.x升级到4.x 优缺点
查看>>
我的友情链接
查看>>
inittab文件丢失恢复
查看>>
ocjp 51-60
查看>>
我的友情链接
查看>>
windows下的任务不能自动执行的解决办法
查看>>
VACL配置说明
查看>>
shell防DDOS
查看>>
go语言 学习笔记1
查看>>
一键包安装lamp或lnmp环境
查看>>
网络提速(最短路)
查看>>
Spring整合MongoDB实现多个or的范围查询
查看>>
python安装包模块
查看>>