偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

使用 Go 實(shí)現(xiàn) TLS socket server

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

 安全傳輸層協(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之上以確保安全。

[[406579]]

今天我們來(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.   }  

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

和非 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.  
  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地址后,啟動(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 將信任該證書。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 馬哥Linux運(yùn)維
相關(guān)推薦

2011-03-08 14:14:31

Proftpd

2020-08-04 10:10:12

DNS over TL系統(tǒng)運(yùn)維

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

區(qū)塊鏈Go加密

2015-05-13 09:45:13

2020-08-12 08:56:30

代碼凱撒密碼函數(shù)

2024-02-06 17:57:06

Go語(yǔ)言任務(wù)

2022-10-28 18:36:18

2024-02-23 07:18:40

JWTWeb應(yīng)用程序

2023-10-31 22:54:17

GoEventBus驅(qū)動(dòng)編程

2011-03-07 15:16:40

FileZilla SSSLTLS

2023-03-31 07:49:51

syscall庫(kù)Echo Serve

2023-04-18 08:27:16

日志級(jí)別日志包

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語(yǔ)言errgroup
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)