Tomcat 配置 SSL (单向认证、双向认证)

时间:2021-08-09 19:39:51

生成证书


在 JDK 中自带了生成证书的工具 keytool,有兴趣大家可以去了解一下。


用keytool创建一个证书库,里面存放服务器信任的CA证书,也就是只有这些CA签发的客户端个人证书才被服务器信任,才能通过HTTPS访问服务器。


生成服务端密匙库



使用以下命令
keytool -genkey -alias test1 -keystore server.keystore -keyalg RSA -validity 3650

执行以上命令后,提示以下:

输入keystore密码: strongit

您的名字与姓氏是什么?

[Unknown]: dsjkzj.gdpost.com.cn

您的组织单位名称是什么?

[Unknown]: GDPOST

您的组织名称是什么?

[Unknown]: Server

您所在的城市或区域名称是什么?

[Unknown]: Guangzhou

您所在的州或省份名称是什么?

[Unknown]: Guangdong

该单位的两字母国家代码是什么

[Unknown]: CN

CN=dsjkzj.gdpost.com.cn, OU=GDPOST, O=Server, L=Guangzhou, ST=Guangdong, C=CN 正确吗?

[否]: y

 

输入<dsjkzj.gdpost.com.cn>的主密码

        (如果和 keystore 密码相同,按回车):


当然也可以直接在命令中完成:
keytool -keystore server.keystore -keypass 123456 -storepass 123456 -alias test1 -genkey -keyalg RSA -dname " CN=localhost" -validity 3650

命令含义:
  • genkey:告诉keytool应用程序生成新的公钥/私钥对。
  • alias:用于引用密钥的名称。记住,.keystore文件可包含多个密钥。
  • Keyalg:使用RSA算法生成公钥/私钥对。
  • Storepass:访问.keystore文件所需的口令。
  • Keypass:管理密钥所需的口令。
  • dname:该值非常重要。.我使用了localhost,因为该示例被设计为本地运行。如果一个Web应用程序被注册http://www.myserver.com,那么该值就必须是www.myserver.com。如果名称不匹配,证书就会自动被拒绝
  • keystore: 指定文件名,则文件生成到当前目录下,如果不指定该参数就会在HOME目录下生成一个.keystore文件,建议指定。

这时候我们得到一个 server.keystore 的文件。


生成客户端信任库


首先输出RSA证书(公钥):

keytool -export -alias test1 -file server.cer -storepass 123456 -keystore server.keystore
根据我们刚刚生成的密匙库生成公钥。

命令含义(以上介绍过的不在重复介绍):

  • Export:导出。
  • File : 指定文件名,生成到当前目录下。
  • Keystore : 指定密匙库文件。

然后把RSA证书输入到一个新的信任库文件中。这个信任库被客户端使用,被用来验证服务器端的身份。

keytool -import -file server.cer -storepass 123456 -keystore client.truststore -alias test1 -noprompt
根据我们刚刚生成公钥导入到信任库中,生成一个信任库文件 client.truststore

命令含义(以上介绍过的不在重复介绍):

  • Import :导入。
  • Noprompt: 是否弹出确认信息。


以上我们的密匙库和信任库都已经生成好了。


Tomcat配置SSL


单向认证



更改 tomcatHome\conf\server.xml 文件,找到以下节点
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

修改为以下:
<Connector port="8080"
redirectPort="8443"
protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false"
keystoreFile="conf/server.keystore" keystorePass="123456"
sslProtocol="TLS" />


注意:
  • keystoreFile:属性指向密匙库的文件,可以是绝对路径也可以是相对路径(当然文件要放在Tomcat目录里面)。
  • clientAuth:是否客户端也需要信任服务端(客户端需要验证服务端,指双向认证)。

这时候Tomcat就支持SSL了,马上去浏览器体验一下吧。

单向认证访问浏览器时不导入服务端的证书也是可以访问的,只是会提示“此网站的安全证书有问题,是否继续访问”。

双向认证



以同样的方式在客户端生成密匙库和信任库,这时候我们就需要在服务端,也就是Tomcat加入客户端的信任。
其实也简单,稍稍改动就可以啦。
更改 tomcatHome\conf\server.xml 文件,找到以下节点
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

修改为以下:
<Connector port="8080"
redirectPort="8443"
protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="true"
keystoreFile="conf/server.keystore" keystorePass="123456"
truststoreFile="conf/client.truststore" truststorePass="123456"
sslProtocol="TLS" />





这时候在我们访问服务端的时候就必须要将证书(客户端)导入了,因为客户端也必须验证服务端是否是信任的,否则会提示“SSL节点无法核实您的证书,错误码: ssl_error_bad_cert_alert”。