Tomcat8+keytool实现HTTPS双向认证

环境信息

操作系统 CentOS7 7.3.1611

Tomcat版本 8.5.23.0

java版本 1.8.0_144-b01

HTTPS简介

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

HTTPS认证解释

HTTPS的认证方式可分为两种:

第一种是单向认证,证书根机构认证服务器单方面无异常便允许所有用户访问。

第二种是双向认证,此时需要证书根机构认证服务器和客户端两方面均无问题后才允许两者之间使用HTTPS协议互相通信,这种认证机制更大提高了网络数据传输的安全性。

客户端认证服务器端身份

创建密钥库

该密钥库来存储服务端的私钥和自签名证书,名称拟定为 server.store,命令如下:

keytool -genkey -v -alias server -keyalg RSA -keystore server.store -validity 36500

Tomcat8+keytool实现HTTPS双向认证

密钥库需要设置密码,本文档密码为123456,真实环境下建议设置高强度密码。

导出CA证书

从服务端的密钥库中导出证书作为后期来验证服务器证书的CA,命令如下:

keytool -keystore server.store -export -alias server -file forclient.ce?r

Tomcat8+keytool实现HTTPS双向认证

客户机安装CA证书

将forclient.cer导出到访问者电脑中,双击生成的CER文件打开。

Tomcat8+keytool实现HTTPS双向认证

点击安装证书,直接点下一步,选择将所有的证书放入下列存储,然后点击浏览按钮,最后选择受信任的根证书颁发机构,点击确定。

Tomcat8+keytool实现HTTPS双向认证

点击下一步和完成按钮会出现安全性警告,点击按钮是。

Tomcat8+keytool实现HTTPS双向认证

然后弹出导入成功的信息框,代表证书导入成功。

Tomcat8+keytool实现HTTPS双向认证

服务器端认证客户端证书

创建客户端密钥库和证书

keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -validity 36500

Tomcat8+keytool实现HTTPS双向认证

文档中使用的密码为 123456 正式环境中建议使用高强度密码

导出客户端证书

导出证书名为 forserver.cer

keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file forserver.cer

Tomcat8+keytool实现HTTPS双向认证

服务器端密钥库信任客户端证书

使用下面命令将客户端证书导入到服务器端密钥库中:

keytool -import -v -file forserver.cer -keystore server.store ?

Tomcat8+keytool实现HTTPS双向认证

验证是否信任成功

keytool -list -keystore server.store

完成导入后,可以查看一下服务端密钥库中导入的证书列表,可以发现多了个mykey的证书,这就是导入?的客户端的证书,如下图:

Tomcat8+keytool实现HTTPS双向认证

安装客户端证书

生成的client.p12是个人证书,将证书下载到访问者本地,双击打开该文件,点击两次下一步跳过开始界面和证书位置选择界面,到达密钥键入界面。输入刚才设置的密码,本文档密码为123456

Tomcat8+keytool实现HTTPS双向认证

输入密码后点击下一步到达证书存储位置选择界面,可直接跳过,也可选择为个人。

Tomcat8+keytool实现HTTPS双向认证

然后点击下一步和完成按钮弹出导入成功的提示代表导入完成。

Tomcat8+keytool实现HTTPS双向认证

配置Tomact

最后只需要配置Tomcat的server.xml,开启HTTPS的Connector,添加参数配置密钥库的路径和密码。注意:该配置代码是直接添加来的,并非通过修改模板而来,格式虽然与模板不同但有效。

Tomcat8+keytool实现HTTPS双向认证

<Connector port="8443"

protocol="org.apache.coyote.http11.Http11Protocol"

maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

clientAuth="true" sslProtocol="SSL"

keystoreFile="../bin/server.store" keystorePass="123456"

truststoreFile="../bin/server.store" truststorePass="123456" />

简单解释:

clientAuth=”true” 字段代表启动双向认证,如果参数值为false则为不启动双向认证。

keystoreFile和keysotrePass是配置密钥库的位置的参数

truststoreFile和truestorePass是配置信任密钥库的位置和密码。

?

测试和验证

证书状态检查

依次打开Internet选项 – 内容 – 证书 可以看到系统中安装的所有证书信息。在个人选项卡中可以看到刚才由client.p12安装的客户端证书。

Tomcat8+keytool实现HTTPS双向认证

在受信任的根证书颁发机构选项卡中可以看到由forclient.cer安装的CA证书。

Tomcat8+keytool实现HTTPS双向认证

如果两个证书都可以找到代表证书已经成功安装。

客户端无证书访问测试

注意:以下测试结果是在未安装证书时记录的。

使用浏览器访问配置了双向认证的网站,例如:

https://192.168.1.107:8443/

当客户端未安装所须证书时双向认证是无法成立的,所以是无法正常访问目标网站的,可能会出现许多异常报错,下图所示错误信息为典型报错:

Tomcat8+keytool实现HTTPS双向认证

双向认证访问测试

使用浏览器访问URL

https://192.168.1.107:8443/

会弹出如下提示:

Tomcat8+keytool实现HTTPS双向认证

点击确定按钮继续访问,会出现如下界面,则代表双向认证方式访问正常、配置正确。

Tomcat8+keytool实现HTTPS双向认证

点击地址栏中的锁图标会出现提示,提示消息中会说明本次访问是加密的。

Tomcat8+keytool实现HTTPS双向认证

其他

证书生成填写信息解释

What is your first and last name? #输入姓名,服务器填写IP地址或者域名,客户端填写任意名称

[Unknown]: 192.168.1.107

What is the name of your organizational unit? #单位名称

[Unknown]: 5EC8

What is the name of your organization? #组织名称

[Unknown]: 5EC8

What is the name of your City or Locality? #市区缩写

[Unknown]: BJ

What is the name of your State or Province? #省份缩写

[Unknown]: BJ

What is the two-letter country code for this unit? #国家代码

[Unknown]: CN

Is CN=192.168.1.107, OU=5EC8, O=5EC8, L=BJ, ST=BJ, C=CN correct?

[no]: y #确认输入y、yes都可以,取消输入no

Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 36,500 days

for: CN=192.168.1.107, OU=5EC8, O=5EC8, L=BJ, ST=BJ, C=CN

Enter key password for <server>

(RETURN if same as keystore password): #密钥口令,如与密钥库口令相同直接回车

文章均为本站原创,转载请注明出处为安全吧!