实际使用中,绝大多数的网站现在都采用的是https协议,这也是未来互联网发展的趋势。
HTTPS协议(Hypertext Transfer Protocol Secure Socket Layer),是HTTP协议的加强安全版本。HTTPS协议是基于HTTP协议的,也是基于TCP协议作为底层协议,并额外使用SSL/TLS协议用作加密和安全认证。现在它被广泛用于网上安全敏感的通讯,例如交易支付方面。
HTTPS协议默认端口号为443
HTTPS协议可简单理解为HTTP+SSL/TLS,通过SSL证书来①验证服务器的身份,②并为浏览器和服务器之间的通信进行加密。
HTTPS协议是将HTTP通信接口部分用SSL或TLS协议代替而已。
SSL/TLS功能的实现主要依赖于三类基本算法:
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案。
主要有以下几个好处:
1.Client发起一个HTTPS的请求(比如https://juejin.cn/user/4283353031252967
),根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
2.Server把事先配置好的公钥证书(public key certificate)返回给客户端。
3.Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
4.Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。
5.Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
6.Server使用对称密钥加密“明文内容A”,发送给Client。
7.Client使用对称密钥解密响应的密文,得到“明文内容A”。
8.Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。
这种方式加密和解密使用同一个密钥。加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。
以对称加密方式加密时必须将密钥也发给对方。可究竟怎样才能安全地转交?在互联网上转发密钥时,如果通信被监听那么密钥就可会落人攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的密钥。
公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。
使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。
非对称加密的特点是信息传输一对多,服务器只需要维持一个私钥就能够和多个客户端进行加密通信。
这种方式有以下缺点:
使用对称密钥的好处是解密的效率比较快,使用非对称密钥的好处是可以使得传输的内容不能被破解,因为就算你拦截到了数据,但是没有对应的私钥,也是不能破解内容的。就比如说你抢到了一个保险柜,但是没有保险柜的钥匙也不能打开保险柜。那我们就将对称加密与非对称加密结合起来,充分利用两者各自的优势,在交换密钥环节使用非对称加密方式,之后的建立通信交换报文阶段则使用对称加密方式。
具体做法是:发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”,这样可以确保交换的密钥是安全的前提下,使用对称加密方式进行通信。所以,HTTPS采用对称加密和非对称加密两者并用的混合加密机制。
Note:SSL/TLS协议为什么要使用非对称加密和对称加密结合的方式?
网络传输过程中需要经过很多中间节点,虽然数据无法被解密,但可能被篡改,那如何校验数据的完整性呢?----校验数字签名。
数字签名,是 CA 在给服务器颁发证书时,使用散列+加密的组合技术,在证书上盖个章,以此来提供验伪的功能。
数字签名有两个作用:
CA对服务器提交的公钥,采用散列函数生成一个消息摘要。CA使用CA私钥对该摘要进行加密,并附在证书下方,这样数字签名就生成了。然后CA将带有数字签名的证书发送给服务器。
服务器将带有数字签名的CA证书发送给客户端,客户端需要验证该证书的身份。
客户端找到第三方机构CA,得到CA的公钥,并用CA公钥对证书的数字签名进行解密,就可获得CA生成的摘要。
客户端对证书中的服务器公钥做相同的散列处理,得到一个摘要,将该摘要和之前从数字签名中解密得到的CA生成的摘要进行对比。如果相同,则身份验证成功,说明收到的信息是完整的,否则验证失败,说明信息被修改过。
客户端 C 和服务器 S 想要使用 SSL/TLS 通信,C 需要先知道 S 的公钥,而 S 公钥的唯一获取途径,就是把 S 公钥在网络信道中传输。要注意网络信道通信中有几个前提:
因此,假设存在一个攻击者 A,发送给 C 一个诈包来假装是 S 的公钥,其实是诱饵服务器 AS 的公钥。当 C 收获了 AS 的公钥(却以为是 S 的公钥),C 后续就会使用 AS 公钥对数据进行加密,并在公开信道传输,那么 A 将捕获这些加密包,用 AS 的私钥解密,就截获了 C 本要给 S 发送的内容,而 C 和 S 二人全然不知。
为了解决公钥传输的信赖性问题,第三方机构应运而生——证书颁发机构(CA,Certificate Authority)。
CA默认是客户端和服务器都受信任的第三方,它会给各个服务器颁发证书,证书存储在服务器上,并附有CA的电子签名。
当客户端C向服务器S发送HTTPS请求时,一定要先获取目标服务器的证书,并根据证书上的信息,检验证书的合法性。一旦客户端监测到证书非法,就会发生错误。客户端获取了服务器的证书以后,由于证书的信任性是由第三方信赖机构认证的,而证书上又包含着服务器的公钥信息,客户端就可以放心的信任证书上的公钥就是目标服务器的公钥。