Skip to content

https是怎么工作的?

Https加密使用了对称加密、非对称加密、数字证书和数字签名等加密技术。

为什么需要https?

如果是http协议来传输数据,那么所有请求报文的内容都是明文的。如果你在家里通过浏览器上网,那么数据的传输会经过你的家庭路由器、运营商的路由器和交换机等各种设备,最终到达目标服务器,在这些经过的设备上获取报文,会暴露你的所有网上行为,如果内容中包含你的隐私信息,如信用卡信息、网站密码等,想想这些信息在坏人手上,他可能会做什么。而不能保证数据完整性,那么在传输的数据还可能被篡改,想想转账时候转入帐户和金额被篡改了。所以为了安心的上网,我们需要对我们通过网络传输的信息进行加密。这时候,我们需要https。

ps: 如果你正在访问一个http网站,请不要向其发送任何敏感的信息,比如用户名、密码。因为这些信息都可能在传输过程中被拦截。

Https的工作流程(浏览器为例)

  1. 客户端发起http请求,告诉服务器自己支持哪些算法。
  2. 服务器把自己的信息以数字证书的形式返回给客户端。
    • 数字证书包含网站公钥、网站地址、证书颁发机构、有效日期、hash算法等明文信息。
    • 网站私钥由网站服务器持有。
    • 数字证书还包含了数字签名,该签名由数字证书的明文部分hash后,由CA机构的私钥加密产生。
  3. 客户端收到服务器的响应后会先验证证书的合法性。
    • 如证书包含的地址是不是和正在访问的网址一致,证书是否过期。
    • 浏览器内置了信任的CA机构签发的根证书,通过内置证书的公钥解密数字签名,解密成功,则表示该证书的来源可信赖。根据证书指定的hash算法,对证书明文部分进行hash,如果和数字证书解密后的内容一致,则表示数字证书没有被篡改。
  4. 如果证书验证通过,浏览器就会生成一个随机的对称加密密钥(session key),并使用网站公钥进行加密,发送给网站服务器。服务器用网站私钥来进行解密,获取对称加密密钥。(非对称加密done)
  5. 后续浏览器和服务器之间的交互,就通过加密密钥进行对称加密。

为什么不直接使用对称加密

如果服务器只服务一个客户,那双方约定一个只有双方知道的密钥,对称加密本身也没有问题。

但是如果是个公共服务,如公网的网站,要么大家都知道密钥,那等于没有密钥。

如果为每个人都分配个密钥,那么密钥怎么分发呢?在网络传输中被拦截了,怎么办?如果是浏览器中预存密钥,那么浏览器中是不是要预存世界上所有的密钥,新增的怎么办?没有好的解决方法。

为什么不直接用非对称加密

用户访问网站,获取网站的公钥,客户端向服务端发送的通过公钥加密后的消息。由于只有服务器拥有私钥,所以可以客户端向服务端发送消息的私密性是可以保证的。但是服务端怎么返回消息呢?所有客户端都可以获取公钥,都可以解密服务端发出的消息。所以光这样做还是不安全的。

通过非对称加密只能保证单向数据传输的私密性,那是不是可以让客户端也拥有自己的私钥,客户端向服务端发送自己的公钥,这样服务端就可以用客户端的公钥加密发送给客户端的消息了。这样做可以保证双向数据传输的私密性,非对称加密相对于对称加密来说是个很非常消耗性能的操作。

数字证书的作用

你怎么知道响应你的是真正你要访问的网站服务器,而不是因为dns污染或者在传输线路中拦截了你的请求的李鬼呢?

这时候就需要数字证书了。它的作用就是认证服务器身份。如果中间人要返回给你虚假响应,那么首先它要伪造一个数字证书。这个数字证书,需要受认可的CA机构颁发,还需要和你当前访问的域名一致。如果CA机构在同一个时间点,给不同实体颁发了相同域名的证书,那么就是这个CA认证机构的重大安全事故了。

通常来说,如果客户端拥有了合法的根证书,那么是可以保证证书的合法性的。在访问域名正确的情况下,现代的浏览器是可以规避中间人假冒网站的情况的。

PS: 不要随便把不明来源的证书加入的浏览器中,否则就会有被钓鱼的风险。

为什么制作数字证书需要hash后再用私钥加密

出于性能方面的考虑。Hash是个相对比较快的操作,非对称加密相对来说比较耗时,hash后对固定长度的数据进行非对称加密,效率相对来说会有保证些。

Published in基础知识系统设计

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *