https原理推导

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011411993/article/details/81843510

https流程

流程如下:

https流程

https原理推导

  1. 因为http的内容是透明传输的,所以被劫持之后通信内容就全部泄露了。所以,必须要对通信内容进行加密。目前主流的加密方法分为对称加密和非对称加密,https选用的是对称加密。
    问题1:为什么不选用非对称加密?
      假设选用非对称加密,那么客户端使用公钥加密通信内容,然后服务端使用私钥解密,从客户端到服务端的链路可行。而服务端返回数据使用私钥加密,然后客户端使用公钥解密,这样就是存在问题的。因为劫持方也可以获取到服务端的公钥,所以劫持通信内容之后也可以解密。若服务端返回数据使用公钥加密,那客户端必须要使用私钥解密。所以客户端必须要知道服务端的额私钥。这是很危险的,因为劫持方也可以伪装成正常用户访问服务端拿到私钥。而且非对称机密的性能远小于对称加密,所以综合起来选择对称加密。
  2. 服务端和服务端怎么确定对称加密的密码?可以使用非对称加密的方法,客户端使用服务端的公钥加密对称加密的密码然后传送给服务端,然后服务端使用私钥解密。
  3. 服务端将公钥传送给客户端的过程怎么防止中间人劫持替换公钥?https的做法是将公钥以数字证书的方式发送给客户端,且证书中的公钥被第三方CA机构的私钥加密过。客户端在拿到证书之后使用第三方CA机构的公钥解密即可得到服务端公钥。这样如果中间人使用自己伪造的一个假证书做中间人劫持时,那么客户端将无法成功使用CA机构的公钥解密假证书的公钥。
  4. 若中间人也持有一个由相同CA机构颁发的数字证书,中间人只需要将数字证书中的被加密的公钥替换成自己被CA私钥加密的公钥,依然可以成功实现中间人劫持,此时客户端使用CA机构的公钥可以成功解密出数字证书中的公钥。所以需要解决同一机构颁发的不同证书被篡改的问题。
  5. https使用数字签名的方法来解决这一问题。数字证书会有一个数字签名,而签名算法在数字证书中也
    会给出。客户端拿到证书后只需要按照证书中的签名算法对证书内容进行签名就可以得到一个数字签名,然后再与证书中的数字签名进行比对,得知证书是否被篡改过。
  6. 上述方法依然不可靠,因为中间人也可以模仿客户端,在篡改证书的公钥之后重新生成数字签名。
  7. https防止中间人模仿签名的行为,方法是使用CA机构的私钥对证书的数字签名进行加密,这样就算中间人篡改了证书的公钥,然后重新生成了数字签名,由于不知道CA机构的私钥所以无法对数字签名加密,所以客户端无法成功解密。这样就彻底防止了数字证书篡改,就保证了数字证书一定是CA机构颁发的合法且没有被篡改的证书。
    问题2:若中间人拥有一个同一CA机构颁发的合法证书,劫持之后不篡改证书,而是替换整个证书,这样在客户端看来,签名是有效的,依然会劫持成功,怎么防止?
      因为证书中有网站的域名信息,所以可以通过域名来判断证书是否被替换,因为如果证书被替换了,那么证书里面的域名肯定和你要访问网站的域名不同。

CA证书

  CA机构下发给网站的证书都是一个证书链,也就是一层一层的证书,从根证书开始,到下级CA,一层一层,最后一层就是网站证书。浏览器收到服务器发送的证书后,需要验证其真实性。而证书的签名是通过签名算法和上级CA的私钥生成的,并非上面说的简单靠CA机构的私钥生成。浏览器需要用上级CA的公钥才能解密签名,并与生成的指纹对比,那么问题来了,这个上级CA的公钥从哪来呢?此公钥来自于证书链该层的上级CA的证书明文内,X509v3证书中包含了公钥信息。证书链由多个证书一层一层组成的,除了最底层的网站证书的公钥是给用户加密报文外,其他层证书中的公钥均用于解密底层的证书指纹签名。最高层的根证书是自签名的,也就是自己颁发给自己,所以它的公钥不仅用来解密下层的签名,也用来给自己的签名解密。

猜你喜欢

转载自blog.csdn.net/u011411993/article/details/81843510