Nginx 部署支持 TLS1.3

目前主流支持的 TLS 协议版本是 1.1 和 1.2,分别发布于 2006年和2008年,也都已经落后于时代的需求了。在2018年8月份,IETF终于宣布TLS 1.3规范正式发布了,标准规范(Standards Track)定义在 rfc8446。

TLS 1.3 相较之前版本的优化内容有:

  • 针对常见的 Web 资源内容,Brotli 的性能相比 Gzip 提高了 17-25%;
  • 应用数据:在会话复用场景下,支持 0-RTT 发送应用数据;
  • 握手消息:从 ServerHello 之后都是密文;
  • 会话复用机制:弃用了 Session ID 方式的会话复用,采用 PSK 机制的会话复用;
  • 密钥算法:TLSv1.3 只支持 PFS (即完全前向安全)的密钥交换算法,禁用 RSA 这种密钥交换算法。对称密钥算法只采用 AEAD 类型的加密算法,禁用CBC 模式的 AES、RC4 算法;
  • 密钥导出算法:TLSv1.3 使用新设计的叫做 HKDF 的算法,而 TLSv1.2 是使用PRF算法,稍后我们再来看看这两种算法的差别。

总结一下就是在更安全的基础上还做到了更快,目前 TLS 1.3 的重要实现是 OpenSSL 1.1.1 开始支持了,并且 1.1.1 还是一个 LTS 版本,未来的 RHEL8、Debian10 都将其作为主要支持版本。在 Nginx 上的实现需要 Nginx 1.13+。

安装需求

HTTP/2 要求 Nginx 1.9.5+,,OpenSSL 1.0.2+
TLS 1.3 要求 Nginx 1.13+,OpenSSL 1.1.1+

下载OpenSSL 1.1.1

# cd /usr/local/src
# wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
# tar openssl-1.1.1c.tar.gz

安装

# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.14.2.tar.gz
# tar zxvf nginx-1.14.2
# cd nginx-1.14.2

编译

再原有的nginx编译参数里面添加如下brotli模块重新编译nginx即可

./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_v2_module \
--with-http_addition_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_geoip_module \
--with-pcre \
--with-stream \
--with-openssl=../openssl-1.1.1c

nginx配置修改

开启HTTP2支持

监听改为

Liste 443 ssl http2;

只要在 server{} 下的lisen 443 ssl 后添加 http2 即可,不需要再写 ssl on。

TLS 1.3协议开启
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

如果不打算继续支持 IE8,或者一些合规的要求,可以去掉TLSv1。

加密算法支持

加入TLS1.3引入的新算法:

ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA;

特别注意:需要所有配置SSL协议的虚拟主机开启TLS 1.3协议,TLS 1.3协议才可以生效!