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 通信。