- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- Go語(yǔ)言中怎么實(shí)現HTTPS加密協(xié)議
Go語(yǔ)言中怎么實(shí)現HTTPS加密協(xié)議,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細講解,有這方面需求的人可以來(lái)學(xué)習下,希望你能有所收獲。
Go語(yǔ)言
Go語(yǔ)言是谷歌推出的一種全新的編程語(yǔ)言,可以在不損失應用程序性能的情況下降低代碼的復雜性。Go語(yǔ)言專(zhuān)門(mén)針對多處理器系統應用程序的編程進(jìn)行了優(yōu)化,使用Go編譯的程序可以媲美C或C++代碼的速度,而且更加安全、支持并行進(jìn)程。
HTTPS
HTTPS是在HTTP下加入SSL(Secure Sockets Layer 安全套接層)層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
SSL,及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網(wǎng)絡(luò )通信提供安全及數據完整性的一種安全協(xié)議。TLS與SSL在傳輸層對網(wǎng)絡(luò )連接進(jìn)行加密。
客戶(hù)端CA對其服務(wù)端ssl/' target='_blank'>證書(shū)進(jìn)行校驗過(guò)程如下:
一:對其證書(shū)不進(jìn)行校驗
1,簡(jiǎn)易的https web
server.go:
package main
import (
“fmt”
“net/http”
)
/*
只要實(shí)現了 ServerHTTP方法 便可構建web服務(wù)器
*/
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println(“Hi, This is an example of https service in golang!”)
}
func main() {
http.HandleFunc(“/”, handler) //設置路由及相對應的處理函數 且實(shí)現了ServerHTTP方法
http.ListenAndServeTLS(“192.168.20.162:8001”, “server.crt”,
“server.key”, nil) //server.crt:服務(wù)端證書(shū) 包含服務(wù)端公鑰信息 server.key:服務(wù)端私鑰
/*
生成私鑰:
openssl genrsa -out server.key 2048
生成證書(shū)信息:
openssl req -new -x509 -key server.key -out server.crt -days 365
*/
}
client.go:
package main
import (
“crypto/tls”
“fmt”
“io/ioutil”
“net/http”
)
func main() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
/*
client與server進(jìn)行通信時(shí) client也要對server返回數字證書(shū)進(jìn)行校驗
因為server自簽證書(shū)是無(wú)效的 為了client與server正常通信
通過(guò)設置客戶(hù)端跳過(guò)證書(shū)校驗
TLSClientConfig:{&tls.Config{InsecureSkipVerify: true}
true:跳過(guò)證書(shū)校驗
*/
client := &http.Client{Transport: tr}
resp, err := client.Get(“https://192.168.20.162:8002”)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
1-1,執行 go run server.go
1-2,瀏覽器訪(fǎng)問(wèn) https://192.168.20.162:8001 如下:
1-3,繼續點(diǎn)擊 添加例外方可繼續進(jìn)行訪(fǎng)問(wèn)
出現這種原因:
瀏覽器利用自身的CA對服務(wù)器返回的 數字證書(shū)進(jìn)行合法性校驗時(shí)發(fā)現 該數字證書(shū)是自簽證書(shū),對其該證書(shū)不信任及認定為無(wú)效證書(shū),因而導致無(wú)法繼續訪(fǎng)問(wèn)
1-4, 執行 go run client.go 便可正常訪(fǎng)問(wèn)服務(wù)器(因為此時(shí)客戶(hù)端跳過(guò)了證書(shū)校驗)
二:對其服務(wù)端證書(shū)進(jìn)行校驗
1,瀏覽器本身內置了一些有權威的CA(如Symantec、Globalsign、GDCA)
2,CA證書(shū)自身也包含自己的公鑰信息,及一些證書(shū)的相關(guān)信息如該證書(shū)是由哪個(gè)CA(證書(shū)授權機構)頒發(fā)的,來(lái)自簽發(fā)機構的簽名等
3,客戶(hù)端對來(lái)自服務(wù)端證書(shū)的校驗就是使用CA證書(shū) 校驗對來(lái)自服務(wù)端證書(shū)的簽名是否是 這個(gè)CA簽的
3-1 CA校驗服務(wù)端數字證書(shū)簽名過(guò)程:
1,客戶(hù)端利用自身CA證書(shū)中的簽名算法對 服務(wù)端證書(shū)內容部分(C部分)進(jìn)行相對應的哈希運算得到哈希值(也就是對內容利用自身的哈希算法進(jìn)行簽名)
2,客戶(hù)端利用得到的哈希值與服務(wù)端數字證書(shū)的證書(shū)簽名 進(jìn)行比較
若相同則服務(wù)端證書(shū) 便是由該CA頒發(fā)的 否則不是該CA頒發(fā)的
4,代碼如下
首先準備好服務(wù)端的私鑰及證書(shū) 客戶(hù)端的CA證書(shū)
4-1,使用openssl命令生成相關(guān)私鑰及證書(shū)
1,生成 CA 私鑰
openssl genrsa -out ca.key 2048
2,生成CA證書(shū)
openssl req -x509 -new -nodes -key ca.key -subj “/CN=ca_host” -days 5000 -out ca.crt
CN=ca_host”:設置該證書(shū) 由那臺服務(wù)器生成(若只進(jìn)行客戶(hù)端對服務(wù)端證書(shū)校驗 此處可以隨便填 不影響)
3,生成服務(wù)端私鑰
openssl genrsa -out server.key 2048
4,生成服務(wù)端證書(shū)認證請求
openssl req -new -key server.key -subj “/CN=gc_host” -out server.csr
CN=gc_host:此處必須按真實(shí)填寫(xiě) 服務(wù)端在哪臺服務(wù)器設備起著(zhù)就必須填寫(xiě)哪臺設備的主機名
不同的客戶(hù)端設備在調用時(shí) 需在自身設備 /etc/hosts 配置服務(wù)器設備ip及主機名
因為客戶(hù)端在請求url中只識別服務(wù)端證書(shū)的 CN
證書(shū)認證請求并不是證書(shū),需要CA的私鑰進(jìn)行簽名之后方是證書(shū)
5,生成服務(wù)端證書(shū)
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000
server.go:
package main
import (
“fmt”
“net/http”
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w,
“Hi, This is an example of http service in golang!”)
}
func main() {
http.HandleFunc(“/”, handler)
http.ListenAndServeTLS(“192.168.20.162:8003”,
“server.crt”, “server.key”, nil)
}
client.go:
package main
import (
“crypto/tls”
“crypto/x509”
“fmt”
“io/ioutil”
“net/http”
)
/*
客戶(hù)端若要對服務(wù)端的數字證書(shū)進(jìn)行校驗 需發(fā)送請求之前 加載CA證書(shū)
*/
func main() {
pool := x509.NewCertPool()
caCertPath := “ca.crt”
caCrt, err := ioutil.ReadFile(caCertPath)
if err != nil {
fmt.Println(“ReadFile err:”, err)
return
}
pool.AppendCertsFromPEM(caCrt) //客戶(hù)端添加ca證書(shū)
tr := &http.Transport{
TLSClientConfig: &tls.Config{RootCAs: pool}, //客戶(hù)端加載ca證書(shū)
DisableCompression: true,
}
client := &http.Client{Transport: tr}
resp, err := client.Get(“https://gc_host:8003/”)
if err != nil {
fmt.Println(“Get error:”, err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站