当前位置 博文首页 > golang简单tls协议用法完整示例

    golang简单tls协议用法完整示例

    作者:dotcoo 时间:2021-02-18 15:06

    本文实例讲述了golang简单tls协议用法。分享给大家供大家参考,具体如下:

    生成私钥:

    openssl genrsa -out key.pem 2048
    
    

    生成证书:

    openssl req -new -x509 -key key.pem -out cert.pem -days 3650
    
    

    https:

    复制代码 代码如下:
    package main
    import (
        "io"
        "net/http"
        "log"
    )
    func HelloServer(w http.ResponseWriter, req *http.Request) {
        io.WriteString(w, "hello, world!\n")
    }
    func main() {
        http.HandleFunc("/hello", HelloServer)
        err := http.ListenAndServeTLS(":8080", "cert.pem", "key.pem", nil)
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }

    提示: 访问请勿忘记使用https开头,否则chrome会下载一个文件如下:

    dotcoo-air:tls dotcoo$ cat /Users/dotcoo/Downloads/hello | xxd
    0000000: 1503 0100 0202 0a                        .......

    TLS Server:

    复制代码 代码如下:
    package main
    import (
        "log"
        "crypto/tls"
        "net"
        "bufio"
    )
    func main() {
        log.SetFlags(log.Lshortfile)
        cer, err := tls.LoadX509KeyPair("cert.pem", "key.pem")
        if err != nil {
            log.Println(err)
            return
        }
        config := &tls.Config{Certificates: []tls.Certificate{cer}}
        ln, err := tls.Listen("tcp", ":8000", config)
        if err != nil {
            log.Println(err)
            return
        }
        defer ln.Close()
        for {
            conn, err := ln.Accept()
            if err != nil {
                log.Println(err)
                continue
            }
            go handleConnection(conn)
        }
    }
    func handleConnection(conn net.Conn) {
        defer conn.Close()
        r := bufio.NewReader(conn)
        for {
            msg, err := r.ReadString('\n')
            if err != nil {
                log.Println(err)
                return
            }
            println(msg)
            n, err := conn.Write([]byte("world\n"))
            if err != nil {
                log.Println(n, err)
                return
            }
        }
    }

    TLS Client:

    复制代码 代码如下:
    package main
    import (
        "log"
        "crypto/tls"
    )
    func main() {
        log.SetFlags(log.Lshortfile)
        conf := &tls.Config{
            InsecureSkipVerify: true,
        }
        conn, err := tls.Dial("tcp", "127.0.0.1:8000", conf)
        if err != nil {
            log.Println(err)
            return
        }
        defer conn.Close()
        n, err := conn.Write([]byte("hello\n"))
        if err != nil {
            log.Println(n, err)
            return
        }
        buf := make([]byte, 100)
        n, err = conn.Read(buf)
        if err != nil {
            log.Println(n, err)
            return
        }
        println(string(buf[:n]))
    }

    希望本文所述对大家Go语言程序设计有所帮助。

    js
    下一篇:没有了