理解 HTTPS 原理,SSL/TLS 协议
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
SSL/TLS
使用 HTTP 协议时,所有在客户端和服务端往来的数据都是明文传输的数据是不安全的。
- SSL (Secure Sockets Layer) 安全套接层
- TLS (Transport Layer Security) 传输层安全协议
在传输层(TCP) 与 应用层(HTTP) 中间加一层 SSL/TLS,可以保证数据在传输时的安全性。

证书与授权
# 创建CA [证书授权中心(Certificate Authority)负责证书颁发]
# 生成CA私钥
openssl genrsa -out ca.key 2048
# 生成CA根证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
# 颁发证书
# 生成证书私钥
openssl genrsa -out auto.pem 1024
# 生成证书公钥
openssl rsa -in auto.pem -out auto.key
# 生成签名请求 其中的 Common Name 一定要填写客户端访问时的域名,并且不能是 IP
openssl req -new -key auto.pem -out auto.csr
# CA签名(颁发)证书
openssl x509 -req -sha256 -in auto.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out auto.crt
# 最终我们需要的就是公钥 auto.key 以及证书 auto.crt
服务端使用证书
http.ListenAndServeTLS(Auto.Server, "auto.crt", "auto.key", nil)
客户端发起请求
func getClient(url string) *http.Client {
if !strings.Contains(url, "https://") {
return &http.Client{}
}
certName := strings.Split(url, "https://")[1]
certName = strings.Split(certName, ":")[0]
// Load client cert
cert, err := tls.LoadX509KeyPair("certs/"+certName+".crt", "certs/"+certName+".key")
if err != nil {
logger.Error(err)
}
// Load CA cert
caCert, err := ioutil.ReadFile("certs/ca.crt")
if err != nil {
logger.Error(err)
}
caCertPool := x509.NewCertPool()
ok := caCertPool.AppendCertsFromPEM(caCert)
if !ok {
logger.Error("Load CA cert failed")
}
// Setup HTTPS client
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
RootCAs: caCertPool,
}
tlsConfig.BuildNameToCertificate()
transport := &http.Transport{TLSClientConfig: tlsConfig}
return &http.Client{Transport: transport}
}