最近看到 Netflix 藉由 TLS 1.3 降低使用者延遲,並且由於 TLS 1.3 重新設計了交握協定
簡化的交握方式及更高的安全性,讓我想讓 Golang 同時支持 TLS 1.2 及 TLS 1.3

TLS 1.2 vs TLS 1.3

在交握上,整體差了一個往返的過程,就可以差至約 100 ms

在大量用戶的負載下,可以位伺服器降低很多資源消耗

優勢

Chiper Suite

TLS 1.2 提供眾多的密碼套件可供選擇

相對的由於 TLS 1.3 不包含金鑰交換及簽章功能

測試

接下來透過 Golang 測試 TLS 1.3 支持,並基於 Golang 來測試 TLS 1.3 的速度的進步

憑證

可以透過自簽 RSA 或者 ECC 的憑證進行測試,當然正式服務還是希望可以購買付費憑證

當然最低限度就是使用 Let’s Encrypt,只是沒有受到 電子簽章法 保障,做一個簡單的比較以供參考

自簽 免費 付費
有效期限 自訂 3 個月 1 - 2 年
網站綠勾
賠償機制
用戶 個人 個人、非營利 公司、政府、重點服務

接下來回到正題,繼續自簽憑證

1. RSA (Options)

使用的是 genrsa 產生 RSA 私鑰

1
2
openssl genrsa -out server.key 2048
openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650

2. ECC (Options)

使用的是 ecparam 產生橢圓曲線參數,並選用曲線 NIST P-384 secp384r1 產生 ECC 私鑰

1
2
openssl ecparam -genkey -name secp384r1 -out server.key
openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650

Server

透過簡單的 Golang 並設定最低支援為 TLS 1.3 MinVersion:tls.VersionTLS13,就不會使用到比較舊的版本

但是在正式服務中還是建議使用最低支援 TLS 1.2 ,最高支援 TLS 1.3,以免某些客戶端無法正常連線

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
    "crypto/tls"
    "log"
    "net/http"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        w.Header().Add("Strict-Transport-Security", "max-age=63072000; includeSubDomains")
        w.Write([]byte("Test TLS 1.3\n"))
    })
    cfg := &tls.Config{
        MinVersion:               tls.VersionTLS13,
        PreferServerCipherSuites: true,
        CipherSuites: []uint16{
            tls.TLS_AES_128_GCM_SHA256,
			tls.TLS_AES_256_GCM_SHA384,
        },
    }
    srv := &http.Server{
        Addr:         ":443",
        Handler:      mux,
        TLSConfig:    cfg,
        TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler), 0),
    }
    log.Fatal(srv.ListenAndServeTLS("tls.crt", "tls.key"))
}

透過 Wireshark 側錄進行驗證,可以看到 Pocotol 是顯示 TLS 1.3

但是在版本(Version) 卻看到 TLS 1.2 (0x0303) !?

別緊張在後面一點可以看到 Supported Versions TLS 1.3 (0x0304),由於兼容性問題才因此設計

Ref

  1. Netflix採用TLS 1.3可降低播放延遲提升使用者體驗
  2. 電子簽章法
  3. TLS Wiki
  4. Building a faster and more secure web with TCP Fast Open, TLS False Start, and TLS 1.3