本文所述的操作环境:CentOS 7.6。

TLS 1.3协议规范于2018年8月正式落地,需要openssl 1.1.1版本才支持。

执行指令查看当前系统的openssl版本:

openssl version

显示为:OpenSSL 1.0.2k-fips  26 Jan 2017。执行 yum update 也无法更新到最新版本,只能手动安装。

通过官网www.openssl.org查询,我们得知最新版本为1.1.1a,下面开始安装。

我安装到 /usr/local/openssl1.1.1 目录,指令如下:

wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
tar xf openssl-1.1.1a.tar.gz
cd openssl-1.1.1a/
./config --prefix=/usr/local/openssl1.1.1 zlib shared
make && make install

给动态链接库做软连接:

ln -s /usr/local/openssl1.1.1/lib/libssl.so.1.1 /usr/lib64/
ln -s /usr/local/openssl1.1.1/lib/libcrypto.so.1.1 /usr/lib64/

把旧版本的openssl进行更名备份:

mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/include/openssl /usr/include/openssl.old

给新版本的openssl做软连接:

ln -s /usr/local/openssl1.1.1/bin/openssl /usr/bin/openssl/
ln -s /usr/local/openssl1.1.1/include /usr/include/openssl/

最后查看当前的openssl版本,确保安装正确。输入:

openssl version

应显示:OpenSSL 1.1.1a  20 Nov 2018

查看当前openssl版本支持哪些加密套件:

openssl ciphers -V | column -t

输出一堆内容,可以看到最前面3个是TLSv1.3:

openssl支持的所有加密套件

下面我们来安装nginx1.14.2。

wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar xf nginx-1.14.2.tar.gz
cd nginx-1.14.2/
./configure --prefix=/usr/local/web/nginx --error-log-path=/home/logs/nginx/error.log --http-log-path=/home/logs/nginx/access.log --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_sub_module --with-pcre --with-file-aio --with-http_realip_module --with-http_image_filter_module --with-openssl=../openssl-1.1.1a --with-http_v2_module
make && make install

其中,编译参数 --with-openssl=../openssl-1.1.1a 指向的是我们刚才解压的openss1.1.1a目录,参数 --with-http_v2_module 表示安装HTTP/2模块。

先看看旧的nginx配置文件,没启用TLSv1.3之前,我们一般这样写:

server {
    listen 443;
    server_name yangdx.com www.yangdx.com;
    index index.html index.php;
    root /home/www/website;
    ssl on;
    ssl_certificate ssl/yangdx.crt;
    ssl_certificate_key ssl/yangdx.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ......
}

其中,ssl_protocols指定了使用哪些TLS协议,ssl_ciphers则指定了使用哪些加密套件。

最新消息,到2020年,几大主要Web浏览器都将禁用旧的 TLS 1.0 和 TLS 1.1 安全协议。

TLS 1.0/1.1 有很多漏洞,主要表现在旧的浏览器上,如:IE10及更早版本、Safari6及更早版本。

作为新上线的博客,为推崇新技术,本站决定不支持 TLS 1.0/1.1。

去掉 TLS 1.0/1.1 协议,以及添加http2支持,最终配置文件如下:

server {
    listen 443 http2;  #启用http2
    server_name yangdx.com www.yangdx.com;
    index index.html index.php;
    root /home/www/website;
    ssl on;
    ssl_certificate ssl/yangdx.crt;
    ssl_certificate_key ssl/yangdx.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3; #只使用 TLSv 1.2/1.3
    ssl_ciphers ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256; #较安全的加密套件
    ssl_prefer_server_ciphers on;
    ......
}

保存配置并重启nginx,必须重启,只reload是无效的!

使用最新的Chrome浏览器,F12切出开发者工具,切换到Security一栏,确认网站是否已启用TLSv1.3:

Chrome Security控制台

切换到Network一栏,调出Protocol列,看看是否有显示h2的协议:

Chrome Network控制台

我们可以到 https://myssl.com/ 检验一下,看看网站配置能评多少分。本站是得A+哦!

最后再说一下,如果把ssl_ciphers这行注释,默认就是所有 TLS 1.2/1.3 的套件都支持,但有些套件是不安全的。上面的配置,是我自己根据myssl.com的评测结果筛选出来的比较安全的套件。