以前写了一篇博文,用tomcat和jdk 的keytools搭建https环境,但是是属于单向验证的,如果自己需要的环境是单向验证的环境,可以参考 用tomcat搭建https
一、jdk自带的工具keytool生成服务器端证书和客户端证书
keytool参数解释
keytool -genkey
-alias 证书别名
-keypass 证书密码
-keyalg 所使用的加密算法,例如:RSA
-keysize 秘钥长度,例如1024
-validity 有效期,以天为单位,默认是90天
-keystore 指定生成证书的位置和证书名称
-storepass 获取keystore信息的密码
利用keytool工具生成证书
在此示例中,我的密码使用的bkyapp
第一步:为服务器生成证书
keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -validity 365 -keystore D:/certs/server.keystore
注意:您的姓氏名字这个是必填项,当在本机测试的时候可以填写localhost,但是当时生产环境中,必须填写域名或者IP,例如www.baidu.com,要不然浏览器会弹出警告信息,提示用户证书和所在域不匹配
第二步:为客户端生成证书
keytool -genkey -alias mykey -keyalg RSA -storetype PKCS12 -keypass bkyapp -storepass bkyapp -keystore D:/certs/client.p12
生成客户端证书以后,双击client.p12文件,然后安装到可信任的第三方发布者列表中即可
第三步:让服务端信任客户端证书
keytool -export -alias mykey -keystore D:/certs/client.p12 -storetype PKCS12 -keypass bkyapp -file D:certs/client.cer
由于服务端并不认识p12格式的客户端证书,所以需要把客户端证书转化为cer格式
keytool -import -v -file D:/certs/client.cer -keystore D:/certs/server.keystore
以上命令,导入客户端证书client.cer 到server.keystore文件中,
此时可以运行 keytool -list -v -keystore D:/certs/server.keystore 查看server.keystore中有几个证书
C:\Program Files\Java\jdk1.8.0_40\bin>keytool -list -v -keystore D:/certs/server.keystore
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 2 个条目
别名: tomcat
创建日期: 2016-2-27
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
发布者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
序列号: 2feeb67a
有效期开始日期: Sat Feb 27 00:15:17 CST 2016, 截止日期: Sun Feb 26 00:15:17 CST 2017
证书指纹:
MD5: 8F:CD:23:13:3F:DE:11:34:FB:1A:13:3A:63:7A:A8:C2
SHA1: 5A:86:8B:8E:F3:8A:0D:54:6A:5D:05:F7:C5:C6:B9:6E:42:C2:9A:6B
SHA256: 85:29:0C:8C:17:9B:4E:FB:2D:1E:98:4B:CF:05:9D:B5:7B:DA:62:88:C6:DC:5F:5D:F0:FC:EA:7D:B1:D1:8D:1D
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 3D B0 2F CD 1C 55 EF F9 3D 55 A5 79 1E A9 48 7F =./..U..=U.y..H.
0010: C6 6C F5 77 .l.w
]
]
可以看出秘钥库中包含了两个条目
第四步:让客户端信任服务器证书
keytool -keystore D:/certs/server.keystore -export -alias tomcat -file D:/certs/server.cer
由于浏览器是不认keystore格式的证书的,所以要把服务器的keystore格式的正式转化为cer证书,证书生成以后,双击server.cer证书,然后安装到“受信任的根证书颁发机构”中
以上过程总共生成四个文件,四个文件如下图:
总结下来,证书的生成也就是五条命令,如果不想读上面过程的话,直接按照次序运行下面五条命令即可:
keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -validity 365 -keystore D:/certs/server.keystore
keytool -genkey -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:/certs/client.p12
keytool -export -alias mykey -keystore D:/certs/client.p12 -storetype PKCS12 -file D:/certs/client.cer
keytool -import -v -file D:/certs/client.cer -keystore D:/certs/server.keystore
keytool -keystore D:/certs/server.keystore -export -alias tomcat -file D:/certs/server.cer
二、配置tomcat服务器
修改tomcat根目录下conf文件夹下的server.conf文件,默认情况下,8443端口是关闭的,下面这段代码是被注释掉的,打开然后进行配置即可
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="D:/certs/server.keystore"
keystorePass="bkyapp"
truststoreFile="D:/certs/server.keystore"
truststorePass="bkyapp" />
clientAuth 表示是否对客户端进行校验,如果设置为false,则配置的是单向验证,即客户端对服务器做验证,但是服务器并不对客户端验证,只有把clientAuth设置为true,才是双向验证,然后设置keystoreFile和truststoreFile的位置和密码
修改完毕以后,启动tomcat访问localhost:8443即可
通过chrom浏览器访问,可以在地址栏看到一个锁的小图标
三:相关说明
如果你按照上面步骤做,并且最后看到正确的结果,过程不想看的话,下面的就不需要再看了,如果想看一下我操作的过程,可以接着往下阅读
1、生成证书的整个shell文件
C:\Program Files\Java\jdk1.8.0_40\bin>keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -validity 365 -keystore D:/certs/server.keystore
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: localhost
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的省/市/自治区名称是什么?
[Unknown]:
该单位的双字母国家/地区代码是什么?
[Unknown]:
CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
[否]: y
输入 <tomcat> 的密钥口令
(如果和密钥库口令相同, 按回车):
C:\Program Files\Java\jdk1.8.0_40\bin>keytool -genkey -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:/certs/client.p12
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: localhost
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的省/市/自治区名称是什么?
[Unknown]:
该单位的双字母国家/地区代码是什么?
[Unknown]:
CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
[否]: y
C:\Program Files\Java\jdk1.8.0_40\bin>keytool -export -alias mykey -keystore D:/certs/client.p12 -storetype PKCS12 -file D:/certs/client.cer
输入密钥库口令:
存储在文件 <D:/certs/client.cer> 中的证书
C:\Program Files\Java\jdk1.8.0_40\bin>keytool -import -v -file D:/certs/client.cer -keystore D:/certs/server.keystore
输入密钥库口令:
所有者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
发布者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
序列号: 1896b2e8
有效期开始日期: Sat Feb 27 00:16:58 CST 2016, 截止日期: Fri May 27 00:16:58 CST 2016
证书指纹:
MD5: A8:72:9E:8E:55:E0:20:D4:19:98:4A:59:4E:7A:61:71
SHA1: 13:9E:CB:4A:1F:1B:BB:62:DB:A4:C8:ED:9D:1B:EF:9B:FB:DA:AF:BD
SHA256: 3F:88:F4:E3:32:0F:07:0A:08:E0:C1:EB:56:47:4B:9A:99:F2:2C:4D:63:77:44:18:97:CE:0E:73:6F:C4:71:B7
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: DC 66 45 59 38 B7 06 C6 2D 64 8A 53 4C E9 A2 8F .fEY8...-d.SL...
0010: 07 8A 04 E7 ....
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
[正在存储D:/certs/server.keystore]
C:\Program Files\Java\jdk1.8.0_40\bin>keytool -keystore D:/certs/server.keystore -export -alias tomcat -file D:/certs/server.cer
输入密钥库口令:
存储在文件 <D:/certs/server.cer> 中的证书
C:\Program Files\Java\jdk1.8.0_40\bin>keytool -list -v -keystore D:/certs/server.keystore
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 2 个条目
别名: tomcat
创建日期: 2016-2-27
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
发布者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
序列号: 2feeb67a
有效期开始日期: Sat Feb 27 00:15:17 CST 2016, 截止日期: Sun Feb 26 00:15:17 CST 2017
证书指纹:
MD5: 8F:CD:23:13:3F:DE:11:34:FB:1A:13:3A:63:7A:A8:C2
SHA1: 5A:86:8B:8E:F3:8A:0D:54:6A:5D:05:F7:C5:C6:B9:6E:42:C2:9A:6B
SHA256: 85:29:0C:8C:17:9B:4E:FB:2D:1E:98:4B:CF:05:9D:B5:7B:DA:62:88:C6:DC:5F:5D:F0:FC:EA:7D:B1:D1:8D:1D
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 3D B0 2F CD 1C 55 EF F9 3D 55 A5 79 1E A9 48 7F =./..U..=U.y..H.
0010: C6 6C F5 77 .l.w
]
]
*******************************************
*******************************************
别名: mykey
创建日期: 2016-2-27
条目类型: trustedCertEntry
所有者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
发布者: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
序列号: 1896b2e8
有效期开始日期: Sat Feb 27 00:16:58 CST 2016, 截止日期: Fri May 27 00:16:58 CST 2016
证书指纹:
MD5: A8:72:9E:8E:55:E0:20:D4:19:98:4A:59:4E:7A:61:71
SHA1: 13:9E:CB:4A:1F:1B:BB:62:DB:A4:C8:ED:9D:1B:EF:9B:FB:DA:AF:BD
SHA256: 3F:88:F4:E3:32:0F:07:0A:08:E0:C1:EB:56:47:4B:9A:99:F2:2C:4D:63:77:44:18:97:CE:0E:73:6F:C4:71:B7
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: DC 66 45 59 38 B7 06 C6 2D 64 8A 53 4C E9 A2 8F .fEY8...-d.SL...
0010: 07 8A 04 E7 ....
]
]
*******************************************
*******************************************
2、不启用对客户端验时,客户端显示出来的消息
首先会报警,说是不是安全连接,然后点击高级,强制访问的话,也是可以访问的,但是在浏览器地址栏https会被划掉
3、在tomcat中开启客户端校验,但是客户端未导入证书时,服务器地址会无法访问,出现客户端验证失败
另外附上我生成的certs文件
你也可以直接下载的certs文件,部署到本机的tomcat下面,访问localhost
http://pan.baidu.com/s/1o6Uoycq
来源:oschina
链接:https://my.oschina.net/u/2457218/blog/625470