1 概述

Tomcat从Tomcat8的一些较新版本就支持HTTP/2了,Tomcat9直接支持,本文首先讲述了相关HTTP/2的特性,接着利用一个简单的开源工具mkcert生成证书并利用该证书配置HTTP/2。

2 HTTP/2特性

首先介绍一下HTTP/2特性,这也从另一方面解释了为什么需要使用HTTP/2。

2.1 二进制分帧

HTTP/2在应用层与传输层增加了一个二进制分帧,能够达到“在不改动HTTP语义,HTTP方法,状态码,URI及首部字段的情况下,突破HTTP/1.1的性能限制,改进传输性能,实现低延迟和高吞吐量。”

2.2 压缩头部

HTTP/2对消息头采用了HPACK进行压缩传输,能够节省消息头占用的网络流量,而HTTP/1.x每次请求都会携带大量的冗余头信息,浪费了很多带宽资源。

2.3 多路复用

简单地说就是所有的请求都通过一个TCP连接并发完成。HTTP/1.x虽然能利用一个连接完成多次请求,但是多个请求之间是有先后顺序的,后面发送的请求必须等待上一个请求返回才能发送响应,很容易导致后面的请求被阻塞。而HTTP/2做到了真正的并发请求。

HTTP/2将消息分解为帧,为每帧分配一个流标识符,然后在一个TCP连接上独立发送,HTTP/2将请求帧与响应帧交织在一起,能够让所有请求与响应都在一个套接字上发生,所有请求或响应都无法相互阻塞,减少了延迟,提高了页面加载速度,消除了对HTTP/1.1工具的需求。

2.4 流优先及流控制

消息帧通过对流进行发送,每个流分配了一个优先级,用于确定处理顺序以及收到的资源量,优先级可以是0-256之间的数字,可以定义依赖关系,允许在一个资源之前加载另一个资源。

流控制管理数据的传输,允许接收者停止或减少发送的数据量,比如观看视频暂停时,客户端会通知服务器停止发送视频数据。

2.5 服务器推送

一般情况下需要客户端请求服务器才会响应,HTTP/2中能够先于客户端检测将要请求的资源,提前通知客户端,但是不发送资源只发送URL,客户端收到后会进行验证缓存,发现需要则正式发起请求。

2.6 应用层协商协议

客户端与服务器都升级才能支持HTTP/2,但是有可能存在HTTP/1与HTTP/2并存的情况,如果都使用80端口,需要选择其中一个协议通信。

APLN(Application Layer Protocol Negotiation)就是为了解决这个问题,通过协商选择协议:

  • 首先客户端发起请求,如果支持HTTP/2则带upgrade头部
  • 若服务器不支持则拒绝升级通过HTTP/1.1返回响应
  • 若服务器支持则接受升级,切换到新分帧使用HTTP/2通信

更多请查看RFC7540 官方文档

3 使用mkcert生成证书

网上大部分的教程都是使用OpenSSL生成根证书,客户端证书以及服务端证书的,一堆参数配置非常复杂,因此这里使用一个简单的一键生成本地证书的开源工具mkcert,无需任何配置。

3.1 安装mkcert

3.1.1 MacOS

brew install mkcert
brew install nss # 如果使用火狐

使用MacPorts:

sudo port selftupdate
sudo port install mkcert
sudo port install css # 如果使用火狐

3.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/Manjaro可以使用pacman安装:

sudo pacman -Syu mkcert

或者从源码安装(需要go环境):

git clone https://github.com/FiloSottile/mkcert && cd mkcert
go build -ldflags "-X main.Version=$(git describe --tags)"

或者使用已构建好的版本

3.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

或者使用已构建好的版本

3.2 生成证书

mkcert的命令非常简单,可以使用--help查看帮助:

mkcert --help

3.2.1 安装本地CA证书

mkcert -install

默认会在~/.local/share/mkcert生成CA证书。

3.2.2 利用CA证书签发本地证书

mkcert localhost

其中localhost表示签发本地证书,可以换成example.com*.example.comexample.test127.0.0.1::1之类的域名或者ip。

执行后会在当前文件夹下生成localhost-key.pemlocalhost.pem,前者是私钥,后者是证书。

4 配置Tomcat

Tomcat可以通过两种方式配置HTTP/2,一种是自带的Nio方式,另一种是使用额外库APR,APR-util与TC-Native的方式。

4.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.pemlocalhost.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了:



Tomcat9配置HTTP/2的更多相关文章

  1. [学习笔记]Javaweb开发视频教程之Tomcat9配置

    参考自北京动力节点的视频教程:https://www.bilibili.com/video/av14548279/?p=1 1.Java XE Java SE 是做电脑上运行的软件. Java EE ...

  2. tomcat9配置https

    首先去阿里云申请一个pfx证书,可以免费获得. 其次,在tomcat的server.xml增加如下connector <Connector port="443" protoc ...

  3. tomcat9配置https-pfx

    下载tomcat9 wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.t ...

  4. jdk12+tomcat9 配置

    jdk12 没有了jre的配置   直接配置path就可以了 tomcat常规配置,只是启动的时候麻烦一点   需要重新写入jdk jre jvm 到server.bat文件 参考文章: https: ...

  5. Tomcat9配置SSL连接

    .首先生成数字证书: 使用JDK的keytool命令,生成证书(包含证书/公钥/私钥)到D:\ssl.keystore:keytool -genkey -keystore "D:\ssl.k ...

  6. Tomcat配置https协议访问

    Tomcat9配置https协议访问: https://blog.csdn.net/weixin_42273374/article/details/81010203 配置Tomcat使用https协议 ...

  7. 阿里云服务器在控制台配置网页强制https访问

    最近接触到一个新的网站,网站的访问方式,是http, 因此在浏览器打开的时候老是显示不安全.因此要配置https访问. 首先,先说明服务器是在阿里云的,域名也是阿里云的. 方法一 1 首先在阿里云的c ...

  8. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path解决方案

    0.环境: win7系统,Tomcat9配置无误. 1.错误: 项目中某一.jps页面忽然出现错误,鼠标点上去为:The superclass "javax.servlet.http.Htt ...

  9. Windows下Nginx实现负载均衡

    Apache,Nginx Apache和Nginx都属于属于 静态页面服务器,都有插件支持动态编程语言处理,但Nginx的IO模比Apache更适合跑代理.所以一般都作为前端缓冲代理(Nginx的反向 ...

随机推荐

  1. scrapy 运行逻辑

    爬虫的步骤:发送请求获得响应→解析并提取数据→保存数据 我们沿用这个朴素的逻辑去理解scrapy 一.发送请求获得响应 1.爬虫发送请求request到引擎 2.引擎将请求request传递给调度器s ...

  2. 【python】递归听了N次也没印象,读完这篇你就懂了

    听到递归总觉得挺高大上的,为什么呢?因为对其陌生,那么今天就来一文记住递归到底是个啥. 不过先别急,一起来看一个问题:求10的阶乘(10!). 求x的阶乘,其实就是从1开始依次乘到x.那么10的阶乘就 ...

  3. (十) 数据库查询处理之排序(sorting)

    1. 为什么我们需要对数据排序 可以支持对于重复元素的清除(支持DISTINCT) 可以支持GROUP BY 操作 对于关系运算中的一些运算能够得到高效的实现 2. 引入外部排序算法 对于不能全部放在 ...

  4. SpringCloud之服务调用

    1.Ribbon 1.1负载均衡LB 全称Load Balance,将用户的请求平摊到多个服务器上,从而达到系统的HA.集中式LB:在服务消费者和服务提供者之间使用独立的LB设施,如硬件,由该设施负责 ...

  5. Cannot resolve MVC View

    在搭建springboot项目时报错:Cannot resolve MVC View "index" 那是因为在pom中缺少依赖 <dependency> <gr ...

  6. Android7.0无需FileProvide搞定URI拍照、应用安装问题

    根据官方文档,从Android7.0版本开始 使用URI打开或安装文件需要单独在应用里配置了,问了度娘,有好多版本的结果,个人认为最靠谱的就是下边这个方法,只需在application的oncreat ...

  7. k8s v1.18.2 centos7 下环境搭建

    准备 服务器:3台机器--1台主.2台工作节点,可以使用virtualbox 搭建虚拟机 主机名 centos version ip docker version flannel version 主机 ...

  8. CSS元素层级的概念及性质

    元素的层级的介绍 什么是元素的层级 通过z-index可以改变开启定位元素的层级 父元素的层级再高也不会遮盖住子元素 元素的层级的介绍 什么是元素的层级 当元素开启定位后就会是元素提升一个层级,网页是 ...

  9. Codeforces 682C Alyona and the Tree

    题目链接:http://codeforces.com/problemset/problem/682/C 分析:存图,用dfs跑一遍,详细见注释 1 #include<iostream> 2 ...

  10. Java 常见对象 04

    常见对象·Arrays 类和 包装类 数组高级冒泡排序原理图解 * A:画图演示 * 需求: 数组元素:{24, 69, 80, 57, 13} 请对数组元素进行排序 * 冒泡排序: 相邻元素两两比较 ...