601天 极客爱好者

重要的人越来越少,剩下的人也越来越重要 ​​

Nginx 升级启用 TLS 1.3

发布于 21天前 / 51 次围观 / 0 条评论 / / 极客爱好者

为 Nginx 启用 TLS 1.3 并配置 Brotli 压缩

使用包管理工具安装 Nginx 然后获取编译参数再编译安装

#版本限制

本文使用 Ubuntu 18.04 和 CentOS7 测试,其他发行版可能会存在不同

启用 TLS 1.3 所需最低软件版本

  • Nginx 1.15 +
  • OpenSSL 1.1.1 +

注意

源码版本和已安装的版本尽量保持版本号一致,否则替换二进制文件后可能出现兼容性问题

#获取 TLS 证书

  • 启用 TLS 或 Brotli 必须配置证书
  • 已有证书可继续下一步

没有证书可以通过 Let's Encrypt 获取免费证书

#解决依赖

  • Nginx
[Ubuntu]
apt -y install libpcre3 libpcre3-dev zlib1g-dev

[CentOS]
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

#安装 Nginx

wget http://nginx.org/download/nginx-1.17.8.tar.gz
tar -xzvf nginx-1.17.8.tar.gz
rm nginx-1.17.8.tar.gz

#获取 OpenSSL

或者访问腾讯云软件源站下载

wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
tar -xzvf openssl-1.1.1d.tar.gz
rm openssl-1.1.1d.tar.gz

#获取 Brotli

这一步国内主机可能需要使用代理服务器才能正常进行

git clone https://github.com/eustas/ngx_brotli.git
cd ngx_brotli
git submodule update --init --recursive
cd ..

#检测

  • 进入到 Nginx 目录
cd nginx-1.17.8
  • 查看 apt 安装的 Nginx 编译参数
nginx -V

假设如下:

nginx version: nginx/1.17.8
built by gcc 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04) 
built with OpenSSL 1.1.1b  26 Feb 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.15.12/debian/debuild-base/nginx-1.15.12=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
  • 参数复制下来并添加以下模块和参数
--add-module=../ngx_brotli --with-openssl=../openssl-1.1.1d --with-openssl-opt=enable-tls1_3

完整示例假设如下 (参数在最后面)

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' --add-module=../ngx_brotli --with-openssl=../openssl-1.1.1d --with-openssl-opt=enable-tls1_3

如果执行 configure 时出现以下错误可执行安装 build-essential 即可

checking for C compiler ... not found
./configure: error: C compiler cc is not found
[Ubuntu]
apt -y install build-essential

[CentOS]
yum -y install gcc-c++

#编译

make && make install
  • 替换二进制文件
cp objs/nginx /usr/sbin/
  • 查看版本
nginx -V

显示如下

nginx version: nginx/1.17.8
built by gcc 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 
built with OpenSSL 1.1.1c  28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.15.12/debian/debuild-base/nginx-1.15.12=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' --add-module=../ngx_brotli --with-openssl=../openssl-1.1.1c --with-openssl-opt=enable-tls1_3

#配置 Nginx

  • 使用 Brotli 并关闭 Gzip
vi /etc/nginx/nginx.conf

找到 Gzip 并注释然后添加以下内容

#gzip off;

brotli on; # off 表示关闭
brotli_comp_level 1; # 压缩等级 0-11
brotli_buffers 16 8k;
brotli_min_length 1k;
brotli_types *; # 压缩类型,* 表示全部

注意

Brotli 压缩将占用 CPU 资源,推荐值为 1

  • 启用 TLS 1.3

编辑你的虚拟机配置并添加以下内容

# HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

# 仅启用 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
#ssl_early_data on;
  1. 启用 HSTS;(可选)
  2. TLS 所启用的协议,可添加 TLSv1.1 增加对 IE8 的支持;
  3. 对于 ssl_early_data 也叫 0-RTT 可以查看官网介绍进行配置

#验证

  • 检查配置文件是否正确
sudo nginx -t

返回如下表示正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • 重启 Nginx
sudo systemctl restart nginx

#其他

#验证

使用 SSLlabs 验证是否启用 TLS1.3

这是本站的检测结果

通过浏览器验证是否已启用 Brotli

#错误

使用 systemctl status nginx 查看运行状态

对于上述命令中出现的 PID 的错误可以查看这篇文章解决

#OCSP

点击这里 查看如何配置 OCSP

文章部分内容转载链接: