Golang中TLS版本設(shè)置的實(shí)現(xiàn)步驟
Golang中TLS版本設(shè)置

1. Go源碼中的TLS
最近在看Go源碼中的http框架和tls實(shí)現(xiàn)框架實(shí)現(xiàn),go中的TLS實(shí)現(xiàn)了TLS1.0, TLS1.1, TLS1.2, TLS1.3 四個(gè)版本,還有SSL3.0版本, 不過代碼中已經(jīng)明確說明不再支持SSL3.0版本。
const ( VersionTLS10 = 0x0301 VersionTLS11 = 0x0302 VersionTLS12 = 0x0303 VersionTLS13 = 0x0304 // Deprecated: SSLv3 is cryptographically broken, and is no longer // supported by this package. See golang.org/issue/32716. VersionSSL30 = 0x0300 )
TLS 握手過程中,優(yōu)先采用TLS1.3版本,然后依次是:TLS1.2, TLS1.1, TLS1.0。 當(dāng)前網(wǎng)絡(luò)上的TLS版本正處于從TLS1.1及以下版本往TLS1.2版本上升級(jí),大多數(shù)已經(jīng)開始使用TLS1.2版本。不過已經(jīng)有很多應(yīng)用支持TLS1.3版本,比如說瀏覽器(包括Chrome,IE,F(xiàn)ireFox等主流瀏覽器),Postman工具、Eolinker工具等都已經(jīng)支持TLS1.3。
我最初看到的TLS握手是這樣的:

但是在看go的tls源碼時(shí),流程上報(bào)文交互有很大的差距,后來又通過斷點(diǎn)debug的方式確定了是由于TLS版本不同導(dǎo)致的,這才開始了解TLS1.2 與 TLS1.3版本之間的異同,這里暫不介紹他們之間的關(guān)系。后來為了繼續(xù)看TLS1.2(上圖交互流程)的實(shí)現(xiàn),嘗試了各種瀏覽器、Linux中的wget, windows上的postman, eolink等,他們默認(rèn)都是采用TLS1.3版本。
2. https服務(wù)端修改TLS支持版本
go代碼中實(shí)現(xiàn)起來非常方便,http包中提供了使用默認(rèn)配置的接口ListenAndServeTLS。它實(shí)現(xiàn)了一個(gè)默認(rèn)的Server結(jié)構(gòu)
func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServeTLS(certFile, keyFile)
}
其中,TLS參數(shù)配置是Server結(jié)構(gòu)中的一個(gè)成員:TLSConfig *tls.Config。因此我們只需要實(shí)現(xiàn)一個(gè)Server結(jié)構(gòu),然后配置其中的TLSConfig *tls.Config即可。
實(shí)現(xiàn)如下:
package main
import (
"crypto/tls"
"fmt"
"net/http"
)
func HelloWorld(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello world")
}
func main() {/*默認(rèn)情況下*/
http.HandleFunc("/", HelloWorld)
err := http.ListenAndServeTLS(":10443", "./cert/server.crt", "./cert/server.key", nil)
if err != nil {
fmt.Println(err)
}
}
func main() {/*修改TLS版本*/
http.HandleFunc("/", HelloWorld)
server := &http.Server{
Addr: ":8443",
Handler: nil,
TLSConfig: &tls.Config{
MinVersion: tls.VersionTLS12,
MaxVersion: tls.VersionTLS12,
},
}
err := server.ListenAndServeTLS("./cert/server.crt", "./cert/server.key")
if err != nil {
fmt.Println(err)
}
}
3. 抓包驗(yàn)證

關(guān)于Wireshark中的TLS版本顯示問題:
wireshark標(biāo)注tls所屬版本,并不是通過當(dāng)前報(bào)文來標(biāo)注的,而是類似于會(huì)話的方式進(jìn)行標(biāo)注。
目前ClientHello報(bào)文,需要兼容TLS1.3, TLS1.2,…等多個(gè)版本,僅從ClientHello無法判斷出當(dāng)前的版本。TLS版本是在ServerHello中確定的。
TLS1.2 ServerHello報(bào)文:

TLS1.3 ServerHello報(bào)文:

從這兩張圖上應(yīng)該可以看出:TLS1.2與TLS1.3 的握手報(bào)文中version字段填充的都是0x0303,也就是TLS1.2版本,如果是TLS1.3,則是通過擴(kuò)展字段supported_version來確定的。
到此這篇關(guān)于Golang中TLS版本設(shè)置的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Golang TLS版本設(shè)置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言模擬while語句實(shí)現(xiàn)無限循環(huán)的方法
這篇文章主要介紹了Go語言模擬while語句實(shí)現(xiàn)無限循環(huán)的方法,實(shí)例分析了for語句模擬while語句的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
如何使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件
這篇文章主要介紹了使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件,這包括如何創(chuàng)建COS客戶端,如何逐頁檢索對(duì)象列表,并如何對(duì)結(jié)果排序以找到最后更新的對(duì)象,我們還展示了如何優(yōu)化用戶體驗(yàn),通過實(shí)時(shí)進(jìn)度更新和檢索多個(gè)文件來改進(jìn)程序,需要的朋友可以參考下2024-03-03
Golang使用lua腳本實(shí)現(xiàn)redis原子操作
這篇文章主要介紹了Golang使用lua腳本實(shí)現(xiàn)redis原子操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Golang中重復(fù)錯(cuò)誤處理的優(yōu)化方法
這篇文章主要給大家介紹了關(guān)于Golang中重復(fù)錯(cuò)誤處理優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

