golang简单实现一个基于TLS/SSL的 TCP服务器和客户端

前端之家收集整理的这篇文章主要介绍了golang简单实现一个基于TLS/SSL的 TCP服务器和客户端前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本篇文章介绍一下使用TLS/SSL创建安全的TCP通信,首先我们要准备一个数字证书和一个密钥关于如何产生密钥,请看下面文章

Author: 岳东卫
Email: usher.yue@gmail.com


通过Openssl创建数字证书和密钥

关于如何通过Openssl创建证书和私钥

TLS服务器端代码

  1. package main
  2.  
  3. import (
  4. "crypto/rand"
  5. "crypto/tls"
  6. "fmt"
  7. "log"
  8. "net"
  9. "time"
  10. )
  11.  
  12. func HandleClientConnect(conn net.Conn) {
  13. defer conn.Close()
  14. fmt.Println("Receive Connect Request From ",conn.RemoteAddr().String())
  15. buffer := make([]byte, 1024)
  16. for {
  17. len,err := conn.Read(buffer)
  18. if err != nil {
  19. log.Println(err.Error())
  20. break
  21. }
  22. fmt.Printf("Receive Data: %s\n",string(buffer[:len]))
  23. //发送给客户端
  24. _,err = conn.Write([]byte("服务器收到数据:" + string(buffer[:len])))
  25. if err != nil {
  26. break
  27. }
  28. }
  29. fmt.Println("Client " + conn.RemoteAddr().String() + " Connection Closed.....")
  30. }
  31.  
  32. func main() {
  33. crt,err := tls.LoadX509KeyPair("server.crt","server.key")
  34. if err != nil {
  35. log.Fatalln(err.Error())
  36. }
  37. tlsConfig := &tls.Config{}
  38. tlsConfig.Certificates = []tls.Certificate{crt}
  39. // Time returns the current time as the number of seconds since the epoch.
  40. // If Time is nil,TLS uses time.Now.
  41. tlsConfig.Time = time.Now
  42. // Rand provides the source of entropy for nonces and RSA blinding.
  43. // If Rand is nil,TLS uses the cryptographic random reader in package
  44. // crypto/rand.
  45. // The Reader must be safe for use by multiple goroutines.
  46. tlsConfig.Rand = rand.Reader
  47. l,err := tls.Listen("tcp",":8888",tlsConfig)
  48. if err != nil {
  49. log.Fatalln(err.Error())
  50. }
  51. for {
  52. conn,err := l.Accept()
  53. if err != nil {
  54. fmt.Println(err.Error())
  55. continue
  56. } else {
  57. go HandleClientConnect(conn)
  58. }
  59. }
  60.  
  61. }

TLS客户端代码

  1. package main
  2.  
  3. import (
  4. "crypto/tls"
  5. "fmt"
  6. "io"
  7. "time"
  8.  
  9. "log"
  10. )
  11.  
  12. func main() {
  13. //注意这里要使用证书中包含的主机名称
  14. conn,err := tls.Dial("tcp","abc.com:8888",nil)
  15. if err != nil {
  16. log.Fatalln(err.Error())
  17. }
  18. defer conn.Close()
  19. log.Println("Client Connect To ",conn.RemoteAddr())
  20. status := conn.ConnectionState()
  21. fmt.Printf("%#v\n",status)
  22. buf := make([]byte, 1024)
  23. ticker := time.NewTicker(1 * time.Millisecond * 500)
  24. for {
  25. select {
  26. case <-ticker.C:
  27. {
  28. _,err = io.WriteString(conn,"hello")
  29. if err != nil {
  30. log.Fatalln(err.Error())
  31. }
  32. len,err := conn.Read(buf)
  33. if err != nil {
  34. fmt.Println(err.Error())
  35. } else {
  36. fmt.Println("Receive From Server:",string(buf[:len]))
  37. }
  38. }
  39. }
  40. }
  41.  
  42. }

猜你在找的Go相关文章