成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Go 實現 TLS socket server

開發 后端
今天我們來了解一下如何創建一個通過 TLS 加密的 socket 服務。

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

[[406579]]

今天我們來了解一下如何創建一個通過 TLS 加密的 socket 服務。

1.TLS socket server

服務端示例 

  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.   }  

這個服務端程序接受來自多個客戶端并發請求,并向客戶端發送的所有的鏡像數據。和非TLS服務相比,這里用 tls.Listen 替換了 net.Listen,同時需要提供一個可用的 tls.Config,我們可以使用 mkcert 命令來生成證書和密鑰對文件。

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()  

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

3.證書鏈

一般來說,我們將自己生成的 CSR 提交給簽名商,他們用中級證書機構的私鑰 Private Key 給我們的簽名成證書,Root CA 通過它的私鑰對中級機構提交的CSR進行簽名。

證書頒發機構是一個樹形結構的。比如在驗證我們證書X的有效性的時候,會一層層的去尋找頒發者的證書,直到自簽名的根證書,然后通過相應的公鑰再反過來驗證下一級的數字簽名的正確性。直到找到X證書,這就是證書鏈(Certificate Chains)。

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

  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.  
  9. defer conn.Close()   
  10. certChain :conn.ConnectionState().PeerCertificates  
  11. for i, cert :range certChain { 
  12. fmt.Println(i)  
  13. fmt.Println("Issuer:", cert.Issuer)  
  14. fmt.Println("Subject:", cert.Subject)  
  15. fmt.Println("Version:", cert.Version)  
  16. fmt.Println("NotAfter:", cert.NotAfter)  
  17. fmt.Println("DNS names:", cert.DNSNames)  
  18. fmt.Println("")  
  19.  

給定IP地址后,啟動程序后會與服務器建立一條 TLS 連接,并上報其使用的證書給服務端。如果我們使用未處理過的自簽的證書,TLS 服務端驗證是通不過的。所以我們需要權威ca 頒發的證書,或者使用 mkcert 為我們的服務器生成證書來使他生效。

打開終端,執行 mkcert 命令: 

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

新打開一個終端,運行 tls-dial-port:

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

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

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2011-03-08 14:14:31

Proftpd

2020-08-04 10:10:12

DNS over TL系統運維

2025-05-19 08:20:00

GoLicense后端

2025-06-12 02:21:00

2025-05-16 10:05:00

WOLGoSocket

2021-11-24 16:51:03

gRPCGoPython

2021-04-09 20:04:34

區塊鏈Go加密

2015-05-13 09:45:13

2020-08-12 08:56:30

代碼凱撒密碼函數

2024-02-06 17:57:06

Go語言任務

2022-10-28 18:36:18

2024-02-23 07:18:40

JWTWeb應用程序

2023-10-31 22:54:17

GoEventBus驅動編程

2011-03-07 15:16:40

FileZilla SSSLTLS

2023-03-31 07:49:51

syscall庫Echo Serve

2023-04-18 08:27:16

日志級別日志包

2009-09-22 12:20:12

ibmdwLotus

2010-09-14 13:51:45

sql server恢

2010-01-21 11:19:44

TCP Socketlinux

2022-10-24 00:48:58

Go語言errgroup
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人午夜精品 | 日韩国产一区二区 | 久久久精品综合 | 中文精品视频 | 国产一二三区精品视频 | 国产精品久久国产精品 | 精品欧美乱码久久久久久 | 亚洲午夜久久久 | 黄色av网站免费看 | 国产精品久久久久aaaa | 国产精品18久久久久久久 | av资源网站 | 91精品久久久久久久久中文字幕 | 精品伊人 | 午夜免费视频 | 亚洲网址 | 黄色网毛片 | 欧美日一区二区 | 国产精品视频在线观看 | 国产高清在线观看 | 日本久久精品视频 | 国产精品二区三区 | 一级看片免费视频 | 欧美亚洲视频 | 免费一级毛片 | 亚洲综合色婷婷 | 国产精品美女久久久久aⅴ国产馆 | 午夜男人视频 | 一区二区三区视频在线 | av免费观看在线 | 久久美女网| 成人精品国产免费网站 | 少妇诱惑av | 午夜电影日韩 | 国产一区视频在线 | 久久久久久国产一区二区三区 | 瑟瑟免费视频 | 日日干日日操 | 日韩精品一区二区不卡 | 久久久在线视频 | 国产精品久久国产愉拍 |