Nginx、SSL双向认证、PHP、SOAP、Webservice、https
本文是1:1模式,N:1模式请参见新的一篇博客《SSL双向认证(高清版)》
----------------------------------------------------- 我是分割线 ---------------------------------------------------------
标题太长了不知道该怎么起,索性就把keyword列出来吧~
WebService的WS-*搞了一天没搞定,看样子PHP应该是彻底抛弃SOAP协议了,google翻烂了也没找到什么靠谱的解决方案。
合作方又不愿意自己去实现加解密签名那些东西,没办法,只好走https了,把这块儿从应用层抛到更底层去。
但是通信中的数据安全分几部分:保密性、不可篡改,不可抵赖。
传统的https调用只是对数据做了加密,解决了保密以及不可篡改问题,解决不了客户端的身份验证问题,或者叫不可抵赖性。
所以需要使用两套证书的SSL双向认证。
目前的Nginx对SSL双向认证支持的比较好,配置很简单:
- ……
- listen 443;
- server_name test.com;
- ssl on;
- ssl_certificate server.crt; //server端公钥
- ssl_certificate_key server.key; //server端私钥
- ssl_client_certificate client.crt; //client端公钥
- ssl_session_timeout 5m;
- ssl_verify_client on; //开启client验证
- ……
其实就是在常规https配置基础上增加了client端公钥设置,以及开启client验证。(更多配置信息参考nginx官方文档:http://wiki.nginx.org/HttpSslModule#ssl)
服务端配好了后,原来的wsdl地址就需要通过https才可访问。但是,客户端访问时需要使用client端的证书。
先以curl测试,相关参数:
- ……
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 不检查证书中域名
- curl_setopt($ch, CURLOPT_VERBOSE, '1'); //开发模式,会把通信时的信息显示出来
- curl_setopt($ch, CURLOPT_SSLCERT, 'client.crt'); //客户端crt
- curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '123456'); //客户端证书密码
- curl_setopt($ch, CURLOPT_SSLKEY, 'client.key'); //客户端key
- curl_setopt($ch, CURLOPT_POST, false); //不能用POST
- ……
我使用的是nusoap实现的webservice服务端(具体参见《你喜欢SOAP吗?反正我不喜欢!》),此时会看到wsdl中的绑定接口地址已经是443端口地址。
下面改用SOAP调用,PHP自带的SoapClient就支持,只需设置如下header:
- ……
- cert = "client.pem"; //包含crt和key内容的pem
- $header = array(
- 'local_cert' => $local_cert, //client证书信息
- 'passphrase'=> '123456' //密码
- );
- $client = new SoapClient($wsdl, $header);
需要注意的一点是:此时client.pem的内容需要包含证书以及私钥信息,如下:
- -----BEGIN CERTIFICATE-----
- MIICdTCCAd4C……
- -----END CERTIFICATE-----
- -----BEGIN RSA PRIVATE KEY-----
- MIICXQIBAAKB……
- -----END RSA PRIVATE KEY-----
此时会发现仍然有如下报错信息:
- 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~
Nginx、SSL双向认证、PHP、SOAP、Webservice、https的更多相关文章
- php实现https(tls/ssl)双向认证
php实现https(tls/ssl)双向认证 通常情况下,在部署https的时候,是基于ssl单向认证的,也就是说只要客户端认证服务器,而服务器不需要认证客户端. 但在一些安全性较高的场景,如银行, ...
- nginx支持ssl双向认证配置
nginx支持ssl双向认证配置 listen 443; server_name test.com; ssl on; ssl_certificate server.crt; //server端公钥 s ...
- SSL双向认证(高清版)
介绍了SSL双向认证的一些基本问题,以及使用Nginx+PHP基于它搭建https的Webservice. 之前的方式只是实现1:1的模式,昨天同事继续实现了n:1的模式,这里我再整理记录下. 由于n ...
- tomcat配置SSL双向认证
一.SSL简单介绍 SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改. 怎样保障数据传输安全? ...
- SSL双向认证和SSL单向认证的流程和区别
refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tenc ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...
- 在 kafka 的 broke 和 client 之间加入 SSL 双向认证
在 kafka 的 broke 和 client 之间加入 SSL 双向认证https://blog.csdn.net/hohoo1990/article/details/79110031 kafka ...
- 什么是SSL双向认证,与单向认证证书有什么区别?
SSL/TLS证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是, ...
- SSL双向认证java实现(转)
本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...
随机推荐
- 省市选择(基于zepto.js)
效果如下: <div class="clList overflow-h mt75"> <select class="pull-left cl-35 se ...
- CSS浮动特性总结
1.假设现在CSS中没有浮动(float)属性,那么会变成一个什么样子.我们会发现,目前流行采用浮动方法实现的无论是分栏布局,还是列表排列我们都可以用其他一些CSS属性(不考虑table)代替实现,唯 ...
- 一个月时间整理《深入浅出Node.js》
今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在 ...
- python引入导入自定义模块和外部文件
参考:http://blog.csdn.net/devil_2009/article/details/15816237 项目中想使用以前的代码,或者什么样的需求致使你需要导入外部的包 如果是web 下 ...
- Html学习_style属性应用
用style属性改变字体大小.颜色.字体.背景颜色和对齐方式 <!DOCTYPE html> <html> <head> <title>Putting ...
- hdu 5652 India and China Origins 并查集+逆序
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意:一张n*m个格子的点,0表示可走,1表示堵塞.每个节点都是四方向走.开始输入初始状态方格, ...
- 【Error listenerStart】 Error listenerStart Context [] startup failed due to previous errors
发给 报错信息 八月 12, 2015 11:58:19 上午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandle ...
- Nhibernate 分页功能
cs: public IEnumerable<ArticleView> MyGetAll(int start, int limit, ref int count) { try { var ...
- strstr函数与strcmp函数
1.strstr函数主要完成在一个字串中寻找另外一个字串 函数实现工程如下:摘自http://baike.baidu.com/link?url=RwrzOxs0w68j02J2uQs5u1A56bEN ...
- r个有标志的球放进n个不同的盒子里,要求无一空盒,问有多少种不同的分配方案?
由题意可知道r>=n,我原来想的是先取n个全排列,剩下的r-n个每个有n中选择,所以结果是n!*n^(r-n).经满神猜测,这样是会重复的.比如说,1到5个球,ABC三个盒子,ms ...