Skip to main content

了解 HTTPS 为什么安全

HTTPS 简介

HTTP协议是明文传输的,这就意味着,介于发送端、接收端中间的任意节点都可以知道你们传输的内容是什么。这些节点可能是路由器、代理等。

HTTPS其实就是Hyper Text Transfer Protocol Secure,其实就是在HTTPTCP中间加多了一层加密层TLS/SSLTLSSSL的升级版。现在提到HTTPS,加密套件基本指的是TLS

原来HTTP是应用层将数据直接给到TCP进行传输,现在HTTPS改成应用层将数据给到TLS/SSL,将数据加密后,再给到TCP进行传输。这样即使数据被中间节点截获,坏人也看不懂。

HTTP默认端口是80/tcpHTTPS默认端口是443/tcp443/udp

加密/协商沟通方式

一般来说,加密分为对称加密、非对称加密(也叫公开密钥加密)。

对称加密:加密数据用的密钥,跟解密数据用的密钥是一样的。

非对称加密:有公钥和私钥,通过公钥加密的数据,只能通过私钥解开。通过私钥加密的数据,只能通过公钥解开。

  • 单纯使用对称加密是不能确保安全的,因为无法将明文秘钥安全地传输而不被中间节点劫取。

  • 单纯地使用非对称加密虽然安全,双方都将发送的数据用对方的公钥加密,各自的私钥解密,但是开销非常大,也不合适。

  • 所以需要将对称加密和非对称加密结合使用:客户端得到服务端的公钥,生成加密数据的密钥,用服务端的公钥加密发送给服务端,服务端用私钥解密得到密钥,双方用该密钥沟通。

然而这种方式交换密钥也并不安全,中间人可能将自己的公钥给客户端,但是客户端并不能辨别公钥的来源,待客户端用该公钥加密密钥并发送后,再用自己的私钥解密获得密钥,之后就可以破解沟通的信息。

因此,确保数据传输的关键点,就在于确保公钥来源的安全性,确保是服务端的公钥。

证书颁发机构

这时候就引入了第三方,权威的证书颁发机构CA来解决这个问题。

证书颁发机构:审核网站的申请证书申请并颁发证书。

证书:可以暂时把它理解为网站的身份证。这个身份证里包含了很多信息,其中就包含了上面提到的公钥。

证书里面主要包含如下信息:

  1. 证书颁发机构
  2. 服务端网址
  3. 机构私钥加密的服务端公钥
  4. 机构私钥加密的证书签名
  5. 证书签名用到的hash 算法

当客户端去访问网站时,不需要主动去找网站的公钥,网站会把自己的证书发给浏览器,浏览器会获取到证书中服务端的公钥加密数据。

证书中的公钥如果没有被中间人篡改的话,基本都是可信的,可以确保是服务端的公钥。(为什么说基本可信,因为证CA也可能自己伪造证书...)可以颁发证书的CA有很多,但只有少数CA被认为是权威、公正的,这些CA颁发的证书,浏览器才认为是信得过的。

而证书非法可能有两种情况:

  1. 证书是伪造的:压根不是CA颁发的
  2. 证书被篡改过:比如将中间人将网站的公钥给替换了

那么怎么确保证书的合法安全有效呢?

这里首先要了解证书中的摘要和数字签名。

摘要:摘要就是对证书内容(不包括签名,不知道包不包括hash算法...),通过hash算法计算出一段固定长度的串(一般用SHA-2MD5不够安全)。

数字签名:通过CA的私钥对上面的摘要进行加密,生成数字签名。

浏览器识别伪造证书

  1. 对于伪造的证书,这种情况比较简单。

如果浏览器不认识该证书颁发的机构,直接认定为危险证书;

如果证书颁发的机构确实存在,于是根据CA名,找到对应内置的CA根证书、CA的公钥,然后用CA的公钥,对伪造的证书的摘要进行解密,发现解不了,认为是危险证书。

  1. 对于篡改过的证书,假设中间人通过某种途径拿到真实的证书,然后用CA的公钥对真实证书解密,再将真实证书的公钥偷偷修改成自己的,然并软。

浏览器会检查证书,根据CA名,找到对应的CA根证书,以及CA的公钥。用CA的公钥,对证书的数字签名进行解密,得到对应的证书摘要AA。浏览器会根据证书签名使用的hash算法,对证书内容重新计算出当前证书的摘要BB。对比AABB,发现不一致,认定为危险证书。

至此,可以确保证书的合法安全有效。


参考文章:

1)深入浅出 HTTPS (详解版) 2)最详细的 HTTPS 科普扫盲帖 3)浏览器如何对 SSL 证书进行验证? 4)竟然是 300 万的诈骗案!