简易信息网

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 12|回复: 0

golang创建安全的tcp通道通信

[复制链接]

31

主题

50

帖子

203

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
203
发表于 2018-1-1 16:03:05 | 显示全部楼层 |阅读模式
本篇文章介绍一下使用TLS/SSL创建安全的TCP通信,首先我们要准备一个数字证书和一个密钥关于如何产生密钥,请看下面文章:
Author: 岳东卫
Email: usher.yue@gmail.com




通过Openssl创建数字证书和密钥TLS服务器端代码package mainimport (    "crypto/rand"    "crypto/tls"    "fmt"    "log"    "net"    "time")func HandleClientConnect(conn net.Conn) {    defer conn.Close()    fmt.Println("Receive Connect Request From ", conn.RemoteAddr().String())    buffer := make([]byte, 1024)    for {        len, err := conn.Read(buffer)        if err != nil {            log.Println(err.Error())            break        }        fmt.Printf("Receive Data: %s\n", string(buffer[:len]))        //发送给客户端        _, err = conn.Write([]byte("服务器收到数据:" + string(buffer[:len])))        if err != nil {            break        }    }    fmt.Println("Client " + conn.RemoteAddr().String() + " Connection Closed.....")}func main() {    crt, err := tls.LoadX509KeyPair("server.crt", "server.key")    if err != nil {        log.Fatalln(err.Error())    }    tlsConfig := &tls.Config{}    tlsConfig.Certificates = []tls.Certificate{crt}    // Time returns the current time as the number of seconds since the epoch.    // If Time is nil, TLS uses time.Now.    tlsConfig.Time = time.Now    // Rand provides the source of entropy for nonces and RSA blinding.    // If Rand is nil, TLS uses the cryptographic random reader in package    // crypto/rand.    // The Reader must be safe for use by multiple goroutines.    tlsConfig.Rand = rand.Reader    l, err := tls.Listen("tcp", ":8888", tlsConfig)    if err != nil {        log.Fatalln(err.Error())    }    for {        conn, err := l.Accept()        if err != nil {            fmt.Println(err.Error())            continue        } else {            go HandleClientConnect(conn)        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
TLS客户端代码package mainimport (    "crypto/tls"    "fmt"    "io"    "time"    "log")func main() {    //注意这里要使用证书中包含的主机名称    conn, err := tls.Dial("tcp", "abc.com:8888", nil)    if err != nil {        log.Fatalln(err.Error())    }    defer conn.Close()    log.Println("Client Connect To ", conn.RemoteAddr())    status := conn.ConnectionState()    fmt.Printf("%#v\n", status)    buf := make([]byte, 1024)    ticker := time.NewTicker(1 * time.Millisecond * 500)    for {        select {        case <-ticker.C:            {                _, err = io.WriteString(conn, "hello")                if err != nil {                    log.Fatalln(err.Error())                }                len, err := conn.Read(buf)                if err != nil {                    fmt.Println(err.Error())                } else {                    fmt.Println("Receive From Server:", string(buf[:len]))                }            }        }    }}
  今天的心情非常美丽哦!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Comsenz Inc. ( 沪ICP备10006327号-1

GMT+8, 2018-1-19 15:21 , Processed in 0.045090 second(s), 22 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表