tcp作为互联网领域使用最多的语言,基于该协议的应用一直都非常多。但是由于tcp是明文传输,其数据传输安全性也一直受到大家的抵触。小沃最近遇到一个项目,由于需要用到安全传输,但是又无发修改原始的传输请求,因此小沃只有通过写一个第三方的应用,通过代理的方式实现安全传输了。代理的代码很简单,使用的是go语言,代码如下:
server.go
package main import ( "log" "crypto/tls" "time" "net" "io" "runtime" ) func main() { runtime.GOMAXPROCS(1) log.SetFlags(log.LstdFlags | log.Lshortfile) log.Println("version: " + runtime.Version()) cert, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { log.Println(err) return } config := &tls.Config{Certificates: []tls.Certificate{cert}} ln, err2 := tls.Listen("tcp", ":443", config) if err2 != nil { log.Println(err2) return } defer ln.Close() for { client, err3 := ln.Accept() if err3 != nil { log.Println(err3) continue } log.Println("new connect") go handleClientRequest(client) } } func handleClientRequest (client net.Conn) { defer client.Close() d := net.Dialer{Timeout: 5 * time.Second} // 如果担心遇到恶意服务,可以额外设置Deadline: time.Now().Add(40 * time.Second) server, err := d.Dial("tcp", "127.0.0.1:8888") if err != nil { log.Println(err) return } defer server.Close() go io.Copy(server, client) io.Copy(client, server) }
client.go
package main import ( "log" "crypto/tls" "time" "net" "io" "runtime" ) func main () { runtime.GOMAXPROCS(1) log.SetFlags(log.LstdFlags | log.Lshortfile) log.Println("version: " + runtime.Version()) ln, err := net.Listen("tcp", ":8888") if err != nil { log.Panic(err) } defer ln.Close() for { client, err2 := ln.Accept() if err != nil { log.Println(err2) continue } log.Println("new connect") go handleClientRequest(client) } } func handleClientRequest (client net.Conn) { defer client.Close() config := &tls.Config{ InsecureSkipVerify: true, } d := net.Dialer{Timeout: 5 * time.Second} // 如果担心遇到恶意服务,可以额外设置Deadline: time.Now().Add(40 * time.Second) server, err := tls.DialWithDialer(&d, "tcp", "118.178.227.147:443", config) if err != nil { log.Println(err) return } defer server.Close() log.Println("connect server") go io.Copy(server, client) io.Copy(client, server) }
当两个软件同时运行时,原本发送给服务器的8888端口请求也就通过tls加密的方式传输到服务器了,这样传输也就成为了安全传输。
本文涉及到一个如何生成加密证书,可以参考三步生成nginx自签名密钥
文章作者:沃航科技