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

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

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]))
                }
            }
        }
    }

}
时间: 2024-09-16 06:38:45

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

基于mfc的Modbus/TCP服务器协议

问题描述 基于mfc的Modbus/TCP服务器协议 求指教基于mfc的Modbus/TCP服务器协议,只要能读写数据功能,我用的vc6.0 解决方案 参考:http://wenku.baidu.com/link?url=H6E8CeMjXbeDpwMPuOAYx3A2tXoUnVY9rMeHtOBX_2WWohv87DKBLtEF93NQ6GbWZdjutL7sAFh6z9N7NiVlonLexZmaPFyxCsZ54tyYLfa 解决方案二: modbus协议用vc实现的源代码 http:/

[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[SSL over TCP]

在接下来的系列文章中我们正是讨论关于身份认证的主题.在前面我们已经谈到了,WCF中的认证属于"双向认证",既包括服务对客户端的认证(以下简称客户端认证),也包括客户端对服务的认证(以下简称服务认证).客户端认证和服务认证从本质上并没有什么不同,无非都是被认证一方提供相应的用户凭证供对方对自己的身份进行验证.我们先来讨论服务认证,客户端认证放在后续的文章中. 在<从两种安全模式谈起>中,我们对TLS/SSL进行了简单的介绍.我们知道,客户端和服务在为建立安全上下文而进行的协商

[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[HTTPS]

上一篇演示的是绑定类型为NetTcpBinding情况下基于TLS/SSL的Transport安全模式的实现,接下来我们改用另外一种绑定:WS2007HttpBinding.对于基于HTTP的绑定,Transport安全模式的实现方式又根据寄宿方式的不同而具有一定的差异,我们首先来介绍自我寄宿的方式. 一.自我寄宿(Self-Hosting) 无论对于HTTPS还是SSL Via TCP,服务端都需要绑定一个证书.对于采用后者的NetTcpBinding,我们是通过ServiceCredenti

Multi Libvent TCP Server:一个高性能的TCP服务器

MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩.同时他可以是一个很简洁的Linux C 开发学习工程.毫不夸张的说,如果全部掌握这一个工程,你会成为一个Linux C的牛人:当然,你也可以通过源码包的mario.c(maritcp服务器示例程序)来学习,可以很快入门上手进行Linux C开发. 经过两个多月的测试(编写c++客户端测试及调优系统参数),测试结果得到单机最大带宽吞吐1000M,测试最高TCP长连接100万,每秒处理连接数达4万,此时系统压力load值很低.总之

使用基于Python的Tornado框架的HTTP客户端的教程_python

由于tornado内置的AsyncHTTPClient功能过于单一, 所以自己写了一个基于Tornado的HTTP客户端库, 鉴于自己多处使用了这个库, 所以从项目中提取出来, 写成一个单独库 tornadohttpclient TornadoHTTPClient 是一个基于Tornado的高效的异步HTTP客户端库, 支持Cookie和代理, 目前仅在Python2.7平台上测试过, 不支持Python3 听取了仙子君的意见, 直接对tornado.curl_httpclient.CurlAs

介绍基于HAProxy的高性能缓存服务器nuster

Nuster是一个基于HAProxy的高性能缓存服务器 介绍 Nuster是一个基于HAProxy的高性能缓存服务器.Nuster完全兼容HAProxy,并且利用HAProxy的ACL功能来提供非常细致的缓存规则,比如 请求地址为某某时缓存 请求参数中的X为Y时缓存 响应头中的X为Y时缓存 请求速率超过多少时缓存 等等 性能 非常快, 单进程模式下是nginx的3倍,多进程下nginx的2倍,varnish的3倍. 详见benchmark 安装 make TARGET=linux2628 mak

APT案例分析:一个基于Meterpreter和Windows代理的攻击事件

本文讲的是APT案例分析:一个基于Meterpreter和Windows代理的攻击事件, 前言 几个月前,在只可以通过代理进行访问的公司windows网络中,我对其进行了我开发的模拟定制的APT攻击.在测试过程中,我意外的发现我可以上传https返回类型的meterpreter后门.一开始,我并不确定这个地方存在漏洞,或者这个地方对APT攻击是否起作用.为了验证这个地方是否存在漏洞,我现在需要处理好代理环境. 在对环境做了深入分析之后,我们使用的meterpreter模块(windows/met

stunnel 4.38发布 提供全局TLS/SSL服务

Stunnel是一个自由的跨http://www.aliyun.com/zixun/aggregation/14734.html">平台软件,用于提供全局的TLS/SSL服务.针对本身无法进行TLS或SSL通信的客户端及服务器,Stunnel可提供安全的加密连接.该软件可在许多操作系统下运行,包括Unix-like系统,以及Windows.Stunnel依赖于某个独立的库,如OpenSSL或者SSLeay,以实现下面的TLS或SSL协议. stunnel 4.38更新日志:Server N

Python实现一个简单的能够上传下载的HTTP服务器

这篇文章主要介绍了用Python实现一个简单的能够上传下载的HTTP服务器,是Python网络编程学习当中的基础,本文示例基于Windows操作系统实现,需要的朋友可以参考下 ? 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 5