TLS加密过程
- 客户端问候:客户端向服务器发送一个问候消息,包含支持的TLS版本、加密算法和其他信息。 
- 服务器问候:服务器选择TLS版本和加密算法,并发送其数字证书给客户端。数字证书包含服务器的公钥。 
- 验证证书:客户端验证服务器的数字证书是否由受信任的证书颁发机构签署。如果验证失败,连接将被终止。 
- 生成会话密钥:客户端生成一个随机数,并使用服务器的公钥对其进行加密,然后发送给服务器。服务器使用其私钥解密,得到这个随机数。这个随机数将用于生成会话密钥。 
- 会话密钥生成:客户端和服务器使用这个随机数生成对称加密的会话密钥。 
- 加密通信:使用会话密钥加密和解密后续的通信数据。 
这个过程确保了数据在传输过程中是加密的,并且只有通信的双方能够解密数据。
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 的协议:
- HTTPS:HTTP over TLS,用于安全的网页浏览。
- FTPS:FTP over TLS,用于安全的文件传输。
- IMAPS:IMAP over TLS,用于安全的电子邮件访问。
- SMTPS:SMTP over TLS,用于安全的电子邮件传输。
- LDAP over TLS:用于安全的目录访问。
TLS 可以保护任何需要加密和认证的 TCP 通信。