一、为什么要实施双向认证(Why)
双向认证一般使用在B2B系统或企业内部系统中,目的就是阻止无关人员访问系统,哪怕就一个登录页面也不行。只有系统管理员给你发放了证书,你才能访问到该系统。
二、准备工作(Getting ready)
1.
你系统中要有JDK
2.
你要有一个Servlet容器,这里使用tomcat7
3. 下载BouncyCastle安全工具包,如果你使用Maven管理依赖,请加入下面的依赖项
1 2 3 4 5 6 7 8 9 10 |
|
三、实施(How to do it)
1. 生成一个自签名的CA证书
使用JDK自带的keytool工具生成CA证书
1 2 3 |
|
第一条命令生成pfx格式的keystore,包含私钥;第二条命令导出CA证书。
编程生成CA证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
|
2. 生成服务器证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
|
3.
配置tomcat
将生成的服务器证书daojoo.com.jks拷贝到tomcat的conf目录下
在server.xml中添加一个Connector
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
4. 生成客户端证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
|
四、如何工作(How it works)
1. 添加BCProvider
1 2 3 |
|
2. 解除BCProvider密钥长度限制
下载对应版本jdk的jce不限密钥长度策略文件
Java
Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files
7
Java
Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files
6
解压后替换掉以下目录中的同名文件
$JRE_HOME/lib/security
$JAVA_HOME/jre/lib/security
3. 同一CA颁发的证书序列号一定不能相同。如果在项目中,证书序列号没有业务含义,则可使用uuid,如:
1 2 |
|
4. 当使用X500NameBuilder构建DN时,如果想控制生成的证书中的DN字段顺序,注意最终生成的DN与构建顺序相反
构建时DN字段顺序如下:
1 2 3 4 5 6 7 8 |
|
证书中展现的DN字段顺序如下:
1 2 3 4 5 6 7 |
|
5. 使用keytool生成证书时,我没找到控制证书扩展项的参数。
五、参考资料(Reference)
?1. RFC2459
2. 公钥基础设施(PKI)实现和管理电子安全 清华大学出版社
3. The
Cryptoworkshop Guide to Java Cryptography and the Bouncy Castle
APIs