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

 

 

posted @ 2023-03-26 10:45  且行且码  阅读(1864)  评论(0编辑  收藏  举报