13397158231   jevian_ma@worldflying.cn

实现普通tcp转tls加密认证方法

2020-05-08 23:24:51

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自签名密钥


文章作者:沃航科技

优秀产品推荐:可编程网络IO控制器

上一篇:Linux C语言实现协程功能

下一篇:docker创建tmpfs文件夹让其支持执行文件(exec)的方法

联系我们

  • 地址:武汉市东湖高新开发区光谷总部国际1栋2412室
  • QQ:932773931
  • 电话:027-59761089-806
  • 手机:13397158231
  • 邮箱:jevian_ma@worldflying.cn

关注公众号

扫码添加微信

沃航(武汉)科技有限公司版权所有

备案号:鄂ICP备16014230号-1

本网站由提供CDN加速/云存储服务