LNMP升级OpenSSL开启TLS1.3

OTHERSLinux 来源: 喵斯基部落

介绍

在经历两年的修补改进后,OpenSSL 于近日发布了 1.1.1 版本并承诺至少投入 5 年的时间支持该版本。OpenSSL1.1.1 的一大亮点无疑是支持了 TLS1.3。总结一下,TLS 1.3 与以前的版本相比具有如下两个大的优势,分别是:

一、更快的访问速度

为了对比 TLS 1.3 在 TLS 握手阶段的变化, 这里将 TLS 1.2 和 TLS 1.3 在 TLS 握手阶段进行对比。

 

1.png
1.png

 

△ TLS 1.2 完整握手框架(来自 RFC 5246)

从上图可以看出,使用 TLS 1.2 需要两次往返( 2-RTT )才能完成握手,然后才能发送请求。

 

2.png
2.png

 

△ TLS 1.3 完整握手框架(来自 TLS 1.3 最新草案 )

TLS 1.3 的握手不再支持静态的 RSA 密钥交换,这意味着必须使用带有前向安全的 Diffie-Hell­man 进行全面握手。从上图可以看出,使用 TLS 1.3 协议只需要一次往返( 1-RTT )就可以完成握手。

相比 TLS 1.2,TLS 1.3 的握手时间减半。这意味着访问一个移动端网站,使用 TLS 1.3 协议,可能会减少将近 100ms 的时间。

二、更强的安全性

TLS 的发展有 20 多年的历史,在之前的版本中,TLS 1.2 是高度可配置的,为了更好的兼容旧版本的浏览器,这意味着那些易受攻击的站点始终在运行着不安全的加密算法,这让互联网黑客有可乘之机。

TLS 1.3 在之前版本的基础上删除了那些不安全的加密算法,这些加密算法包括:

  • RSA 密钥传输 —— 不支持前向安全性
  • CBC 模式密码 —— 易受 BEAST 和 Lucky 13 攻击
  • RC4 流密码 —— 在 HTTPS 中使用并不安全
  • SHA-1 哈希函数 —— 建议以 SHA-2 取而代之
  • 任意 Diffie-Hellman 组—— CVE-2016-0701 漏洞
  • 输出密码 —— 易受 FREAK 和 LogJam 攻击

总之,TLS 1.3 相比老版本的 TLS 协议将会更加安全,这也代表着互联网安全的一大进步。

升级 OpenSSL

这里将以军哥 LNMP 一键包为安装环境,进行简单介绍关于如何将网站升级支持 TLS1.3,有同样使用 LNMP 一键包的朋友可以参考,其实基本差别并不大。无非就是两个步骤:升级 openssl 版本 & 配置 HTTPS 加密算法。

定位到 LNMP 目录下的 src 目录(以你的实际情况)

cd ~/lnmp1.5-full/src

下载并解压 OpenSSL1.1.1b

wget --no-check-certificate https://github.com/openssl/openssl/archive/OpenSSL_1_1_1b.zip && unzip OpenSSL_1_1_1b.zip && rm -rf OpenSSL_1_1_1b.zip

修改 include 目录中的 upgrade_nginx.sh 文件

vi ~/lnmp1.5-full/include/upgrade_nginx.sh

修改下面这段代码:

if echo ${Nginx_Version} | grep -Eqi '^[0-1].[5-8].[0-9]' || echo ${Nginx_Version} | grep -Eqi '^1.9.[1-4]$'; then
    ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_spdy_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module ${Nginx_With_Openssl} ${Nginx_Module_Lua} ${NginxMAOpt} ${Nginx_Modules_Options}
else
    ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module ${Nginx_With_Openssl} ${Nginx_Module_Lua} ${NginxMAOpt} ${Nginx_Modules_Options}
fi

将 else 之后的 ${Nginx_With_Openssl} 改成 --with-openssl=../openssl-OpenSSL_1_1_1b 即可。修改完成后,ESC 键输入:wq 保存并退出。

接下来给予 upgrade_nginx.sh 文件执行权限。

chmod +x upgrade_nginx.sh

升级 Ng­inx

cd ~/lnmp1.5-full
./upgrade.sh nginx

这里会弹出一个提示,要求输入升级的 Ng­inx 版本号。

 

upgrade_nginx.png
upgrade_nginx.png

 

当前我的 Nginx 版本为 1.4.1,没有必要升级版本,直接输入当前的版本号 1.4.1 按回车键确定,接下来就是等待其自动编译安装完成。

编译完成后,检查一下 openssl 版本号对不对

nginx -V

配置 SSL

1、如果你的网站之前没有配置使用过 https。

请参考《Nginx 基本配置详解》 和 《免费申请 Let's Encrypt 泛域名 SSl 证书》 这两篇文章。

2、原来已经做了 https 配置,在此基础增加对 TLS1.3 的支持。

做了下面的修改。修改 vhost 目录下的 xx.com.conf 文件,在配置 443 端口 sever 中修改 ssl_protocols 和 ssl_ciphers 两项内容。

#....略....
server {
        listen      443 ssl;
        #....略....
        ssl_protocols TLSv1.2 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:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:SSLCipherSuiteECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256;';
        ssl_prefer_server_ciphers on;
        #....略....
}

修改完毕后测试语法

nginx -t

测试通过后,重启 ng­inx 即可

/etc/init.d/nginx restart

 

https_tlsv1.3.png
https_tlsv1.3.png

 

△ 上图显示在 Chrome 浏览器测试通过,已成功启用 TLS1.3

注:目前已知支持最新 TLS1.3 的浏览器有 Chrome&Fire­fox, 而 Sa­fari 据传将在下个系统升级中支持最新协议。

本文发布于约 75 个月前,请注意内容时效性