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自签名密钥
文章作者:沃航科技