TLS加密过程

  1. 客户端问候:客户端向服务器发送一个问候消息,包含支持的TLS版本、加密算法和其他信息。

  2. 服务器问候:服务器选择TLS版本和加密算法,并发送其数字证书给客户端。数字证书包含服务器的公钥。

  3. 验证证书:客户端验证服务器的数字证书是否由受信任的证书颁发机构签署。如果验证失败,连接将被终止。

  4. 生成会话密钥:客户端生成一个随机数,并使用服务器的公钥对其进行加密,然后发送给服务器。服务器使用其私钥解密,得到这个随机数。这个随机数将用于生成会话密钥。

  5. 会话密钥生成:客户端和服务器使用这个随机数生成对称加密的会话密钥。

  6. 加密通信:使用会话密钥加密和解密后续的通信数据。

这个过程确保了数据在传输过程中是加密的,并且只有通信的双方能够解密数据。

Golang tls库使用示例

TLS 服务器

package main

import (
    "crypto/tls"
    "fmt"
    "log"
    "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, TLS!")
}

func main() {
    http.HandleFunc("/", helloHandler)

    // 加载证书和密钥
    cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
    if err != nil {
        log.Fatalf("server: loadkeys: %s", err)
    }

    // 配置TLS
    tlsConfig := &tls.Config{Certificates: []tls.Certificate{cert}}

    // 创建TLS监听器
    server := &http.Server{
        Addr:      ":8443",
        TLSConfig: tlsConfig,
    }

    log.Println("Starting server on https://localhost:8443")
    err = server.ListenAndServeTLS("", "")
    if err != nil {
        log.Fatalf("server: ListenAndServeTLS: %s", err)
    }
}

TLS 客户端

package main

import (
    "crypto/tls"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    // 配置TLS
    tlsConfig := &tls.Config{
        InsecureSkipVerify: true, // 跳过证书验证(仅用于测试)
    }

    // 创建HTTP客户端
    client := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: tlsConfig,
        },
    }

    // 发送请求
    resp, err := client.Get("https://localhost:8443")
    if err != nil {
        log.Fatalf("client: get: %s", err)
    }
    defer resp.Body.Close()

    // 读取响应
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("client: read body: %s", err)
    }

    fmt.Printf("Response: %s\n", body)
}

生成自签名证书

openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes

TLS 适用范围

TLS 并不仅仅用于 HTTP 通信。TLS 是一种通用的加密协议,可以用于任何基于 TCP 的通信协议。以下是一些常见的使用 TLS 的协议:

  1. HTTPS:HTTP over TLS,用于安全的网页浏览。
  2. FTPS:FTP over TLS,用于安全的文件传输。
  3. IMAPS:IMAP over TLS,用于安全的电子邮件访问。
  4. SMTPS:SMTP over TLS,用于安全的电子邮件传输。
  5. LDAP over TLS:用于安全的目录访问。

TLS 可以保护任何需要加密和认证的 TCP 通信。