最近在看一些 TLS 協(xié)議 1.3 版本的相關(guān)知識(shí)颂郎,所以想分享一些信息,本文是第一篇容为,沒(méi)有太多的理論細(xì)節(jié)乓序,主要說(shuō)下如何在 Nginx 上快速部署一個(gè)支持 TLS 1.3 協(xié)議版本的網(wǎng)站。
幾個(gè)基本觀點(diǎn)需要牢記坎背。
1)截止到現(xiàn)在 TLS 1.3 協(xié)議仍然處于草案階段替劈,最新的 RFC 文檔是 draft 28,對(duì)于大型系統(tǒng)來(lái)說(shuō)得滤,目前并不建議部署陨献,當(dāng)然對(duì)于個(gè)人網(wǎng)站來(lái)說(shuō),可以部署 TLS 1.3 版本 懂更。
2)TLS 1.3 和 TLS 1.2 版本有很大的不同眨业,從協(xié)議消息的角度來(lái)看,兩者是不兼容的,也正因?yàn)榇伺坠茫笮拖到y(tǒng)目前不建議采用 TLS 1.3 版本谓传。
關(guān)于這兩個(gè)版本之間的差異,后續(xù)我會(huì)寫(xiě)文章詳細(xì)描述聘殖。
3)Nginx 底層使用的密碼庫(kù)是 OpenSSL晨雳,也就是說(shuō)是否支持 TLS 1.3 版本,取決于 OpenSSL 庫(kù)奸腺。
目前 Nginx 1.13 以上的版本支持 TLS 1.3 版本悍募,而 OpenSSL 1.1.1 版本支持 TLS 1.3 版本,最新的 OpenSSL 1.1.1-pre5 支持 TLS 1.3 draft 26洋机。
這篇文章運(yùn)行環(huán)境如下:
- Ubuntu 14.04.5 LTS 系統(tǒng)
- gcc version 4.8.4
- Nginx nginx1.13.5
- openssl1.1.1
如果大家在具體安裝的時(shí)候坠宴,遇到各類(lèi)問(wèn)題,可能和軟件版本绷旗、系統(tǒng)環(huán)境有關(guān)喜鼓,需要查看手冊(cè)或者在線(xiàn) Google。
安裝 OpenSSL
了解 TLS 1.3 版本衔肢,最好的工具就是 OpenSSL庄岖,所以第一步就是安裝 OpenSSL 密碼庫(kù)和命令行工具。
運(yùn)行如下命令:
$ 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
- 在這個(gè)版本中角骤,默認(rèn)已經(jīng)啟用 TLS 1.3 隅忿,所以不加 enable-tls1_3 參數(shù)也可以
- OpenSSL 命令行工具和各類(lèi)包、證書(shū)文件都保存在 /usr/local/openssl1.1.1 目錄下邦尊。
- 該版本對(duì)應(yīng)的 TLS 1.3 版本是 draft 23背桐。
說(shuō)明:如果編譯錯(cuò)誤,可以參考 issues 解決
安裝完成后蝉揍,可以使用命令行工具了解相關(guān) TLS 1.3 信息链峭。
比如運(yùn)行下列命令,了解該版本對(duì)應(yīng)的所有密碼套件又沾。
$ ./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 版本支持的密碼套件進(jìn)一步減少(增強(qiáng)了安全性)弊仪。
安裝 Nginx
Nginx 支持 TLS 1.3 版本,指定 OpenSSL 庫(kù)即可杖刷,運(yùn)行命令如下:
$ 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 參數(shù)主要是為了配置 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;
}
}
關(guān)于如何申請(qǐng)證書(shū)励饵,可以參考我原來(lái)的文章。
配置 TLS 1.3 版本很簡(jiǎn)單滑燃,ssl_protocols 增加 TLSv1.3 即可役听。
運(yùn)行如下命令啟動(dòng) Nginx:
$ ./sbin/nginx
測(cè)試 TLS 1.3
使用三種方式測(cè)試網(wǎng)站是否支持 TLS 1.3 版本。
1)OpenSSL 命令行
運(yùn)行下列命令:
$ /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
可見(jiàn) TLSv1.3 已經(jīng)成功支持。
2)Chrome
目前主流的瀏覽器都支持 TLS 1.3 版本禾嫉,具體見(jiàn)下圖:
Chrome 從 62 版本默認(rèn)開(kāi)啟 TLS 1.3 的支持灾杰,如果是 62 以下的版本,可以進(jìn)行下列的配置
(1)工具欄上打開(kāi) chrome://flags/
(2)啟用 TLS 1.3
需要注意的是熙参,如果服務(wù)器端支持的 draft 版本和瀏覽器支持的 draft 版本不一致艳吠,那么 HTTPS 網(wǎng)站將不能訪(fǎng)問(wèn)。
(3)重新啟動(dòng)瀏覽器
然后打開(kāi)瀏覽器孽椰,對(duì) https://www.simplehttps.com 進(jìn)行測(cè)試昭娩。
3)Firefox
Firefox 從 47 版本默認(rèn)開(kāi)啟 TLS 1.3 的支持,如果是 47 以下的版本黍匾,可以進(jìn)行下列的配置栏渺。
(1)工具欄上打開(kāi) about:config
(2)修改 security.tls.version.max 為 4
(3)重新啟動(dòng)瀏覽器
然后打開(kāi)瀏覽器,對(duì) https://www.simplehttps.com 進(jìn)行測(cè)試锐涯。
歡迎關(guān)注我的公眾號(hào)(yudadanwx)磕诊,了解我最新的博文。