Tomcat9配置HTTP/2
1 概述
Tomcat从Tomcat8的一些较新版本就支持HTTP/2了,Tomcat9直接支持,本文讲述了如何利用一个简单的开源工具mkcert生成证书并利用该证书配置HTTP/2访问。
2 使用mkcert生成证书
网上大部分的教程都是使用OpenSSL生成根证书,客户端证书以及服务端证书的,一堆参数配置非常复杂,因此这里使用一个简单的一键生成本地证书的开源工具mkcert,无需任何配置。
2.1 安装mkcert
2.1.1 MacOS
brew install mkcert
brew install nss # 如果使用火狐
使用MacPorts:
sudo port selftupdate
sudo port install mkcert
sudo port install css # 如果使用火狐
2.1.2 Linux
需要先安装certutil:
#Debian/Ubuntu
sudo apt install libnss3-tools
#Red Hat/Fedora/CentOS
sudo yum install nss-tools
#Arch/Manjaro
sudo pacman -S nss
#SUSE
sudo zypper install mozilla-nss-tools
使用LinuxBrew安装:
brew install mkcert
安装LinuxBrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Arch系可以使用pacman安装:
sudo pacman -Syu mkcert
或者从源码安装(需要Go环境):
git clone https://github.com/FiloSottile/mkcert && cd mkcert
go build -ldflags "-X main.Version=$(git describe --tags)"
或者使用已构建好的版本。
2.1.3 Windows
安装Chocolatey(以管理员运行PowerShell):
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
或安装Scoop(管理员PowerShell):
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
# 或
iwr -useb get.scoop.sh | iex
使用Chocolatey或Scoop安装:
choco install mkcert
#或
scoop bucket add extras
scoop install mkcert
或者使用已构建好的版本。
2.2 生成证书
mkcert的命令非常简单,可以使用--help查看帮助:
mkcert --help
2.2.1 安装本地CA证书
mkcert -install
默认会在~/.local/share/mkcert生成CA证书。
2.2.2 利用CA证书签发本地证书
mkcert localhost
其中localhost表示签发本地证书,可以换成example.com,*.example.com,example.test,127.0.0.1,::1之类的域名或者IP。
执行后会在当前文件夹下生成localhost-key.pem与localhost.pem,前者是私钥,后者是证书。
3 配置Tomcat
Tomcat可以通过两种方式配置HTTP/2,一种是自带的Nio方式,另一种是使用额外库APR,APR-util与TC-Native的方式。
3.1 使用Nio
通过Nio配置HTTP/2需要结合OpenSSL与keytool将证书转换为pkcs#12再转换为jks:
openssl pkcs12 -export -inkey localhost-key.pem -in localhost.pem -out localhost.p12
会提示输入导出密码,需要记住,转换成jks时需要用到。

接着转换为jks:
keytool -importkeystore -srckeystore localhost.p12 -srcstoretype pkcs12 -destkeystore localhost.jks
这里会提示输入目标keystore与源keystore的密码,目标keystore密码一会在修改server.xml时需要用到,源keystore密码就是上面的导出密码。

接着复制localhost.jks到Tomcat的conf下并修改server.xml:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost.jks"
certificateKeystorePassword="111111"
type="RSA" />
</SSLHostConfig>
</Connector>
添加了升级协议(默认HTTP/1.1):
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
另外certificateKeystorePassword是上一步的目标keystore的密码。
完成后开启Tomcat并访问https://localhost:8443:


4.2 使用APR
使用APR不需要对证书进行额外的转换,但是需要安装三个库:
笔者的Manjaro可以直接包管理器安装:
sudo pacman -S apr apr-util tomcat-native
其他系统请自行使用包管理器或者按上面的官网链接进行编译安装。
复制localhost-key.pem与localhost.pem到Tomcat的conf目录下,并修改server.xml:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/localhost-key.pem"
certificateFile="conf/localhost.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
开启Tomcat后就可以访问https://localhost:8443了:



浙公网安备 33010602011771号