美文网首页
tls和x509代码示例

tls和x509代码示例

作者: 莫名FCJ | 来源:发表于2017-11-06 11:56 被阅读221次

    TLS

    安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。
    互联网的通信安全,建立在SSL/TLS协议之上。
    1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。
    1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
    1996年,SSL 3.0版问世,得到大规模应用。
    1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
    2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。
    目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支持。
    TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。

    SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
    (1)如何保证公钥不被篡改?
    解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
    (2)公钥加密计算量太大,如何减少耗用的时间?
    解决方法:每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。
    由于"对话密钥"是对称加密,所以运算速度非常快,而服务器公钥只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。
    因此,SSL/TLS协议的基本过程是这样的:
    (1) 客户端向服务器端索要并验证公钥。
    (2) 双方协商生成"对话密钥"。
    (3) 双方采用"对话密钥"进行加密通信。

    crt、key以及pem的区别以及生成

    证书(Certificate) .cer .crt
    私钥(Private Key).key
    证书签名请求(Certificate sign request) .csr
    x509
    X.509是一种非常通用的证书格式。所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用。
    x509证书一般会用到三类文,key,csr,crt。
    Key 是私用密钥openssl格,通常是rsa算法。
    Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。
    crt是CA认证后的证书文,(windows下面的,其实是crt),签署人用自己的key给你签署的凭证。
    至于pem和der,是编码方式
    PEM - Privacy Enhanced Mail,打开看文本格式,以”—–BEGIN…”开头, “—–END…”结尾,内容是BASE64编码.
    查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
    Apache和*NIX服务器偏向于使用这种编码格式.

    golang中使用HTTPS

    生成私钥(rsa算法):
    openssl genrsa -out server.key 2048
    生成证书:
    openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650

    https://github.com/fengchunjian/goexamples/tree/master/tls/https

    package main
    
    import (
        "io"
        "log"
        "net/http"
    )
    
    func HelloServer(w http.ResponseWriter, req *http.Request) {
        io.WriteString(w, "Hello, world!\n")
    }
    
    func main() {
        http.HandleFunc("/hello", HelloServer)
        err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
        if err != nil {
            log.Fatal("ListenAndServeTLS:", err)
        }
    }
    

    golang中使用tls

    https://github.com/fengchunjian/goexamples/tree/master/tls/tls

    //server.go
    package main
    
    import (
        "bufio"
        "crypto/tls"
        "log"
        "net"
    )
    
    func main() {
        log.SetFlags(log.Lshortfile)
    
        cer, err := tls.LoadX509KeyPair("server.crt", "server.key")
        if err != nil {
            log.Println(err)
            return
        }
    
        config := &tls.Config{Certificates: []tls.Certificate{cer}}
        ln, err := tls.Listen("tcp", ":443", 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("jude\n"))
            if err != nil {
                log.Println(n, err)
                return
            }
        }
    }
    
    //client.go
    package main
    
    import (
        "crypto/tls"
        "log"
    )
    
    func main() {
        log.SetFlags(log.Lshortfile)
    
        conf := &tls.Config{
            InsecureSkipVerify: true,
        }
    
        conn, err := tls.Dial("tcp", "127.0.0.1:443", conf)
        if err != nil {
            log.Println(err)
            return
        }
    
        defer conn.Close()
    
        n, err := conn.Write([]byte("hi\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]))
    }
    
    

    参考文档

    SSL/TLS协议运行机制的概述
    http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
    Go实战--golang中使用HTTPS以及TSL(.crt、.key、.pem区别以及crypto/tls包介绍)
    http://blog.csdn.net/wangshubo1989/article/details/77508738
    golang简单tls协议用法完整示例
    http://www.jb51.net/article/89065.htm

    相关文章

      网友评论

          本文标题:tls和x509代码示例

          本文链接:https://www.haomeiwen.com/subject/ksxlmxtx.html