我理解的HTTPS(一)

2019/01/11 Work

HTTPS

HTTS = HTTP + SSL/TLS

下面两个参考链接,应该足够让你明白HTTPS的基本原理:

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

还是图:

digit-certificate-7

SSL/TLS协议的基本过程是这样的:

  1. 客户端向服务器端索要并验证公钥。如何保证公钥不被篡改,将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
  2. 双方协商生成”对话密钥”。 客户端会用第一步得到的公钥对 对话密钥非对称加密,再传给服务端,即使有中间人劫持了数据,拿到的是加密的数据,是无法解密的。服务端用私钥对 对话密钥解密,得到真实的对话密钥。
  3. 双方采用”对话密钥”进行加密通信。 然后服务端用这个对话密钥对真正要传输的数据,比如网页数据,使用对称加密,再传给客户端,客户端用对话密钥对对称加密的数据解密,得到真正的数据。 每一次客户端和服务端直接的请求和响应就是一次对话,就会对应协商生成一个对话密钥,这个对话密钥只对这一次对话有效

详细流程的理解:

  1. SSL/TLS握手阶段的目的是:在客户端生成session key,服务端也生成session key,这两个session key是根据相同的生成算法得到的一样的,最后,服务端利用session key对返回数据(比如网页数据、接口数据等)进行对称加密,将对称加密后的数据传给客户端,客户端用相同的session key对称解密数据,得到真实的数据。利用对称加密的原因是:返回的数据可能会比较大,利用对称加密速度性能比非对称加密好很多。所以,真实的数据是用对称加密算法加密的。

  2. 看图,客户端经过了三步,然后将这三步得到的信息一起综合生成session key。服务端进过了四步,然后将这四步得到的信息一起综合生成session key

  3. 第一步:客户端给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法,发送给服务端。

  4. 第二步:服务端确认双方使用的加密方法,并给出数字证书(CA签署的数字证书,在之前就已签署好,数字证书中包含服务器RSA算法的公钥)、以及一个服务器生成的随机数(Server random)

  5. 第三步:客户端确认校验数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥(服务端放在数字证书中的公钥),加密这个随机数,发给服务端。那么,这个随机数只有服务端用私钥才能解密。

  6. 第四步:服务端使用自己的私钥,解密获取发来的随机数(即Premaster secret),得到真实的Premaster secret。

  7. 第五步:客户端和服务端根据约定的加密方法,使用前面的三个随机数,使用相同的方法,生成”对话密钥”(session key),用来加密接下来的整个对话过程,约定的加密方法一般是对称加密。

数字证书的校验过程

在HTTPS中,数字证书保存着服务端RSA算法的公钥。CA机构保证公钥的真实有效性,防止他人替换公钥。CA机构是如何做到的呢?这里也有一个稍微有些难理解的过程。

CA证书机构给某个组织签署的证书不是由根证书签发的,CA证书机构会分层级,而往往是由中间层级的证书机构签发的。根证书签发出中间证书,中间证书再签发组织的实体证书,也看成是子证书,这样就形成了证书链。

你可以看到浏览器的整数显示是类似这样的:

digit-certificate-8

叶子证书,也就是github这个组织的实体证书,也就是服务端的证书。服务器会把整个证书链信息返回给客户端,也就是这里的浏览器。每个数字证书有其主题信息和签发者信息,可以从这个证书知道客户端想要从叶子证书中获取到服务端公钥,如何获取呢?

叶子证书中有这个证书自己的公钥,CA用这个叶子证书的私钥对一些基本信息+服务端的公钥进行加密,得到数字签名,存在证书上。用证书的公钥对数字签名解密,就能得到服务端的公钥了。所以,问题又转到了如何验证证书的公钥的合法性。

由于叶子证书是上级证书签发的,所以,要验证叶子证书公钥的合法性,就需要到上级证书去校验叶子证书的合法性,而上级证书的合法性由它的上级证书来校验,同理,就会顺着这条证书链,一直找到root根证书。

这样,校验流程就变为:不断往上找上级证书一直到root根证书,再由root根证书往下逐级验证其合法性,直到叶子证书的合法性也校验完毕,得到叶子证书是否合法的。合法,则能够正常使用,不合法,则会报出不安全的信息提醒。

而根证书是自己签发出来的,它的合法性是由操作系统、浏览器或客户端校验的,根证书会内置在操作系统,浏览器中,如果不在,则需要通过更新导入,或者是手动导入。如果你的根证书不在操作系统、浏览器等客户端的白名单列表中,那么这个根证书所签发的证书都不会被客户端校验通过。

digit-certificate-9

根证书的安全性如何保证?

由操作系统或浏览器等客户端进行保管信任,操作系统和浏览器有受信任的根证书列表。比如,一些CA机构管理混乱,或者出现过安全危机或漏洞,做出不符合行业规范的事情,操作系统或者浏览器就会吊销这些CA机构的root根证书,使得这个CA机构签发的证书都无法得到信任。另一个方面是用户不要随便添加根证书,以免造成安全问题。

root根证书的公钥或者,安全性有可能如何被破解或攻击呢?

本地软件生产商:微软,火狐,谷歌,360 等等
本地软件下载站:华军,下载吧,等等
本地应用市场:谷歌,百毒,等等
电信商的钓鱼网站:各ISP(包括小区wifi)
各国内论坛的重制版:各相关论坛
钓鱼更新服务器:各ISP各安全公司
电脑维修点利用漏洞安装的木马。
以及任意进入您电脑的黑客

也就是,如果有人可以操纵你的电脑等终端设备,并且有一定的相关计算机知识,就有可能更改或替换root根证书。想到了盗版软件或系统的安全性问题。

一些CA机构也会公开自己的公钥或者证书信息,你就可以查看自己电脑中的这个CA机构的公钥和他们公开的信息是否一致

参考链接:

http://www.cnblogs.com/oc-bowen/p/5896041.html
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

Search

    Table of Contents