本文主要介绍如何在 Tomcat 中配置 Https,文中所使用到的软件版本:Centos 7.9.2009、Java 1.8.0_321、Tomcat 8.5.84。

1、Tomcat SSL 实现

Tomcat 有三种 SSL 的实现:

  • JSSE implementation provided as part of the Java runtime
  • JSSE implementation that uses OpenSSL
  • APR implementation, which uses the OpenSSL engine by default

Tomcat 会根据环境自动选择相应的实现。如果没有安装 tomcat-native,则使用第一种实现;如果安装了 tomcat-native,当 Connector 的protocol 属性配置为 “HTTP/1.1″时,使用第二种实现,当protocol 配置为 “org.apache.coyote.http11.Http11AprProtocol” 时使用第三种实现。

2、生成密钥库及证书2.1、创建目录

在 Tomcat 根目录下创建 ssl/keytool 目录,用于存放 keytool 生成的密钥库及导出的证书,创建 ssl/openssl 目录,用于存放 OpenSSL 生成的证书。

mkdir -p ssl/keytoolmkdir -p ssl/openssl

2.2、生成密钥库

使用 Java 自带的 keytool 工具在ssl/keytool 目录下生成密钥库。

2.2.1、生成服务端密钥库

keytool -genkeypair -alias tomcat -keyalg RSA -keystore server.keystore -storetype pkcs12 --storepass 123456

2.2.2、生成客户端密钥库

keytool -genkeypair -alias someone -keyalg RSA -keystore client.p12 -storetype pkcs12 --storepass 123456

如果服务端开启客户端认证(需要验证客户端的证书),需要使用把该密钥库导入客户端。

2.2.3、生成信任密钥库

keytool -exportcert -keystore client.p12 --storepass 123456 -alias someone -file client.cer #先从客户端密钥库导出证书keytool -importcert -keystore trust.keystore -file client.cer -alias someone -storetype pkcs12 --storepass 123456 #把客户端证书导入信任库

信任密钥库用于校验客户端证书是否有效。

keytool 的详细使用可参考Java Keytool 介绍。

2.3、生成证书

使用 OpenSSL 在 ssl/openssl 目录下生成证书。

2.3.1、生成根证书

openssl genrsa -out ca.keyopenssl req -new -key ca.key -out ca.csropenssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.pem

2.3.2、生成服务端证书

openssl genrsa -out server.keyopenssl req -new -key server.key -out server.csropenssl ca -days 3650 -in server.csr -cert ca.pem -keyfile ca.key -out server.pem

2.3.3、生成客户端证书

openssl genrsa -des3 -out client.key 2048openssl req -new -key client.key -out client.csropenssl ca -days 1500 -in client.csr -cert ca.pem -keyfile ca.key -out client.pemopenssl pkcs12 -export -clcerts -in client.pem -inkey client.key -out client.p12

2.3.4、根证书导入信任库

cd ../keytoolkeytool -importcert -keystore trust.keystore -file ../openssl/ca.pem -alias ca -storetype pkcs12 --storepass 123456

OpenSSL 生成证书的详细使用可参考OpenSSL 介绍(5)–数字证书。

3、未安装Tomcat Native Library 配置 Https

主要修改 conf/server.xml 中的 Connector 配置。

3.1、使用 keytool 生成的密钥库配置 Https

<Connector port="8443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true">    <SSLHostConfig>        <Certificate certificateKeystoreFile="ssl/keytool/server.keystore"             certificateKeystorePassword="123456" certificateKeyAlias="tomcat" type="RSA" />    </SSLHostConfig></Connector>

如果需要开启客户端认证,则配置如下:

<Connector port="8443" protocol="HTTP/1.1"           maxThreads="150" SSLEnabled="true">    <SSLHostConfig certificateVerification="required" truststoreFile="ssl/keytool/trust.keystore" truststorePassword="123456">        <Certificate certificateKeystoreFile="ssl/keytool/server.keystore"             certificateKeystorePassword="123456" certificateKeyAlias="tomcat"             type="RSA" />    </SSLHostConfig></Connector>

3.2、使用 OpenSSL 生成的证书配置 Https

<Connector port="8443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true">    <SSLHostConfig>        <Certificate certificateKeyFile="ssl/openssl/server.key"             certificateFile="ssl/openssl/server.pem" type="RSA" />    </SSLHostConfig></Connector>

如果需要开启客户端认证,则配置如下:

<Connector port="8443" protocol="HTTP/1.1"           maxThreads="150" SSLEnabled="true">    <SSLHostConfig certificateVerification="required" truststoreFile="ssl/keytool/trust.keystore" truststorePassword="123456">        <Certificate certificateKeyFile="ssl/openssl/server.key"             certificateFile="ssl/openssl/server.pem" type="RSA" />    </SSLHostConfig></Connector>

由于这里 SSL 使用的是第一种实现,所以仍需通过truststoreFile 及truststorePassword 属性配置信任库来验证客户端证书,否则可以通过 caCertificateFile 配置根证书来验证客户端证书。

4、安装了Tomcat Native Library 配置 Https

tomcat-native 的安装可参考:Tomcat 入门实战(2)–Tomcat Native Library 使用。

<Connector port="8443" protocol="HTTP/1.1"                maxThreads="150" SSLEnabled="true">    <SSLHostConfig>        <Certificate certificateKeyFile="ssl/openssl/server.key"             certificateFile="ssl/openssl/server.pem" type="RSA" />    </SSLHostConfig></Connector>

如果需要开启客户端认证,则配置如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"                maxThreads="150" SSLEnabled="true">    <SSLHostConfig certificateVerification="required" caCertificateFile="ssl/openssl/ca.pem">        <Certificate certificateKeyFile="ssl/openssl/server.key"             certificateFile="ssl/openssl/server.pem" type="RSA" />    </SSLHostConfig></Connector>

这里protocol 设为”org.apache.coyote.http11.Http11AprProtocol” 以启用 APR,设置为 “HTTP/1.1” 时不启用 APR。

5、客户端访问

如果服务端(Tomcat) 开启了客户端认证,需要把 2.3.2 生成的客户端密钥库、2.3.2 生成的客户端密钥导入浏览器才能访问,否则拒绝访问;Java 客户端的访问可参考:https://www.cnblogs.com/wuyongyin/tag/Http。

参考:

https://tomcat.apache.org/tomcat-8.5-doc/ssl-howto.html

https://tomcat.apache.org/tomcat-8.5-doc/config/http.html