本文解决:如何省事地升级 OpenSSL 和 Nginx

本文不包括:TLS1.3 的释义、SSL 证书的获取方法

升级 OpenSSL

一键升级命令:

wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz && tar xzvf openssl-1.1.1d.tar.gz && rm -f openssl-1.1.1d.tar.gz && cd openssl-1.1.1d && ./config --prefix=/usr shared zlib-dynamic && rm -f /usr/bin/openssl && rm -rf /usr/include/openssl && make && make install && ln -sf /usr/include/openssl/*.h /usr/include/ && ln -sf /usr/lib/openssl/engines/*.so /usr/lib/ && ldconfig -v && echo -e "openssl_installed" >> /www/server/lib.pl && cd / && rm -rf openssl && clear && openssl version

OpenSSL 官网 找到你需要的版本和资源链接,替换掉命令中的版本号(1.1.1d)和链接执行即可。

TLS1.3 需要 OpenSSL-1.1.1 或以上的版本,当前本机运行的版本可使用openssl version或者openssl version -a命令查询。

升级 Nginx

第一步,查看当前 Nginx 的编译配置:

nginx -V

“V”一定要大写,你会在configure arguments:后看到一长串 Nginx 的编译配置,把这串配置复制并保存下来,一会儿会用到。

第二步,完善你的编译配置(非常重要):

首先,在你刚保存下来的那一长串配置中,找到--with-openssl=这一项,将后面的路径修改为之前下载的 OpenSSL-1.x.x.tar.gz 的解压路径

然后,添加--with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers'这一配置项,“enable-tls1_3” 表示支持 TLS1.3,“enable-weak-ssl-ciphers”表示支持弱安全等级的 Cipher Suite,只有需要继续支持 IE8 才考虑加入此项,如不需要可以删除(感谢 Jerry Qu 的分享)。

最后,检查是否缺少启用 HTTP/2 所必须的--with-http_ssl_module--with-http_v2_module,如果缺少请一并加入编译配置。

第三步,下载并升级 Nginx:

#下载 Nginx,资源链接请自行修改
wget http://nginx.org/download/nginx-1.16.0.tar.gz

#解压 Nginx
tar xzvf nginx-1.16.0.tar.gz

#进入解压目录
cd nginx-1.16.0

#配置编译参数
./configure 把第二步的编译配置粘贴过来

#编译
make

#移走并重命名旧版本的 Nginx 二进制文件
mv /www/server/nginx/sbin/nginx /www/server/nginx/backup/nginx.old

#复制刚编译的新版本 Nginx 二进制文件到原来目录
cp objs/nginx /www/server/nginx/sbin

#执行升级
make upgrade

#重启 Nginx
service nginx restart

启用 TLS1.3 和 HTTP/2

找到你网站的 Nginx 配置文件,将里面的listen 443项改成:

listen 443 ssl http2 fastopen=3 reuseport;

ssl_protocols项改成:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

找到ssl_ciphers项添加支持 TLS1.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;

重载 Nginx 搞定

service nginx reload

最后,你可以通过谷歌浏览器开发者工具的Security页查看 TLS1.3 是否生效,如果仍然是 TLS1.2,通常是 CDN 的问题,请确认所使用的 CDN 是否支持 TLS1.3。