深入了解https

466 阅读6分钟

https是什么:

     在来讲https是什么之前要先了解它是为了解决什么问题而出现的,https之前是使用的http请求做为传输协议,由于http是明文传输导致在传输过程中产生了三个安全问题。

  1. 窃听风险:第三方可以获取信息。
  2. 串改风险:第三方可以修改信息。
  3. 冒充风险:第三方可以冒充用户进行请求。

     为了解决在数据传输过程中出现的风险,https诞生了。https是http在做数据传输时使用SSL/TLS传输协议对数据进行加密传输。该协议使数据得到了一下三种保证:

  1. 所有信息都是加密传播,第三方无法窃听。

  2. 具有校验机制,一旦被篡改,通信双方会立刻发现。

  3. 配备身份证书,防止身份被冒充。

https请求过程:

     https再应用数据传输前先做4次数据传输来保证后续的对称加密,这4次传输都是基于http的明文传输。

  1. Client Hello:客户端会先向服务端发起client hello请求。这一步客户端向服务器传递如下信息。

    1.支持的协议版本 比如TLS1.0。

    2.一个客户端的生成的随机数,用于生成【对话密钥】使用。

    3.支持加密的方法是一个列表,比如RSA公钥加密。

    4.支持的压缩方法。

     2. Server Hello:服务端收到请求后向服务器端作出回应,包含以下内容

1. 确认使用加密通讯协议版本,比如TLS1.0版本。如果浏览器与服务器不一致,服务器关闭加密通信。

2.一个服务生成的随机数,稍后用于生成【对话密钥】。

3.确认使用的加密方法,比如RSA公钥加密。

4.服务器证书。(包含了服务器地址、发证方、公钥等信息)

     3. Client Key Exchange: 客户端收到了服务端的信息后首先会验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不符、或者证书已经过期,就会向访问者显示一个警告,由用户决定是否继续通信。

       如果证书没有问题,就会取出证书中的公钥。生成一个随机数,并用公钥对该随机数进行加密生成pre-master key,防止被窃听。同时通过三个随机数算出【会话密钥】,并加密之前发送所有的信息的hash值,如下内容:

1.pre-master key

2.编码变更通知,表示随后的信息双方都该用协商好的加密方法和密钥加密发送

3.客户端握手结束通知(hash),表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash,用来提供给服务器校验使用。

       4. 服务器收到请求后,先用私钥解密pre-master key,然后同样适用三个随机数和加密算法生成会话密钥,使用回话密钥解密客户端传过来的hash值,与服务器中算出来hash值对比验证加密通讯是否可信。然后向客户端发送下面信息结束握手阶段。

1.编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。

2.服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此整个握手阶段结束。接下来客户端与服务器端进入加密通信,就完全是使用普通的http协议,只不过用【会话密钥】加密内容。

注:之所以不使用非对称加密方式加密应用内容,是因为非对称加密、解密过程耗时长,不利于数据传输效率,而对称加密效率更高,所以才有对称加密来传输应用内容,用非对称加密处理生成会话密钥的过程。

https证书签名认证过程:

1. client端收到server端发过来的证书,证书包含以下内容:

1.Validaity也即有效期,有效期包含生效时间和失效时间,是一个时间区间。 

2.公钥信息Subject public key info 

3.fingerprints信息,fingerprints用于验证证书的完整性,也就是说确保证书没有被修改过。 其原理就是在发布证书时,发布者根据指纹算法(此处证书使用了SHA-1和SHA-256算法)计算整个证书的hash值(指纹)并和证书放在一起,client在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果和刚开始的值相同,则说明证书未被修改过;如果hash值不一致,则表明证书内容被篡改过。

 4.证书的签名Certificate Signature Value和Certificate Signature Algorithm,对证书签名所使用的Hash算法和Hash值; 

5.签发该证书的CA机构Issuer。

 6.该证书是签发给哪个组织/公司信息Subject。 

7.证书版本Version、证书序列号Serial Number以及Extensions扩展信息等。

签名过程:发证机构使用上述信息进行一次内容hash,通过私钥加密生成签名。

验签过程:客户端拿到证书之后同样使用证书信息进行一次内容hash生成h1,并使用公钥解密证书签名生成h2。比较h1与h2是否相同。

证书信任链:

以百度证书为例,百度的证书由颁发机构GlobalSign Organization Validation CA - SHA256 - G2颁发。

1.当客户端访问baidu.com的时候,百度的server会将baidu.com的证书发送给client端。

2.客户端内容根证书,但是百度的证书不是根证书签发的,无法使用根证书的公钥验签,于是client端根据百度的证书中issuer找到该证书的颁发机构GlobalSign Organization Validation CA - SHA256 - G2,去CA请求baidu.com证书的颁发机构GlobalSign Organization Validation CA - SHA256 - G2的证书。

3.请求GlobalSign Organization Validation CA - SHA256 - G2证书发现它的证书是根证书签名的就使用浏览器内置的根证书进行验签,验签成功之后浏览器就信任GlobalSign Organization Validation CA - SHA256 - G2的证书。

4.GlobalSign Organization Validation CA - SHA256 - G2的证书被信任之后,使用GlobalSign Organization Validation CA - SHA256 - G2的公钥去验签百度的签名,成功后浏览器信任百度的证书。

相当于链式信任,根证书-》GlobalSign Organization Validation CA - SHA256 - G2-》百度证书。形成了一条链路最后信任百度证书。

是不是使用https就完全安全了吗 并不是,https也是会被劫持的,需要了解的传送门