zoukankan      html  css  js  c++  java
  • Tomcat9配置HTTP/2

    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了:
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案
    深入浅出 eBPF 安全项目 Tracee
    Unity3d开发的知名大型游戏案例
    Unity 3D 拥有强大的编辑界面
    Unity 3D物理引擎详解
    Unity 3D图形用户界面及常用控件
    Unity 3D的视图与相应的基础操作方法
    Unity Technologies 公司开发的三维游戏制作引擎——Unity 3D
    重学计算机
    windows cmd用户操作,添加,设备管理员组,允许修改密码
  • 原文地址:https://www.cnblogs.com/6b7b5fc3/p/13065851.html
Copyright © 2011-2022 走看看