HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道。HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL,它运行在TCP/IP层之上,应用层之下。
HTTPS工作原理
HTTPS由两部分组成:HTTP+SSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。工作原理图如下:
HTTPS握手详细步骤
- 客户端向web服务器发送HTTPS请求(通知可支持的加密算法)
- 服务器发送公钥和电子证书,发送是以公钥加密方式发送。电子证书是被认证中心的私钥加密。
- 客户端确认电子证书,确认公钥是否为刚才访问的web服务器。如果是则利用被认证中心的公钥解密。
- 以对称加密的方式生成密钥(使用web服务器的公钥进行加密),发送到服务器。
- 服务器用私钥解密,获得密钥。
- 根据对称加密方式的密钥,使用web服务器的公钥进行解密后发送。
HTTPS分类
- client端的单向检验
比如用户在网上进行金钱等操作时,访问的网站就需要提供相应的证书,浏览器会对这些证书进行校验。 - server端的单向校验
例如网银,用户必须提供可以证明自己身份的证书,操作才能继续进行。 - server/client的双向校验
例如微信发红包,它是双向校验。微信平台需要校验用户的身份,用户也需要校验服务器的身份。
HTTPS具体应用
针对HTTPS应用场景的分类,下面对其进行逐一演示。
client端的单向校验
- 浏览器的校验
为了保证CA证书的真实性,浏览器在出厂时都内置了知名CA的相关信息,用来校验服务端发送过来的数字证书。一般服务器证书都会包含诸如站点的名称和主机名、公钥、签发机构(CA)名称和来自签发机构的签名等。对于证书的校验,就是使用浏览器CA证书来验证服务端证书的签名是否是这个CA签发的。
通过签名我们可以确认:服务端传来的数字证书(数字证书详解)是否是由某个特定CA签发的;其次,服务端传来的数字证书有没有被中途篡改过。一旦签名验证通过,由于我们信任这个CA,从而信任该主机。但是我们也可以自己选择,当服务器提供的证书不是由浏览器CA签发的时候,是否信任该服务器。
package main
import (
"net/http"
"log"
)
func handler(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte("This is an example server\n"))
}
func main() {
http.HandleFunc("/", handler)
log.Printf("About to listen on 10443.Go to https://127.0.0.1:10443")
err := http.ListenAndServeTLS(":10443", "server