LNMP升级OpenSSL开启TLS1.3
介绍
在经历两年的修补改进后,OpenSSL 于近日发布了 1.1.1 版本并承诺至少投入 5 年的时间支持该版本。OpenSSL1.1.1 的一大亮点无疑是支持了 TLS1.3。总结一下,TLS 1.3 与以前的版本相比具有如下两个大的优势,分别是:
一、更快的访问速度
为了对比 TLS 1.3 在 TLS 握手阶段的变化, 这里将 TLS 1.2 和 TLS 1.3 在 TLS 握手阶段进行对比。

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

△ TLS 1.3 完整握手框架(来自 TLS 1.3 最新草案 )
TLS 1.3 的握手不再支持静态的 RSA 密钥交换,这意味着必须使用带有前向安全的 Diffie-Hellman 进行全面握手。从上图可以看出,使用 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
升级 Nginx
cd ~/lnmp1.5-full
./upgrade.sh nginx
这里会弹出一个提示,要求输入升级的 Nginx 版本号。

当前我的 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
测试通过后,重启 nginx 即可
/etc/init.d/nginx restart

△ 上图显示在 Chrome 浏览器测试通过,已成功启用 TLS1.3
注:目前已知支持最新 TLS1.3 的浏览器有 Chrome&Firefox, 而 Safari 据传将在下个系统升级中支持最新协议。
本文发布于约 75 个月前,请注意内容时效性
评论
请先登录后再评论
登录