几个月前,我在升级本博客所用 Nginx 时,顺手加上了对 TLS 1.3 的支持,本文贴出详细的步骤和注意事项。有关 TLS 1.3 的介绍可以看 CloudFlare 的这篇文章:An overview of TLS 1.3 and Q&A。需要注意目前 Chrome 和 Firefox 支持的是 TLS 1.3 draft 18,暂时不要用在生产环境。
安装依赖
我的 VPS 系统是 Ubuntu 16.04.3 LTS,如果你使用其它发行版,与包管理有关的命令请自行调整。
首先安装依赖库和编译要用到的工具:
sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev unzip git
获取必要组件
nginx-ct
和 ngx-brotli
与本文主题无关,不过都是常用的 Nginx 组件,一并记录在这里。
nginx-ct
nginx-ct
模块用于启用 Certificate Transparency 功能。直接从 github 上获取源码:
wget -O nginx-ct.zip -c https://github.com/grahamedgecombe/nginx-ct/archive/v1.3.2.zip
unzip nginx-ct.zip
ngx_brotli
本站支持 Google 开发的 Brotli 压缩格式,它通过内置分析大量网页得出的字典,实现了更高的压缩比率,同时几乎不影响压缩 / 解压速度。
以下是让 Nginx 支持 Brotli 所需准备工作,这些工作是一次性的。首先安装 libbrotli:
sudo apt-get install autoconf libtool automake
git clone https://github.com/bagder/libbrotli
cd libbrotli
# 如果提示 error: C source seen but 'CC' is undefined,可以在 configure.ac 最后加上 AC_PROG_CC
./autogen.sh
./configure
make
sudo make install
cd ../
默认 libbrotli 装在 /usr/local/lib/libbrotlienc.so.1
,如果后续启动 Nginx 时提示找不到这个文件,那么可以把它软链到 /lib
或者 /usr/lib
目录。如果还有问题,请参考这篇文章查找解决方案。
接下来获取 ngx_brotli 源码:
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init
cd ../
OpenSSL
为了支持 TLS 1.3,需要使用 OpenSSL 1.1.1 的 draft-18 分支:
git clone -b tls1.3-draft-18 --single-branch https://github.com/openssl/openssl.git openssl
编译并安装 Nginx
接着就可以获取 Nginx 源码,编译并安装:
wget -c https://nginx.org/download/nginx-1.13.3.tar.gz
tar zxf nginx-1.13.3.tar.gz
cd nginx-1.13.3/
./configure --add-module=../ngx_brotli --add-module=../nginx-ct-1.3.2 --with-openssl=../openssl --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module
make
sudo make install
enable-tls1_3
是让 OpenSSL 支持 TLS 1.3 的关键选项;而 enable-weak-ssl-ciphers
的作用是让 OpenSSL 继续支持 3DES 等不安全的 Cipher Suite,如果你打算继续支持 IE8,才需要加上这个选项。
除了 http_v2
和 http_ssl
这两个 HTTP/2 必备模块之外,我还额外启用了 http_gzip_static
,需要启用哪些模块需要根据自己实际情况来决定。
以上步骤会把 Nginx 装到 /usr/local/nginx/
目录,如需更改路径可以在 configure 时指定。
WEB 站点配置
在 Nginx 的站点配置中,以下两个参数需要修改:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 增加 TLSv1.3
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
包含 TLS13
是 TLS 1.3 新增的 Cipher Suite,加在最前面即可;如果你不打算继续支持 IE8,可以去掉包含 3DES
的 Cipher Suite。
本博客完整的 Nginx 配置,请点击这里查看。
验证是否支持 TLS 1.3
目前最新版 Chrome 和 Firefox 都支持 TLS 1.3,但需要手动开启:
- Chrome,将
chrome://flags/
中的Maximum TLS version enabled
改为TLS 1.3
(Chrome 62 中需要将TLS 1.3
改为Enabled (Draft)
,感谢 @TsuranSonoda 指出); - Firefox,将
about:config
中的security.tls.version.max
改为4
;
本博客多次推荐的 Qualys SSL Labs’s SSL Server Test 也支持验证服务端是否支持 TLS 1.3,非常方便,继续推荐。
原文链接:https://imququ.com/post/enable-tls-1-3.html.
本文链接:https://zhusl.com/post/eiblog-enable-tls-1-3.html,参与评论 »
--EOF--
发表于 2017-08-18 08:08:00。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »
提醒:本文最后更新于 2682 天前,文中所描述的信息可能已发生改变,请谨慎使用。
专题「WEB」的其它文章 »
- nginx配置完整篇 (Oct 10, 2017)
Comments