golang简单实现一个基于TLS/SSL的 TCP服务器和客户端
2017-06-21 09:27
1221 查看
本篇文章介绍一下使用TLS/SSL创建安全的TCP通信,首先我们要准备一个数字证书和一个密钥关于如何产生密钥,请看下面文章:
Author: 岳东卫
Email: usher.yue@gmail.com
通过Openssl创建数字证书和密钥
TLS服务器端代码
TLS客户端代码
Author: 岳东卫
Email: usher.yue@gmail.com
通过Openssl创建数字证书和密钥
TLS服务器端代码
TLS客户端代码
通过Openssl创建数字证书和密钥
关于如何通过Openssl创建证书和私钥TLS服务器端代码
package main import ( "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) } } }
TLS客户端代码
package main import ( "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])) } } } } }
相关文章推荐
- Golang实现简单tcp服务器02 -- 实现echo服务器/客户端
- 一个简单的基于node.js的TCP服务器和基于C++的TCP客户端通信示例程序
- Golang实现简单tcp服务器03 -- 文本广播式聊天服务器/客户端
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- Select I/O模型来实现一个并发处理多个客户端的TCP服务器 <转>
- 一个基于AIO实现的简单web服务器
- 分享:基于epoll实现的一个简单的web服务器
- Linux c实现一个tcp文件服务器和客户端
- 用Java实现一个简单的服务器与客户端程序
- 初探基于TCP的服务器/客户端结构的聊天系统(三)之表情聊天的实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- 【实验 1-1】编写一个简单的 TCP 服务器和 TCP 客户端程序。程序均为控制台程序窗口。
- 用Reactor框架实现一个简单的tcp服务器
- 初探基于TCP的服务器/客户端结构的聊天系统(四)视频聊天的实现
- winsock实现基于TCP的客户端/服务器通讯
- Select I/O模型来实现一个并发处理多个客户端的TCP服务器
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- 一个简单的TCP服务器与客户端示例