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 Files\Java\jre1.8.0_91\bin

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:自定义证书名称

获取安卓 证书 公钥 安卓11安卓证书_https


输入密钥库口令: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

获取安卓 证书 公钥 安卓11安卓证书_获取安卓 证书 公钥_02


其中:-keypass 123456 表示密码是123456(转换时需要用到)其他的同上。

2.1.2生成p12文件

keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore G:\mykey.p12

获取安卓 证书 公钥 安卓11安卓证书_服务器_03


相关信息同上,密码这边假设是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安装服务器证书。

注意:将证书填入到“受信任的根证书颁发机构”

获取安卓 证书 公钥 安卓11安卓证书_服务器_04


再次重新访问服务器,会发现没有不安全的提示了,同时浏览器地址栏上也有个“锁”图标,表示本次会话已经通过HTTPS双向验证。

3.2IOS配置

直接把P12文件 以及sever.cer文件给IOS开发人员就行了

3.3android配置实现 Portecle1.9 需要把jks转换成bks让安卓能识别验证步骤如下:

1.双击运行portecle.jar

获取安卓 证书 公钥 安卓11安卓证书_https_05


此处输入的密码是你生成的bks文件时所用的密码(123456)

获取安卓 证书 公钥 安卓11安卓证书_java_06


然后生成bks文件

获取安卓 证书 公钥 安卓11安卓证书_https_07


这个密码是你给安卓人员的 他们要解析这个证书用的随机(123456)

获取安卓 证书 公钥 安卓11安卓证书_https_08


最后提示SUCCESSFUL 表示成功

获取安卓 证书 公钥 安卓11安卓证书_java_09


**重点:**由于生成生成功后需要保持的,文件名一定要加.bks结尾不然就直接生成了文件了,安卓识别不了

获取安卓 证书 公钥 安卓11安卓证书_https_10


此时把.bks文件和sever.cer文件给安卓开发人员

最后强制tomcat走https

打开Tomcat安装目录中conf/web.xml文件,在最后面加上以下内容即可



CLIENT-CERT

Client Cert Users-only Area





SSL

/*