利用tomcat ,jdk tools 搭建HTTPS双向验证环境

大憨熊 提交于 2019-12-03 19:22:55

以前写了一篇博文,用tomcat和jdk 的keytools搭建https环境,但是是属于单向验证的,如果自己需要的环境是单向验证的环境,可以参考  用tomcat搭建https

一、jdk自带的工具keytool生成服务器端证书和客户端证书

  1. keytool参数解释

     keytool -genkey

    -alias 证书别名

    -keypass 证书密码 

    -keyalg 所使用的加密算法,例如:RSA

    -keysize 秘钥长度,例如1024

    -validity 有效期,以天为单位,默认是90天

    -keystore 指定生成证书的位置和证书名称

    -storepass 获取keystore信息的密码

  2. 利用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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!