HTTPS 简介
HTTP
协议是明文传输的,这就意味着,介于发送端、接收端中间的任意节点都可以知道你们传输的内容是什么。这些节点可能是路由器、代理等。
HTTPS
其实就是Hyper Text Transfer Protocol Secure
,其实就是在HTTP
跟TCP
中间加多了一层加密层TLS/SSL
。TLS
是SSL
的升级版。现在提到HTTPS
,加密套件基本指的是TLS
。
原来HTTP
是应用层将数据直接给到TCP
进行传输,现在HTTPS
改成应用层将数据给到TLS/SSL
,将数据加密后,再给到TCP
进行传输。这样即使数据被中间节点截获,坏人也看不懂。
HTTP
默认端口是80/tcp
,HTTPS
默认端口是443/tcp
、443/udp
。
加密/协商沟通方式
一般来说,加密分为对称加密、非对称加密(也叫公开密钥加密)。
对称加密:加密数据用的密钥,跟解密数据用的密钥是一样的。
非对称加密:有公钥和私钥,通过公钥加密的数据,只能通过私钥解开。通过私钥加密的数据,只能通过公钥解开。
-
单纯使用对称加密是不能确保安全的,因为无法将明文秘钥安全地传输而不被中间节点劫取。
-
单纯地使用非对称加密虽然安全,双方都将发送的数据用对方的公钥加密,各自的私钥解密,但是开销非常大,也不合适。
-
所以需要将对称加密和非对称加密结合使用:客户端得到服务端的公钥,生成加密数据的密钥,用服务端的公钥加密发送给服务端,服务端用私钥解密得到密钥,双方用该密钥沟通。
然而这种方式交换密钥也并不安全,中间人可能将自己的公钥给客户端,但是客户端并不能辨别公钥的来源,待客户端用该公钥加密密钥并发送后,再用自己的私钥解密获得密钥,之后就可以破解沟通的信息。
因此,确保数据传输的关键点,就在于确保公钥来源的安全性,确保是服务端的公钥。
证书颁发机构
这时候就引入了第三方,权威的证书颁发机构CA
来解决这个问题。
证书颁发机构:审核网站的申请证书申请并颁发证书。
证书:可以暂时把它理解为网站的身份证。这个身份证里包含了很多信息,其中就包含了上面提到的公钥。
证书里面主要包含如下信息:
- 证书颁发机构
- 服务端网址
- 机构私钥加密的服务端公钥
- 机构私钥加密的证书签名
- 证书签名用到的hash 算法
当客户端去访问网站时,不需要主 动去找网站的公钥,网站会把自己的证书发给浏览器,浏览器会获取到证书中服务端的公钥加密数据。
证书中的公钥如果没有被中间人篡改的话,基本都是可信的,可以确保是服务端的公钥。(为什么说基本可信,因为证CA
也可能自己伪造证书...)可以颁发证书的CA
有很多,但只有少数CA
被认为是权威、公正的,这些CA
颁发的证书,浏览器才认为是信得过的。
而证书非法可能有两种情况:
- 证书是伪造的:压根不是
CA
颁发的 - 证书被篡改过:比如将中间人将网站的公钥给替换了
那么怎么确保证书的合法安全有效呢?
这里首先要了解证书中的摘要和数字签名。
摘要:摘要就是对证书内容(不包括签名,不知道包不包括hash
算法...),通过hash
算法计算出一段固定长度的串(一般用SHA-2
,MD5
不够安全)。
数字签名:通过CA
的私钥对上面的摘要进行加密,生成数字签名。
浏览器识别伪造证书
- 对于伪造的证书,这种情况比较简单。
如果浏览器不认识该证书颁发的机构,直接认定为危险证书;
如果证书颁发的机构确实存在,于是根据CA
名,找到对应内置的CA
根证书、CA
的公钥,然后用CA
的公钥,对伪造的证书的摘要进行解密,发现解不了,认为是危险证书。
- 对于篡改过的证书,假设中间人通过某种途 径拿到真实的证书,然后用
CA
的公钥对真实证书解密,再将真实证书的公钥偷偷修改成自己的,然并软。
浏览器会检查证书,根据CA
名,找到对应的CA
根证书,以及CA
的公钥。用CA
的公钥,对证书的数字签名进行解密,得到对应的证书摘要AA
。浏览器会根据证书签名使用的hash
算法,对证书内容重新计算出当前证书的摘要BB
。对比AA
和BB
,发现不一致,认定为危险证书。
至此,可以确保证书的合法安全有效。
参考文章:
1)深入浅出 HTTPS (详解版) 2)最详细的 HTTPS 科普扫盲帖 3)浏览器如何对 SSL 证书进行验证? 4)竟然是 300 万的诈骗案!