本文是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. osi七层模型和两主机传输过程:

    osi七层模型和两主机传输过程: http://www.zhihu.com/question/24002080/answer/31817536  注:笔记部分可能参考其他作者内容的一个记录,仅为加深自 ...

  2. svn 钩子 post-commit 出现255错误解决办法

    首先检查代码中是否有可执行命令 #!/bin/sh 然后 检查post-commit权限 post-commit 脚本文件的权限不对,post-commit 脚本必须有 +x 权限. chown sv ...

  3. Linux Vi的使用

    1.vi使用三模式:一般模式,插入模式,命令模式 保存和退出vi: 命令模式下 :w 保存 :w 新文件 保存到新文件 类似另存为,新文件存在,报错 :w! 新文件 保存到新文件,新文件存在,覆盖 : ...

  4. 紧跟时代步伐,让我们拥抱MVC 3

    作为一个开发者,我们不希望技术很快的更新,这是因为我们还没有完全掌握原来技术的基础上,又要掌握新的技术,作为天天忙忙碌碌的程序员,我们不希望还要额外的时间来学习,尤其是当我们的年龄,逐渐的变大的时候, ...

  5. C#之Attribute(特性)

    本文主要复习下基础知识: 1.C#系统自带的特性: 建立一个控制台项目取名为AttributeTest: 我们添加了一个系统自带的Attribute叫Condition,这个特性表示在程序的DEBUG ...

  6. platform平台设备驱动简化示例代码

    driver.c: #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h& ...

  7. Codeforces Round #345 (Div. 1) B. Image Preview

    Vasya's telephone contains n photos. Photo number 1 is currently opened on the phone. It is allowed ...

  8. 2014年度辛星html教程夏季版第五节

    如果读者是一位后台开发者,那么肯定会知道什么叫表单,这里我们就介绍一下前台如何使用表单,表单的使用也是我们编写网页的必须经历的一关,而且,表单也往往是我们网站的漏洞和弱点出现的地方. ******** ...

  9. C99标准中的部分新特性

    我有点怀疑我会不会C语言了. 1.变长数组(VLA) ; scanf("%d", &n); int arr[n]; 2.数组初始化 ] = {[] = , [] = , [ ...

  10. JAVA 内存管理总结

    1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对 ...