SSL双向认证(高清版)
介绍了SSL双向认证的一些基本问题,以及使用Nginx+PHP基于它搭建https的Webservice。
之前的方式只是实现1:1的模式,昨天同事继续实现了n:1的模式,这里我再整理记录下。
由于nginx的ssl_client_certificate参数只能指定一个客户端公钥,如果增加一个客户端进行通信就要重新配一个server。
n:1的模式是通过CA的级联证书模式实现的,首先自己生成一套CA根级证书,再借助其生成二级证书作为client证书。
此时client私钥签名不仅可以通过对应的client公钥验证,还可通过根证书的公钥进行验证。
看到这里应该豁然开朗了吧,下面简单介绍下具体怎么操作:
1 准备工作
1.1 openssl目录准备
一般情况下openssl的配置文件都在这个目录/etc/pki/tls,so:
mkdir /etc/pki/ca_linvo
cd /etc/pki/ca_linvo
mkdir root server client newcerts
echo 01 > serial
echo 01 > crlnumber
touch index.txt
1.2 openssl配置准备
修改openssl配置
vi /etc/pki/tls/openssl.cnf
找到这句注释掉,替换为下面那句
#default_ca = CA_default
default_ca = CA_linvo
把整个部分拷贝一份,改成上面的名字[
CA_linvo ]
修改里面的如下参数:
dir = /etc/pki/ca_linvo
certificate = $dir/root/ca.crt
private_key = $dir/root/ca.key
保存退出
2 创建CA根级证书
生成csr:openssl req -new -key /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.csr
生成crt:openssl x509 -req -days 3650
-in /etc/pki/ca_linvo/root/ca.csr -signkey /etc/pki/ca_linvo/root/ca.key
-out /etc/pki/ca_linvo/root/ca.crt
生成crl:openssl ca -gencrl -out /etc/pki/ca_linvo/root/ca.crl -crldays 7
生成的根级证书文件都在/etc/pki/ca_linvo/root/目录下
注意:创建证书时,建议证书密码设置长度>=6位,因为java的keytool工具貌似对它有要求。
3 创建server证书
生成key:openssl genrsa -out /etc/pki/ca_linvo/server/server.key
生成csr:openssl req -new -key /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.csr
生成crt:openssl ca -in
/etc/pki/ca_linvo/server/server.csr -cert /etc/pki/ca_linvo/root/ca.crt
-keyfile /etc/pki/ca_linvo/root/ca.key -out
/etc/pki/ca_linvo/server/server.crt -days 3650
说明:
1、这里生成的crt是刚才ca根级证书下的级联证书,其实server证书主要用于配置正常单向的https,所以不使用级联模式也可以:
openssl rsa -in /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.key
openssl x509 -req -in /etc/pki/ca_linvo/server/server.csr -signkey
/etc/pki/ca_linvo/server/server.key -out
/etc/pki/ca_linvo/server/server.crt -days 3650
2、-days 参数可根据需要设置证书的有效期,例如默认365天
4 创建client证书
生成key:openssl genrsa -des3 -out /etc/pki/ca_linvo/client/client.key 1024
生成csr:openssl req -new -key /etc/pki/ca_linvo/client/client.key -out /etc/pki/ca_linvo/client/client.csr
生成crt:openssl ca -in
/etc/pki/ca_linvo/client/client.csr -cert /etc/pki/ca_linvo/root/ca.crt
-keyfile /etc/pki/ca_linvo/root/ca.key -out
/etc/pki/ca_linvo/client/client.crt -days 3650
说明:
1、这里就必须使用级联证书,并且可以重复该步骤,创建多套client证书
2、生成crt时可能会遇到如下报错:
openssl TXT_DB error number 2 failed to update database
可参照这里进行操作。
我使用的是方法一,即将index.txt.attr中unique_subject = no
5 配置nginx
这里只列出server段的关键部分:
ssl_certificate /etc/pki/ca_linvo/server/server.crt;#server公钥
ssl_certificate_key /etc/pki/ca_linvo/server/server.key;#server私钥
ssl_client_certificate /etc/pki/ca_linvo/root/ca.crt;#根级证书公钥,用于验证各个二级client
ssl_verify_client on;
重启Nginx
6 测试
6.1 浏览器测试
/etc/pki/ca_linvo/client/client.key -in
/etc/pki/ca_linvo/client/client.crt -out
/etc/pki/ca_linvo/client/client.pfx
6.2 php curl测试
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书,不是CA机构颁布的也没关系
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名,如果不想验证也可设为0
- curl_setopt($ch, CURLOPT_VERBOSE, '1'); //debug模式,方便出错调试
- curl_setopt($ch, CURLOPT_SSLCERT, CLIENT_CRT); //client.crt文件路径,这里我用常量代替
- curl_setopt($ch, CURLOPT_SSLCERTPASSWD, CRT_PWD); //client证书密码
- curl_setopt($ch, CURLOPT_SSLKEY, CLIENT_KEY); //client.key文件路径
如果出现白板页没有返回信息,一般是证书或密码没有设置正确的问题,请检查。
6.3 php soap测试
首先需要构建client的pem格式证书,通过openssl命令也可以,不过因为我们已经有了crt和key,所以手动合并也很简单:
新建一个文件,把crt中-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----之间的base64内容(包括这两个分割线)拷贝进去,然后把key中-----BEGIN RSA PRIVATE KEY-----和-----END
RSA PRIVATE KEY-----之间的内容也复制进去,然后保存为client.pem即可。
其实更省事的话可以如下命令,直接合并两个文件:
cat /etc/pki/ca_linvo/client/client.crt /etc/pki/ca_linvo/client/client.key > /etc/pki/ca_linvo/client/client.pem
有了pem文件,下面可以使用php内置的SoapClient进行调用,构造函数需要设置第二个参数:
- $header = array(
- 'local_cert' => CLIENT_PEM, //client.pem文件路径
- 'passphrase' => CRT_PWD //client证书密码
- );
- $client = new SoapClient(FILE_WSDL, $header); //FILE_WSDL为要访问的https地址
上一篇博客里最后说到local_cert设置成远程路径的话会报错,好像是因为第一次获取wsdl时并没有使用client证书的原因,需要将wsdl保持成本地文件进行调用;
但是这次测试却没问题,不用另存为本地文件,直接远程获取即可。
本来认为是之前的证书有问题,但是使用之前的那套证书依然可以,很是诡异~~~~~
SSL双向认证(高清版)的更多相关文章
- Nginx、SSL双向认证、PHP、SOAP、Webservice、https
本文是1:1模式,N:1模式请参见新的一篇博客<SSL双向认证(高清版)> ----------------------------------------------------- 我是 ...
- PHP基础在线视频教程高清版
这个是我给大家介绍的PHP基础在线视频教程高清版,目前PHP慢慢垄断WEB的语言编写市场了,PHP 是一种服务器内置式的script 语言,它的出现使得在unix上快速地开发动态web成为现实.PHP ...
- apache用户认证,ssl双向认证配置
安装环境: OS:contos 6.4 httpd:httpd-2.2.15-59.el6.centos.i686.rpm openssl:openssl-1.0.1e-57.el6.i686.rpm ...
- SSL双向认证和SSL单向认证的流程和区别
refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tenc ...
- php实现https(tls/ssl)双向认证
php实现https(tls/ssl)双向认证 通常情况下,在部署https的时候,是基于ssl单向认证的,也就是说只要客户端认证服务器,而服务器不需要认证客户端. 但在一些安全性较高的场景,如银行, ...
- 什么是SSL双向认证,与单向认证证书有什么区别?
SSL/TLS证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是, ...
- tomcat配置SSL双向认证
一.SSL简单介绍 SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改. 怎样保障数据传输安全? ...
- SSL双向认证java实现(转)
本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...
- 电脑报2014年第43期 pdf高清版
电脑报2014年第43期 pdf高清版
随机推荐
- QQ登录网站接入
QQ网站登录是一个非常常用的功能,网上有很多的资料,在此只做一个整理: QQ登录接入也在不断的升级,目前我发布的是2.1,很多资料里显示的那些繁杂的步骤已经不需要了: 第一步需要先申请,申请地址如下: ...
- hdu 5000 Clone
dp,用dp[i][j],表示和为i的前j个维度的种类.其中arr[i],表示第i维的最大值. 则\begin{equation} dp[i][j] = \sum_{0 \leq k \leq \mi ...
- opensuse安装mysql-workbench
首先安装好mysqlserver,做本地测试其实不用安装mysqlclient. 到http://software.opensuse.org/package/mysql-workbench 下载相应版 ...
- linux 定时执行 cron指令
linux 中的 cron 定时执行命令,先上例子:每间隙两分钟把 "Hello world"写到 /tmp/hello.txt crontab -e */2 * * * * ec ...
- ASP.NET MVC验证 - jQuery异步验证
本文主要体验通过jQuery异步验证. 在很多的教材和案例中,MVC验证都是通过提交表单进行的.通过提交表单,可以很容易获得验证出错信息.因为,无论是客户端验证还是服务端验证,总能找到与Model属性 ...
- HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)
看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难 ...
- 《Nodejs开发加密货币》之二十七:开发通用的HTML组件
人的懒惰常常是麻烦的开始.多数程序员都希望自己的工作一劳永逸,一次开发,到处使用,成了人人追逐的目标,我也不例外.最初写<Nodejs开发加密货币>系列文章,因为不喜欢设定好了去写,所以目 ...
- IOC----LightInject
开源项目 引入 LightInject.cs 默认服务 new ServiceContainer 注册跟获取获取服务 container.Register<IFoo, Foo>();con ...
- 盗链网易163、腾讯QQ、新浪sina、百度Baidu的图片之PHP独立版
网易相册频道,网易相册确实是一个高质量图片的地方,而且免费,唯一缺点是很多加了水印,但这个不重要了,无意间发现网易163相册频道的图片是防止盗链的,于是便自己写了一个小程序来突破这个. 本盗链图片最新 ...
- Centos 6.2 32位机器安装新的JDK和Weblogic
一.首先卸载自带的JDK 1.查看自带的java版本. root@admin]#java -version java version "1.6.0" OpenJDK Runtime ...