当前位置: 首页 > 科技观察

使用Go实现TLSsocketserver

时间:2023-03-19 21:04:47 科技观察

SecurityTransportLayerProtocolTLS,前身为SSL(SecureSocketsLayer),由于HTTPS的推出受到了很多人的欢迎。但正如TLS的TransportLayerSecurity这个名字所表明的,它实际上是独立于HTTP这种更深层次的安全协议。我们可以将TLS视为TCP的安全版本,它提供套接字通信的加密和签名。功能。在我们的日常开发中,gRPC协议会运行在TLS之上,以保证安全。今天我们将学习如何创建一个使用TLS加密的套接字服务。1.TLS套接字服务器服务器示例funcmain(){port:=flag.String("port","8360","listeningport")certFile:=flag.String("cert","cert.pem","certificatePEMfile")keyFile:=flag.String("key","key.pem","keyPEMfile")flag.Parse()cert,err:=tls.LoadX509KeyPair(*certFile,*keyFile)iferr!=nil{log.Fatal(err)}config:=&tls.Config{Certificates:[]tls.Certificate{cert}}log.Printf("listeningonport%s\n",*port)l,err:=tls.Listen("tcp",":"+*port,config)iferr!=nil{log.Fatal(err)}deferl.Close()for{conn,err:=l.Accept()iferr!=nil{log.Fatal(err)}log.Printf("acceptedconnectionfrom%s\n",conn.RemoteAddr())gofunc(cnet.Conn){io.Copy(c,c)c.Close()log.Printf("closingconnectionfrom%s\n",conn.RemoteAddr())}(conn)}}这个服务器程序接受来自多个客户端的并发请求,并将所有镜像数据发送给客户端。与非TLS服务相比,这里net.Listen被tls.Listen替代,需要提供一个可用的tls.Config。我们可以使用mkcert命令生成证书和密钥对文件。2.TLSsocketclient客户端示例:funcmain(){port:=flag.String("port","8360","porttoconnect")certFile:=flag.String("certfile","cert.pem""trustedCAcertificate")flag.Parse()cert,err:=os.ReadFile(*certFile)iferr!=nil{log.Fatal(err)}certPool:=x509.NewCertPool()ifok:=certPool.AppendCertsFromPEM(cert);!ok{log.Fatalf("unabletoparsecertfrom%s",*certFile)}config:=&tls.Config{RootCAs:certPool}conn,err:=tls.Dial("tcp","localhost:"+*端口,config)iferr!=nil{log.Fatal(err)}_,err=io.WriteString(conn,"HellosimplesecureServer\n")iferr!=nil{log.Fatal("clientwritererror:",err)}iferr=conn.CloseWrite();err!=nil{log.Fatal(err)}buf:=make([]byte,256)n,err:=conn.Read(buf)iferr!=nil&&err!=io.EOF{log.Fatal(err)}fmt.Println("clientread:",string(buf[:n]))conn.Close()}与非TLS客户端相比,我们同样只是将net.Dial替换为填写的证书tls.Dial、tls.Config可以选择权威CA颁发的证书,也可以使用自签名证书。3.证书链一般来说,我们将自己生成的CSR提交给签名者,他们使用中间证书颁发机构的私钥PrivateKey为我们签名证书。根CA使用其私钥来验证中间机构提交的CSR。符号。证书颁发机构是一个树结构。比如在验证我们的证书X的有效性时,我们会逐层查找颁发者的证书,直到找到自签名的根证书,然后再使用对应的公钥来验证下一级数字签名的正确性。.直到找到X证书,这就是证书链(CertificateChains)。我们可以使用以下程序检查任何服务器的证书链:funcmain(){addr:=flag.String("addr","localhost:8360","dialaddress")flag.Parse()cfg:=TLS。Config{}conn,err:=tls.Dial("tcp",*addr,&cfg)iferr!=nil{log.Fatal("TLSconnectionfailed:"+err.Error())}deferconn.Close()certChain:=conn.ConnectionState().PeerCertificatesfori,cert:=rangecertChain{fmt.Println(i)fmt.Println("Issuer:",cert.Issuer)fmt.Println("Subject:",cert.Subject)fmt.Println("Version:",cert.Version)fmt.Println("NotAfter:",cert.NotAfter)fmt.Println("DNSnames:",cert.DNSNames)fmt.Println("")}}在给定的IP地址后,开始该程序将与服务器建立TLS连接,并将其使用的证书报告给服务器。如果我们使用未经处理的自签名证书,TLS服务器验证将失败。所以我们需要一个权威ca颁发的证书,或者使用mkcert为我们的服务器生成一个证书,使其生效。打开终端并执行mkcert命令:?kangkai-iri./mkcertlocalhost?kangkai-irigoruntls-socket-server.go-certlocalhost.pem-keylocalhost-key.pem打开一个新终端并运行tls-dial-port:?kangkai-irigoruntls-dial-port.go-addrlocalhost:4040我们看到生成了证书mkcert。由于mkcert将此证书添加到服务器的系统根存储中,因此直接使用tls.Dial将信任该证书。