本文是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. ssl on;
  5. ssl_certificate server.crt; //server端公钥
  6. ssl_certificate_key server.key; //server端私钥
  7. ssl_client_certificate client.crt; //client端公钥
  8. ssl_session_timeout 5m;
  9. ssl_verify_client on; //开启client验证
  10. ……

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

服务端配好了后,原来的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服务端(具体参见《你喜欢SOAP吗?反正我不喜欢!》),此时会看到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. -----BEGIN RSA PRIVATE KEY-----
  5. MIICXQIBAAKB……
  6. -----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~

Nginx、SSL双向认证、PHP、SOAP、Webservice、https的更多相关文章

  1. php实现https(tls/ssl)双向认证

    php实现https(tls/ssl)双向认证 通常情况下,在部署https的时候,是基于ssl单向认证的,也就是说只要客户端认证服务器,而服务器不需要认证客户端. 但在一些安全性较高的场景,如银行, ...

  2. nginx支持ssl双向认证配置

    nginx支持ssl双向认证配置 listen 443; server_name test.com; ssl on; ssl_certificate server.crt; //server端公钥 s ...

  3. SSL双向认证(高清版)

    介绍了SSL双向认证的一些基本问题,以及使用Nginx+PHP基于它搭建https的Webservice. 之前的方式只是实现1:1的模式,昨天同事继续实现了n:1的模式,这里我再整理记录下. 由于n ...

  4. tomcat配置SSL双向认证

    一.SSL简单介绍 SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改. 怎样保障数据传输安全? ...

  5. SSL双向认证和SSL单向认证的流程和区别

    refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tenc ...

  6. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  7. 在 kafka 的 broke 和 client 之间加入 SSL 双向认证

    在 kafka 的 broke 和 client 之间加入 SSL 双向认证https://blog.csdn.net/hohoo1990/article/details/79110031 kafka ...

  8. 什么是SSL双向认证,与单向认证证书有什么区别?

    SSL/TLS证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是, ...

  9. SSL双向认证java实现(转)

    本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...

随机推荐

  1. PHPstrom2016.1激活与汉化【2016.06.21依旧可用】

    : 目前的网络上有很多的关于PHPstrom激活的方法,但是很多都失效了,没有具体的使用日期,这个是我从其他网友那里转载过来的,具体地址忘记了: 方法如下: 需要在联网条件下,打开PHPstrom,在 ...

  2. Mac 系统下安装 MySql

    Mac原生没有带MySql,想要使用需要自己去安装. 下载. 首先去mysql官网下载安装包. 由于现在mysql对企业有服务,所以有所谓社区版(community)和企业版(enterprise), ...

  3. Ubuntu 14.04为浏览器添加Flash插件

    在刚安装好到Ubuntu操作系统中默认是没有flash支持到,因此,当我们使用浏览器查看很多视频网页到时候,会导致网页上到视频无法播放.然而,这个问题我们也不能够通过“软件中心”来解决,这时候需要我们 ...

  4. jquery改变多个css样式

    <!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis.com/ajax ...

  5. C#关于编码、解码相关问题

    编码.解码技术是我们在程序中开发中经常使用到的,对一些敏感信息的存储,比如密码之类的,我们一般是不会直接以明文直接存储到数据库的,而是会通过各种算法,可以是现成的MD5(一种散列算法).或者是Hash ...

  6. C# winform关于DataGridView的一些操作

    设置字段名 设置字段值 设定单元格表示 Error图标 设定当前单元格 取得当前单元格内容 取得当前单元格的列 Index 取得当前单元格的行 Index 向下一行 向上一行 取消 DataGridV ...

  7. 安装JDK设置环境变量

    PS:之前在CSDN上写的文章,现在转到博客园~ 在安装过程中第一次让选择jdk的安装路径,第二次让选择jre的安装路径.两者不可以在同一个文件夹下,否则在cmd中运行javac时会报:摘不到或无法加 ...

  8. [CSS]white-space 属性详解

    实例 规定段落中的文本不进行换行: p { white-space: nowrap } 可能的值 值 描述 normal 默认.空白会被浏览器忽略. pre 空白会被浏览器保留.其行为方式类似 HTM ...

  9. 捕获ClientDataSet.ApplyUpdates和SocketConnection异常

    核心提示:如何捕获ClientDataSet.ApplyUpdates的错误,不用ReconcileError... var cdsEmp:TClientDataSet; //保存 procedure ...

  10. Django视图与网址传参

    目的:采用/add?a=1&b=2  这样get/post方法进行 修改一下mysite/views.py文件 from django.shortcuts import renderfrom ...