av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

使用Go實(shí)現(xiàn)TLSsocketserver

 安全傳輸層協(xié)議 TLS,以前稱為 SSL(Secure Sockets Layer) ,由于HTTPS的推出受到了很多人的歡迎。但是正如TLS的名稱 Transport Layer Security 所示的那樣,它實(shí)際上是獨(dú)立于 HTTP,一個(gè)更深入的安全協(xié)議,我們可以將 TLS 視為 TCP 的安全版本,其提供了對(duì) socket 通信進(jìn)行加密和簽名的功能。在我們的日常開發(fā)中,會(huì)將 gRPC 協(xié)議運(yùn)行在TLS之上以確保安全。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到南票網(wǎng)站設(shè)計(jì)與南票網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋南票地區(qū)。

今天我們來(lái)了解一下如何創(chuàng)建一個(gè)通過(guò) TLS 加密的 socket 服務(wù)。

1.TLS socket server

服務(wù)端示例

 
 
 
  1. func main() { 
  2.   port := flag.String("port", "8360", "listening port") 
  3.   certFile := flag.String("cert", "cert.pem", "certificate PEM file") 
  4.   keyFile := flag.String("key", "key.pem", "key PEM file") 
  5.   flag.Parse() 
  6.   cert, err := tls.LoadX509KeyPair(*certFile, *keyFile) 
  7.   if err != nil { 
  8.     log.Fatal(err) 
  9.   } 
  10.   config := &tls.Config{Certificates: []tls.Certificate{cert}} 
  11.   log.Printf("listening on port %s\n", *port) 
  12.   l, err := tls.Listen("tcp", ":"+*port, config) 
  13.   if err != nil { 
  14.     log.Fatal(err) 
  15.   } 
  16.   defer l.Close() 
  17.   for { 
  18.     conn, err := l.Accept() 
  19.     if err != nil { 
  20.       log.Fatal(err) 
  21.     } 
  22.     log.Printf("accepted connection from %s\n", conn.RemoteAddr()) 
  23.     go func(c net.Conn) { 
  24.       io.Copy(c, c) 
  25.       c.Close() 
  26.       log.Printf("closing connection from %s\n", conn.RemoteAddr()) 
  27.     }(conn) 
  28.   } 
  29. }

這個(gè)服務(wù)端程序接受來(lái)自多個(gè)客戶端并發(fā)請(qǐng)求,并向客戶端發(fā)送的所有的鏡像數(shù)據(jù)。和非TLS服務(wù)相比,這里用 tls.Listen 替換了 net.Listen,同時(shí)需要提供一個(gè)可用的 tls.Config,我們可以使用 mkcert 命令來(lái)生成證書和密鑰對(duì)文件。

2.TLS socket client

客戶端示例:

 
 
 
  1. func main() { 
  2.   port := flag.String("port", "8360", "port to connect") 
  3.   certFile := flag.String("certfile", "cert.pem", "trusted CA certificate")
  4.   flag.Parse() 
  5.   cert, err := os.ReadFile(*certFile) 
  6.   if err != nil { 
  7.     log.Fatal(err) 
  8.   }
  9.    certPool := x509.NewCertPool() 
  10.   if ok := certPool.AppendCertsFromPEM(cert); !ok { 
  11.     log.Fatalf("unable to parse cert from %s", *certFile) 
  12.   } 
  13.   config := &tls.Config{RootCAs: certPool} 
  14.   conn, err := tls.Dial("tcp", "localhost:"+*port, config) 
  15.   if err != nil { 
  16.     log.Fatal(err) 
  17.   } 
  18.   _, err = io.WriteString(conn, "Hello simple secure Server\n") 
  19.   if err != nil { 
  20.     log.Fatal("client write error:", err) 
  21.   } 
  22.   if err = conn.CloseWrite(); err != nil { 
  23.     log.Fatal(err) 
  24.   } 
  25.   buf := make([]byte, 256) 
  26.   n, err := conn.Read(buf) 
  27.   if err != nil && err != io.EOF { 
  28.     log.Fatal(err) 
  29.   } 
  30.   fmt.Println("client read:", string(buf[:n])) 
  31.   conn.Close() 
  32. }

和非 TLS 客戶端相比,我們同樣也只是把 net.Dial 換成 tls.Dial, tls.Config 中填寫的證書可以選擇權(quán)威 ca 頒發(fā)的證書,也可以使用自簽名證書。

3.證書鏈

一般來(lái)說(shuō),我們將自己生成的 CSR 提交給簽名商,他們用中級(jí)證書機(jī)構(gòu)的私鑰 Private Key 給我們的簽名成證書,Root CA 通過(guò)它的私鑰對(duì)中級(jí)機(jī)構(gòu)提交的CSR進(jìn)行簽名。

證書頒發(fā)機(jī)構(gòu)是一個(gè)樹形結(jié)構(gòu)的。比如在驗(yàn)證我們證書X的有效性的時(shí)候,會(huì)一層層的去尋找頒發(fā)者的證書,直到自簽名的根證書,然后通過(guò)相應(yīng)的公鑰再反過(guò)來(lái)驗(yàn)證下一級(jí)的數(shù)字簽名的正確性。直到找到X證書,這就是證書鏈(Certificate Chains)。

我們可以使用以下程序檢查任何服務(wù)器的證書鏈:

 
 
 
  1. func main() { 
  2. addr := flag.String("addr", "localhost:8360", "dial address") 
  3. flag.Parse() 
  4. cfg := tls.Config{} 
  5. conn, err := tls.Dial("tcp", *addr, &cfg) 
  6. if err != nil { 
  7. log.Fatal("TLS connection failed: " + err.Error()) 
  8. defer conn.Close()  
  9. certChain := conn.ConnectionState().PeerCertificates 
  10. for i, cert := range certChain {
  11. fmt.Println(i) 
  12. fmt.Println("Issuer:", cert.Issuer) 
  13. fmt.Println("Subject:", cert.Subject) 
  14. fmt.Println("Version:", cert.Version) 
  15. fmt.Println("NotAfter:", cert.NotAfter) 
  16. fmt.Println("DNS names:", cert.DNSNames) 
  17. fmt.Println("") 
  18. }

給定IP地址后,啟動(dòng)程序后會(huì)與服務(wù)器建立一條 TLS 連接,并上報(bào)其使用的證書給服務(wù)端。如果我們使用未處理過(guò)的自簽的證書,TLS 服務(wù)端驗(yàn)證是通不過(guò)的。所以我們需要權(quán)威ca 頒發(fā)的證書,或者使用 mkcert 為我們的服務(wù)器生成證書來(lái)使他生效。

打開終端,執(zhí)行 mkcert 命令:

 
 
 
  1.   kangkai-iri ./mkcert localhost 
  2.   kangkai-iri go run tls-socket-server.go -cert localhost.pem -key localhost-key.pem

新打開一個(gè)終端,運(yùn)行 tls-dial-port:

 
 
 
  1.   kangkai-iri go run tls-dial-port.go -addr localhost:4040

我們看到生成了證書 mkcert。由于 mkcert 將此證書添加到服務(wù)器的系統(tǒng)根存儲(chǔ)中,直接使用 tls.Dial 將信任該證書。


標(biāo)題名稱:使用Go實(shí)現(xiàn)TLSsocketserver
網(wǎng)頁(yè)URL:http://uogjgqi.cn/article/cceghdd.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流