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
了:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。