HTTPS如何保证安全?

613 阅读2分钟

前言

HTTPS(HTTP + SSL/TLS),http协议为明文传输,传输数据可能会被传输过程中的中间人泄露以及篡改,https可以防止该问题发生。

当访问一个https网站时,浏览器会先向服务器的443端口建立SSL握手,然后才使用握手期间协商的密钥加密数据并传输。SSL握手的作用主要是:

  • 验证服务器的证书是否合法。
  • 协商加密算法以及对称加密所使用的密钥(保证该密钥不泄露是关键)。

SSL握手过程

猜想

那么握手期间如何保证该密钥不泄露呢?

首先可以想到使用非对称加密,服务器生成一对公私钥,将公钥给浏览器,然后浏览器使用公钥加密对称加密密钥,此时即使中间人获取到服务器公钥及该信息,但因为公钥无法解开公钥的加密的密文,所以无法获取到信息。

此种方式是不安全的,原因是服务器在下发pub_key时,中间人可以重新伪造一对公私钥,然后将自己伪造的公钥给浏览器,此时浏览器所发送的信息中间人就可以看到以及篡改了。

CA认证

上述问题主要在于无法辨别服务器下发公钥的真伪,通过CA颁发的证书即可解决该问题。

在 CA 认证体系中,所有的证书都是由权威机构来颁发,而权威机构的 CA 证书都是已经在操作系统中内置的,我们把这些证书称之为CA根证书。

签发证书

我们的应用服务器如果想要使用 SSL 的话,需要通过权威认证机构来签发CA证书,我们将服务器生成的公钥和站点相关信息发送给CA签发机构,再由CA签发机构通过服务器发送的相关信息用CA签发机构进行加签,由此得到我们应用服务器的证书,证书会对应的生成证书内容的签名,并将该签名使用CA签发机构的私钥进行加密得到证书指纹,并且与上级证书生成关系链。

如何验证服务器证书

那么客户端(浏览器)又是如何对服务器证书做校验的呢,首先会通过层级关系找到上级证书,通过上级证书里的公钥来对服务器的证书指纹进行解密得到签名(sign1),再通过签名算法算出服务器证书的签名(sign2),通过对比sign1和sign2,如果相等就说明证书是没有被篡改也不是伪造的。

大体流程

这样即可防止中间人篡改或偷窥http传输报文了。