Tomcat 入门实战(3)--Https 配置
本文主要介绍如何在 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/keytool mkdir -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.key openssl req -new -key ca.key -out ca.csr openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.pem
2.3.2、生成服务端证书
openssl genrsa -out server.key openssl req -new -key server.key -out server.csr openssl ca -days 3650 -in server.csr -cert ca.pem -keyfile ca.key -out server.pem
2.3.3、生成客户端证书
openssl genrsa -des3 -out client.key 2048 openssl req -new -key client.key -out client.csr openssl ca -days 1500 -in client.csr -cert ca.pem -keyfile ca.key -out client.pem openssl pkcs12 -export -clcerts -in client.pem -inkey client.key -out client.p12
2.3.4、根证书导入信任库
cd ../keytool
keytool -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