Nginx、SSL双向认证、PHP、SOAP、Webservice、https
2015-01-05 17:26
417 查看
本文是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~
----------------------------------------------------- 我是分割线 ---------------------------------------------------------
标题太长了不知道该怎么起,索性就把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
- nginx配置ssl加密(单双向认证、部分https)
- nginx配置将http请求转发支持ssl双向认证https请求的正向代理
- Nginx配置ssl加密(单双向认证、部分https)
- nginx配置ssl加密(单双向认证、部分https)
- nginx配置将http请求转发支持ssl双向认证https请求的正向代理
- nginx配置ssl加密(单双向认证、部分https)
- Tomcat 配置WebService的HTTPS实现SSL的单双向认证
- nginx配置将http请求转发支持ssl双向认证https请求的正向代理
- nginx配置ssl加密(单双向认证、部分https)
- php实现https(tls/ssl)双向认证
- nginx环境下配置ssl加密(单双向认证、部分https)
- nginx配置ssl加密(单/双向认证、部分https)
- nginx配置ssl加密(单双向认证、部分https)
- Nginx配置ssl加密(单双向认证、部分https)
- nginx配置ssl双向验证 nginx https ssl证书配置
- 调用https双向认证的webservice
- nginx配置SSL实现服务器/客户端双向认证
- SSL构建单双向https认证!https部署及注意事项!
- HTTPS 中双向认证SSL 协议的具体过程