Tomcat服务器配置https双向认证,使用JDK的keytool生成证书(适用于web、安卓、IOS)
一、原理
1.HTTP:平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的(明文),因此使用HTTP协议传输隐私信息非常不安全。
2.HTTPS:为了保证隐私数据能加密传输,采用SSL/TLS协议用于对HTTP协议传输的数据进行加密,也就是HTTPS。
二、说明
1.原因:因有些情况使用到HTTPS也就是SSL证书验证以便加密信息,所以使用证书
2.选择性:自签免费,不需要金额,CA的收费每年都要给钱的,具体多少没有关注
3.途径:有多种,本人找到了两种,一个的本篇文章叙述的JDK自带的。,还有一个是OPENSSL可以做的。这里不体现出来。
4.生成环境与工具:windows.jdk1.8,tomcat8
三、步骤
1.服务器证书
1.1进入到jdk中jre目录控制台中;
可以在jre文件中按住shift+鼠标右键打开控制台命令
或者cmd命令cd C:Program FilesJavajre1.8.0_91in
1.2.通过keytool命令生成服务端证书(库)
keytool -genkey -v -alias server -keyalg RSA -keystore G:server.keystore -validity 36500
参数说明:G:server.keystore:将名为server.keystore的证书保存到G盘目录下
-validity 36500:证书有效期,36500表示100年,默认值是90天
server:自定义证书名称
在这里插入图片描述
输入密钥库口令:keystore密码(假设使用123456)此密码是隐式性的,所以看不到
您的名字与姓氏是什么:必须是TOMCAT部署主机的域名或者IP[如:123456.com 或者 1192.168.0.1](就是你将来要在浏览器中输入的访问地址),
否则浏览器会弹出警告窗口,提示用户证书与所在域不匹配。在本地做开发测试时,应填入“localhost”。
其他的可以随意填写目前没有出现什么特别情况
输入 的密钥口令:直接回车.
2.客户端证书
2.1证书格式应该是PKCS12,以及jks模式。这第一个P12证书是给浏览器和IOS客户端验证用的,而安卓不能用keystore的密码库所以要生成jks然后通过工具转换成bks。
2.1.1以下是生产安卓端所用的jks文件
keytool -genkeypair -alias client -keyalg RSA -validity 36500 -keypass 123456 -storepass 123456 -keystore G:client.jks
在这里插入图片描述
其中:-keypass 123456 表示密码是123456(转换时需要用到)其他的同上。
2.1.2生成p12文件
keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore G:mykey.p12
在这里插入图片描述
相关信息同上,密码这边假设是123456
3.让服务器信任客户端证书
3.1由于不能直接将PKCS12格式以及jks格式的的证书库导入,必须先把客户端证书导出为一个单独的CER文件,使用如下命令: (下面要用到客户端证书密码“123456”)
P12生成cer
keytool -export -alias mykey -keystore G:mykey.p12 -storetype PKCS12 -storepass 123456 -rfc -file G:mykey.cer
jks 生成 cer
keytool -export -alias client -file G:client.cer -keystore G:client.jks -storepass 123456
3.2将证书导入到服务器的证书库中
p12转换的cer导入到server库中
keytool -import -v -file G:mykey.cer -keystore G:server.keystore
将jks转换的cer导入到server库中
keytool -import -v -alias client -file G:client.cer -keystore G:server.keystore -storepass 123456
4.双向验证
由于是双向SSL认证,客户端也要验证服务器证书。把服务器证书导出为一个单独的CER文件提供给客户端,使用如下命令:
keytool -keystore G:server.keystore -export -alias server -file G:server.cer
至此证书生成完成
3.证书的使用配置
3.1浏览器服务器配置
3.1.1服务器tomcat的配置
打开Tomcat根目录下的/conf/server.xml,找到Connector port="8443"配置段,修改为如下:
clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
keystoreFile:服务器证书文件路径
keystorePass:服务器证书密码
truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
truststorePass:根证书密码
浏览器输入https://192.168.0.1/8443 则会报无效证书或者链接不安(证书没有配置)
3.1.2双击“mykey.p12”导入客户端证书
再次使用浏览器访问服务端,浏览器会让我们选择使用的证书。
3.1.3.导入服务器公钥证书(server.cer)
由于是自签名的证书,为避免每次都提示不安全。这里双击server.cer安装服务器证书。
注意:将证书填入到“受信任的根证书颁发机构”
在这里插入图片描述
再次重新访问服务器,会发现没有不安全的提示了,同时浏览器地址栏上也有个“锁”图标,表示本次会话已经通过HTTPS双向验证。
3.2IOS配置
直接把P12文件 以及sever.cer文件给IOS开发人员就行了
3.3android配置实现 Portecle1.9
需要把jks转换成bks让安卓能识别验证步骤如下:
1.双击运行portecle.jar
在这里插入图片描述
此处输入的密码是你生成的bks文件时所用的密码(123456)
在这里插入图片描述
然后生成bks文件
生成BKS
这个密码是你给安卓人员的 他们要解析这个证书用的随机(123456)
在这里插入图片描述
最后提示SUCCESSFUL 表示成功
在这里插入图片描述
**重点:**由于生成生成功后需要保持的,文件名一定要加.bks结尾不然就直接生成了文件了,安卓识别不了
在这里插入图片描述
此时把.bks文件和sever.cer文件给安卓开发人员
最后强制tomcat走https
打开Tomcat安装目录中conf/web.xml文件,在最后面加上以下内容即可
CLIENT-CERT
Client Cert Users-only Area
SSL
/*
CONFIDENTIAL
四、其他相关说明
使用工具转换多次时会报异常这是因为如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size 异常. 因为密钥长度是受限制的, java运行时环境读到的是受限的policy文件. 文件位于${java_home}/jre/lib/security, 这种限制是因为美国对软件出口的控制
解决方案:去官方下载JCE无限制权限策略文件。