让Nginx快速支持TLS1.3协议

最近在看一些 TLS 协议 1.3 版本的相关知识,所以想分享一些信息,本文是第一篇,没有太多的理论细节,主要说下如何在 Nginx 上快速部署一个支持 TLS 1.3 协议版本的网站。

几个基本观点需要牢记。

1)截止到现在 TLS 1.3 协议仍然处于草案阶段,最新的 RFC 文档是 draft 28,对于大型系统来说,目前并不建议部署,当然对于个人网站来说,可以部署 TLS 1.3 版本 。

2)TLS 1.3 和 TLS 1.2 版本有很大的不同,从协议消息的角度来看,两者是不兼容的,也正因为此,大型系统目前不建议采用 TLS 1.3 版本。

关于这两个版本之间的差异,后续我会写文章详细描述。

3)Nginx 底层使用的密码库是 OpenSSL,也就是说是否支持 TLS 1.3 版本,取决于 OpenSSL 库。

目前 Nginx 1.13 以上的版本支持 TLS 1.3 版本,而 OpenSSL 1.1.1 版本支持 TLS 1.3 版本,最新的 OpenSSL 1.1.1-pre5 支持 TLS 1.3 draft 26。

这篇文章运行环境如下:

  • Ubuntu 14.04.5 LTS 系统
  • gcc version 4.8.4
  • Nginx nginx1.13.5
  • openssl1.1.1

如果大家在具体安装的时候,遇到各类问题,可能和软件版本、系统环境有关,需要查看手册或者在线 Google。

安装 OpenSSL

了解 TLS 1.3 版本,最好的工具就是 OpenSSL,所以第一步就是安装 OpenSSL 密码库和命令行工具。

运行如下命令:

$ cd /root 

# 下载源代码 
$ wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1-pre1.tar.gz 

$ cd openssl-1.1.1-pre1

$ grep TLS1_3_VERSION_DRAFT_TXT ./* -R
# 输出 draft 23 
./include/openssl/tls1.h:# define TLS1_3_VERSION_DRAFT_TXT  "TLS 1.3 (draft 23)"

$ ./config --prefix=/usr/local/openssl1.1.1 --openssldir=/usr/local/openssl1.1.1 --libdir=lib shared   -Wl,-R,'$(LIBRPATH)' -Wl,--enable-new-dtags enable-ec_nistp_64_gcc_128 enable-tls1_3

$ make 
$ make install 
  • 在这个版本中,默认已经启用 TLS 1.3 ,所以不加 enable-tls1_3 参数也可以
  • OpenSSL 命令行工具和各类包、证书文件都保存在 /usr/local/openssl1.1.1 目录下。
  • 该版本对应的 TLS 1.3 版本是 draft 23。

说明:如果编译错误,可以参考 issues 解决

安装完成后,可以使用命令行工具了解相关 TLS 1.3 信息。

比如运行下列命令,了解该版本对应的所有密码套件。

$ ./usr/local/openssl1.1.1/bin/openssl ciphers  -V tls1_3 | column -t

0x13,0x02  -  TLS_AES_256_GCM_SHA384        TLSv1.3  Kx=any  Au=any  Enc=AESGCM(256)             Mac=AEAD
0x13,0x03  -  TLS_CHACHA20_POLY1305_SHA256  TLSv1.3  Kx=any  Au=any  Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0x13,0x01  -  TLS_AES_128_GCM_SHA256        TLSv1.3  Kx=any  Au=any  Enc=AESGCM(128)             Mac=AEAD

可以看出 TLS 1.3 版本支持的密码套件进一步减少(增强了安全性)。

安装 Nginx

Nginx 支持 TLS 1.3 版本,指定 OpenSSL 库即可,运行命令如下:

$ cd /root  

$ wget http://nginx.org/download/nginx-1.13.5.tar.gz 
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz

$ tar xvf pcre-8.41.tar.gz 
$ tar xvf nginx-1.13.5.tar.gz 

$ cd nginx-1.13.5

$ ./configure \
    --prefix=/usr/local/nginx1.13.5.tls1.3 \
    --with-http_ssl_module \
     --with-pcre=../pcre-8.41 \
    --with-stream \
    --with-openssl=../openssl-1.1.1-pre1 \
    --with-openssl-opt="enable-tls1_3 enable-ec_nistp_64_gcc_128" --with-pcre

$ make 
$ make install 

--with-openssl-opt 参数主要是为了配置 OpenSSL

Nginx 配置 TLS 1.3 版本

$ cd /usr/local/nginx1.13.5.tls1.3 

$ vim conf/nginx.conf 

nginx.conf 文件配置如下:

server {
    listen       443 ssl;
    server_name  www.simplehttps.com;

    ssl_certificate      /etc/letsencrypt/live/simplehttps.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/simplehttps.com/privkey.pem;
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

    ssl_protocols      TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers  on;

    ssl_ciphers     TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-1
    28-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256;
 
    location / {
        root   html;
        index  index.html index.htm;
    }
}

关于如何申请证书,可以参考我原来的文章。

配置 TLS 1.3 版本很简单,ssl_protocols 增加 TLSv1.3 即可。

运行如下命令启动 Nginx:

$ ./sbin/nginx 

测试 TLS 1.3

使用三种方式测试网站是否支持 TLS 1.3 版本。

1)OpenSSL 命令行

运行下列命令:

$ /usr/local/openssl1.1.1/bin/openssl  s_client -connect www.simplehttps.com:443  -tls1_3      

# 输出 

New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384          

可见 TLSv1.3 已经成功支持。

2)Chrome

目前主流的浏览器都支持 TLS 1.3 版本,具体见下图:

234392-be0533bc8c71405c.png

Chrome 从 62 版本默认开启 TLS 1.3 的支持,如果是 62 以下的版本,可以进行下列的配置

(1)工具栏上打开 chrome://flags/

(2)启用 TLS 1.3

Chrome 启用 TLS 1.3

需要注意的是,如果服务器端支持的 draft 版本和浏览器支持的 draft 版本不一致,那么 HTTPS 网站将不能访问。

(3)重新启动浏览器

然后打开浏览器,对 https://www.simplehttps.com 进行测试。

chrome测试

3)Firefox

Firefox 从 47 版本默认开启 TLS 1.3 的支持,如果是 47 以下的版本,可以进行下列的配置。

(1)工具栏上打开 about:config

(2)修改 security.tls.version.max 为 4

(3)重新启动浏览器

然后打开浏览器,对 https://www.simplehttps.com 进行测试。

欢迎关注我的公众号(yudadanwx),了解我最新的博文。
yudadanwx
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 原文: 高性能网络浏览器-第四章传输层安全性(Transport Layer Security,TLS) 翻译: ...
    梦很想家阅读 4,550评论 2 6
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,635评论 24 1,002
  • 摘要 本文主要是在测试https服务时对搭建https服务器的一些实践总结。TLS协议的介绍部分来源于对RFC52...
    东方胖阅读 8,380评论 0 10
  • 为了在React项目中使用ES6,JSX,并且实现热刷新,使用React官方脚手架进行项目搭建。使用脚手架的原因:...
    追风的云月阅读 206评论 0 0
  • 一直以来,每次进入新的团队都会被大家感叹“年纪小,真是一脸胶原蛋白。”我当然很开心听到这样的夸奖,可也只是开心,并...
    42_亚丽阅读 290评论 0 0