contributed by < OscarShiang
>
HTTPS 的 "S",原先是網景公司 (Netscape) 為了開發網路瀏覽器所研發的一款工具集合 SSL (Secure Socket Layer),經由 IETF 列入 RFC 標準後,稱作 TLS(Transport Layer Security)。
主要用於保障應用程式間的通訊不會遭到竊聽與竄改。
是一種 ULP(Upper Layer Protocol) ,可以在通訊協定上建立加密的機制,因此稱為傳輸層安全協定(TLS)
在協定上大致可分為兩個部分:
Facebook 與 RedHat 工程師共同開發的核心模組,主要專注於降低使用 TLS 所造成的系統負載
由於在使用 TLS 傳送靜態內容時需要先將資料讀到 user space 並進行加密,接著才能將加密後的資料傳送出去。而 Facebook 發現在使用 TLS 的過程中,會花費 2% 的 CPU 在處理 copy from/to user space ,還有 10% 的 CPU 用於加密。
而透過將 TLS 放到 kernel 中,不僅可以使用 kernel 內部已存在的加密系統來進行加密,更有機會可以使用 sendfile()
與 splice()
這種系統呼叫來做到 Zero-Copy,加速資料的傳輸。
Dave Watson 原先想將 KTLS 做成一種 socket 的類型,即 ktls/af_ktls,但是將 KTLS 做成 socket 的類型無法讓使用者自由選用要使用 ipv4 或是其他的選項。
所以他們後續在 Linux Kernel 中發展出了 ULP (Upper Layer Protocol) 的機制。該機制最主要的用途就是將 TLS 獨立成另外一個網路的分層,只要將不同的 socket 設定與 KTLS 做綁定,就可以實現不同種類的 socket 都可以使用 KTLS
KTLS 已在 Linux 4.13 版本中整併至核心內部。
建立 TLS 的連線機制與協調加密演算法的使用與交換金鑰
主要包含以下內容:
保障在使用不安全的通道通訊可以取得金鑰,以進行接下來的通訊
主要使用下列的演算法來進行交換:
在設定 user space server 之前,需要先確定 KTLS 的功能已經被開啟
$ lsmod | grep tls
如果尚未開啟的話,可以使用以下的指令開啟 KTLS
$ sudo modprobe tls
使用 modprobe
的好處在於載入該模組時會將該模組的相依模組一併載入到核心中
接著針對 server 進行設定:
setsockopt(2)
傳送到 kernel 中保存以及後續使用。read(2)
, write(2)
, sendfile(2)
, splice(2)
等等)使用 KTLS 與直接使用 user space library 的流程大致相同,唯一有差異的部分在於若是要使用 KTLS ,需要在使用 user space library 完成 handshake 後,將加密的參數利用 setsockopt
傳到 kernel 內部
由 Google 所推出的一款基於 UDP 的連線協定,目的在解決使用 TCP/IP 協定所遇到的封包缺失的問題
原先是由 Google 所研發的技術,是基於 UDP 的協定在搭配封包復原等等技術而成。目的在提升傳輸效率之外,減少使用無線、行動網路封包丟失的問題。
已被 IETF 接受,目前正在由專案小組進行標準化,而在 HTTP/3 的安全的部分就是使用 TLS 1.3 來保證其安全性。
截至今日已來到 draft-shade-quic-http2-mapping,目前還不是正式的標準(查看進度)
因為目前 OpenSSL 的主要分支已更新到 1.x 版本,而在 ktls/af_ktls_test 中所使用的 OpenSSL 函式庫為 0.x 版本
因為 KTLS 著重處理 TLS 的加密與解密等環節,所以以方便性而言可以使用 OpenSSL, GnuSSL 等 user space 的函式庫來協助交握流程的操作
EVP_CIPHER_CTX
中,預計在 OpenSSL 3.0 中支援 Linux KTLSlinux2020