理解 HTTPS 原理,SSL/TLS 协议

Author Avatar
anorz 1月 02, 2018
  • 在其它设备中阅读本文章

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,可以保证数据在传输时的安全性。

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}
}