在上述的文章后了解到原理之后,我们这篇文章来进行CA的搭建。

OPEN SSL 环境搭建
在基础原理中我们提到了两种认证服务,单项认证服务和双向认证服务,我们就以双向认证服务举例说明。
OpenSSL是一个开放源代码软件包,实现了SSL以及相关加密技术,是最常用的证书管理工具,OpenSSL功能远胜于KeyTool,可用于根证书(KeyTool不含有,因此KeyTool没有办法作为CA)、服务器证书、客户证书的管理。
在OpenSSL官网下载:http:www.openssl.org/source/下载最新的源码,官网还提供了windows版的二进制发行版地址:http://www.slproweb.com/products/Win32OpenSSL.html
 1、 准备工作
 选择适合自己操作系统的版本进行下载后,安装操作与普通软件一样,没有什么区别
 设置环境变量:

打开配置文件openssl.cfg(%OpenSSL_Home%\bin\openssl.cfg),找到配置[CA_default]:

上述变量dir,它指向的是CA工作目录,可以对其进行修改

2、 创建bat文件
整个bat文件的创建过程我们可以把它想象成这样一种场景:
高考结束,教育局来颁发毕业证书给各个学校,各个学校在把证书发给学生,具体步骤如下:
1) 教育局先有空白证书了
2) 教育局又有自己的公章
3) 让各个学校可以拥有毕业证发放申请
4) 对空白的毕业证盖上了教育局的公章,并可以交给已经申请的学校
5) 申请的学校拿到了盖有教育局的毕业证后,准备对其盖上自己的公章
6) 学校在教育局已经盖上教育局公章的毕业证上又盖上了自己学校的公章
7) 准备把毕业证发给学校申请毕业的学生们
8) 申请毕业的学生拿取自己的学生证和身份证准备领取毕业证
9) 来到学校教务处,填写单据申请学校发放毕业证
10) 教育局已经转交学校来发放毕业证,此时学校把毕业证发放给申请学生
11) 学生认为盖有教育局的公章和学校的公章的毕业证是有效的

上述步骤,都可以在下面的bat文件中找到相应的地方:

  1. //构建ca子目录(证书创建时,用到下述目录,最终在certs目录中获得证书文件)
  2. echo 构建已发型证书存放目录 certs
  3. mkdir certs
  4. echo 构建新证书存放目录 newcerts
  5. mkdir newcerts
  6. echo 构建私钥存放目录 private
  7. mkdir private
  8. echo 构建证书吊销列表存放目录 crl
  9. mkdir cr1
  10. //构建相关文件,完成后可以进行证书的构建和签发工作
  11. echo 构建索引文件 index.txt
  12. echo 0>index.txt
  13. echo 构建序列号文件 serial
  14. echo 01>serial
  15. //构建根证书
  16. echo 构建随机数 private/.rand
  17. openssl rand -out private/.rand 1000
  18. //构建根证书私钥
  19. echo 构建根证书私钥 private/ca.key.pem
  20. openssl genrsa -aes256 -out private/ca.key.pem 2048
  21. //完成密钥构建操作后,需要生成根证书签发申请文件ca.csr
  22. //生成根证书签发申请
  23. echo 生成根证书签发申请 private/ca.csr
  24. openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN=*.qiujinyong.org"
  25. //执行完后此处又要输入根证书密码
  26. //得到根证书签发申请文件后,可以将其发送给CA机构签发,也可以自行签发根证书
  27. echo 签发根证书 private/ca.cer
  28. openssl x509 -req -days 1000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
  29. //执行完后此处又要输入根证书密码
  30. echo 根证书转换 private/ca.p12
  31. openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12
  32. //执行完后此处又要输入根证书密码
  33. //构建服务器证书
  34. echo 构建服务器私钥 private/server.key.pem
  35. openssl genrsa -aes256 -out private/server.key.pem 2048
  36. //服务器证书签发申请
  37. echo 生成服务器证书签发申请 private/server.csr
  38. openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN=www.qiujinyong.com"
  39. //执行完后此处又要输入根证书密码
  40. //根证书签发服务器证书
  41. echo 签发服务器证书 private/server.cer
  42. openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer
  43. //执行完后此处又要输入根证书密码
  44. //将OpenSSL产生的数字证书转换为PKCS#12编码格式
  45. echo 服务器证书转换 private/server.p12
  46. openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12
  47. //执行完后此处又要输入根证书密码
  48. //构建客户证书
  49. echo 产生客户私钥 private/client.key.pem
  50. openssl genrsa -aes256 -out private/client.key.pem 2048
  51. //执行完后此处又要输入根证书密码
  52. //产生客户证书签发申请
  53. echo 生成客户证书签发申请 client.csr
  54. openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN=qiujinyong"
  55. //执行完后此处又要输入根证书密码
  56. //根证书签发客户证书
  57. echo 签发客户证书 certs/client.cer
  58. openssl  x509 -req -days 3650 -sha1 -extensions v3_req -CA  certs/ca.cer  -CAkey  private/ca.key.pem  -CAserial ca.srl -CAcreateserial -in private/client.csr -out  certs/client.cer
  59. //执行完后此处又要输入根证书密码
  60. //将获得客户证书转换JAVA语言可以识别的PKCS#12编码格式
  61. echo 客户证书转换 certs/client.p12
  62. openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12
  63. //完成了双向认证的所需的全部证书

3、 文件生成
通过上述语句我们生成了以下几个“一级”文件以及文件夹:

Certs文件夹下又生成了:

Private文件夹下又生成了:

4、 证书导入
我们使用ca.p12、server.p12、client.p12个人信息交换文件构建双向认证,在验证操作之前,我们先导入ca.p12、client.p12文件

ca.p12文件是ca根证书的个人信息交换文件:
双击”ca.p12”或者点击在浏览器"工具"->"internet选项"->"内容"中的"证书"->"导入"

点击“下一步”后,“浏览”按钮时,指定个人信息交换文件格式(*.p12;*.pfx), 选择“ca.p12的所在位置”:

输入私钥的密码:

选择“将所有的证书放入下列存储”:

点击“浏览”,选择“受信任的根证书颁发机构”:

点击“下一步”,然后点击“完成”

导入”client.p12”文件:
导入clinet.p12文件的方式和ca.p12文件方式基本相似,只是在证书存储时,选择“个人”:

5、 服务器配置
将”ca.p12”、”server.p12”文件复制到tomcat的conf目录下:

同时,需要在windows系统下通过ie导入ca.p12和client.p12文件:

我们在tomcat的server.xml文件中配置双向认证:

  1. <Connector port="443" maxHttpHeaderSize="8192"
  2. maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  3. sslProtocol="TLS" keystoreFile="conf/server.p12"
  4. keystorePass="123456" keystoreType="PKCS12"
  5. truststoreFile="conf/ca.p12" acceptCount="100" scheme="https" secure="true"
  6. sslEnabled="true" clientAuth="true" truststorePass="123456" truststoreType="PKCS12"/>

这里的密钥库文件参数keystoreFile指向server.p12文件,密钥库密码参数keystorePass值为”123456”,密钥库类型参数keystoreType值为”PKCS12”,因为双向认证服务区分信任库文件和密钥库文件,此时,server.p12文件将作为密钥库文件,而ca.p12文件则作为信任库文件,因此,信任库文件参数truststoreFile指向ca.p12文件,信任库密码参数truststorePass值为”123456”,信任库类型参数truststoreType值为“pkcs12”,clientAuth的值为”true”,这是打开双向认证的关键一步,port默认为8443,现在修改为443,这样就省去我们在地址栏中输入端口号。

效果展现

输入我们证书绑定的网站,https打头:

查看给该网站颁发的证书的属性:

点击授予权限:

如果我们是自己创建的根证书没有通过CA验证的话,那么会在地址栏中看到相关信息,如下图:

点击继续浏览, 虽然我们连接的是本地服务器,但仍然会感到有些延时,这是因为浏览器访问CA机构验证该证书,并初始化加密/解密等信息:

上述我们看到“证书错误”,就是因为我们的根证书并没有得到CA的认证

我们如果加上验证的代码后:

  1. for(Enumeration en = request.getAttributeNames();
  2. en.hasMoreElements();){
  3. String name = (String)en.nextElement();
  4. out.println(name);
  5. out.println(" = " + request.getAttribute(name));
  6. out.println();
  7. }

可以看到如下结果:

上述有些相关属性解释:
javax.servlet.request.ssl_session:当前SSL/TLS协议的会话ID
java.servlet.request.key_size:当前加密算法所使用的密钥长度
javax.servlet.request.cipher_suite:当前SSL /TLS协议所使用的加密套件(比如上述:使用的TLS协议,RSA的非对称加密算法,AES的对称加密算法,同时是128的,SHA的消息摘要算法,CBC的工作模式,,,一般使用非对称加密算法对数据进行加密/解密操作的效率相当低,而使用对称加密算法进行加密/解密的效率相当高,合理的解决办法是使用非对称加密算法传递对称加密算法的密钥,使用对称加密算法对数据加密)
javax.servlet.request.X509Certificate:指向客户证书列表

CA认证原理以及实现(下)的更多相关文章

  1. OAuth认证原理及HTTP下的密码安全传输

    很多人都会问这样一个问题,我们在登录的时候,密码会不会泄露?随便进一个网站,登录时抓包分析,可以看到自己的密码都是明文传输的,在如此复杂的web环境下,我们没有百分的把握保证信息在传输过程中不被截获, ...

  2. CA认证原理以及实现(上)

    转自:http://yale.iteye.com/blog/1675344 原理基础数字证书为发布公钥提供了一种简便的途径,其数字证书则成为加密算法以及公钥的载体,依靠数字证书,我们可以构建一个简单的 ...

  3. [加密]openssl之数字证书签名,CA认证原理及详细操作

    转自:http://blog.sina.com.cn/s/blog_cfee55a70102wn3h.html 1 公钥密码体系(Public-key Cryptography) 公钥密码体系,又称非 ...

  4. CA证书申请、认证原理

    (一) 证书的申请 密钥文件的格式用OpenSSL生成的就只有PEM和DER两种格式,PEM的是将密钥用base64编码表示出来的,直接打开你能看到一串的英文字母,DER格式是二进制的密钥文件,直接打 ...

  5. CA认证和颁发吊销证书

    摘要:涉及到网络安全这一块,想必大家都听过CA吧.像百度.淘宝.京东等这些知名网站,每年都要花费一笔money来买CA证书.但其实简单的企业内的CA认证,我们自己就可以实现,今天小编我就讲解一下怎么在 ...

  6. SSL、数字签名、CA 工作原理

    SSL.数字签名.CA 工作原理 对称加密和非对称加密介绍和区别 什么是对称加密技术?   对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方 ...

  7. Kerberos认证原理简介

    1.1 What is Kerberos 1.1.1 简单介绍 Kerberos是一个用于鉴定身份(authentication)的协议, 它采取对称密钥加密(symmetric-key crypto ...

  8. 【转】Keberos认证原理

    前几天在给人解释Windows是如何通过Kerberos进行Authentication的时候,讲了半天也别把那位老兄讲明白,还差点把自己给绕进去.后来想想原因有以下两点:对于一个没有完全不了解Ker ...

  9. SSH认证原理和批量分发管理

    SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [root@m01 ssh]# ls moduli ssh_config sshd_config ssh_host_d ...

随机推荐

  1. BZOJ 3590: [Snoi2013]Quare

    首先有一个性质,一个双联通图一定可以拆成一个小的双联通子图和一条链 一个点可以视为权值为0的双联通图或者一个点的链 状压DP,枚举子集 O(3^n*n^2) #include<cstdio> ...

  2. Python之多线程与多进程(一)

    多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...

  3. luogu2754 星际转移问题

    源向地球连 月球向汇连 每一天往下一天连 飞船上一天与这一天连 枚举答案 #include <iostream> #include <cstring> #include < ...

  4. java基础语法中容易出错的细节

    1 java中的数字默认类型为int **容易出现类型转换错误 long 定义的数字后面必须有 “l” “L” float 定义的数字后面必须有 “f” “F” java中比int表述范围大的数,不会 ...

  5. 基于AOP的优惠券发送异常哨兵监控

    本文来自网易云社区 作者:王贝 最近总是发现支付发红包优惠券发完的情况,但是发现的比较迟缓,于是乎,想加一个哨兵监控,统计了一下,组内不少需求都有发送优惠券的行为,也是经常遇到发送异常的情况,所以,想 ...

  6. python - 接口自动化测试实战 - case1 - 再次优化版

    本次优化: 1.  各级分Package 2.  封装[ReadExcel]类 3.  封装[ReadConfig]类 4.  封装[GetLog]类 5.  引入ddt数据驱动测试,优化测试用例代码 ...

  7. day01_11.break和continue

    1.continue 下一个(用next更加形象一点)整体的循环没有被破坏掉,而是跳到下一个循环单位中 <?php for($i=1;$i<=10;$i++){ if($i==4){ co ...

  8. 【Luogu】P3971Alice And Bob(贪心)

    题目链接 容易发现值为x的点只可能从值为x-1的点转移过来,所以我们把原序列连成一棵树,dfs序就是原序列的一种形式. 就可以直接求啦 #include<cstdio> #include& ...

  9. HDU——1019Least Common Multiple(多个数的最小公倍数)

    Least Common Multiple Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  10. SJTU Summer Camp

    Day -2,-1 提前坐飞机来到了上海,在旁边的酒店住下来,晚上去了外滩,在黄浦江边吹着晚风,依旧感慨万千,在衡中高三的一年竟然已经过去,经常出现在噩梦中的高考也已成为历史,然而命运可能并未就此改变 ...