本文主要想说明以下几个问题:
1.https解决了什么问题?
2.https是如何解决数据在网络传输中的安全问题的?
3.https的运行过程是怎样的?
4.如何使用https?
一、https解决了什么问题
http在网络传输过程中都是明文传输,在传输过程中存在以下风险(下文称风险1、风险2、 风险3):
- 内容被窃听:传输过程中数据被第三方看到
- 内容被篡改:数据传输过程中,被第三方修改
- 被第三方冒充:通信过程中,被第三方冒充身份,进行通信,比如被冒充身份与银行通信,将钱转出。
https的出现主要就是为了解决以上三个问题。
二、https是如何解决数据在网络传输中的安全问题的
为了解决内容被窃听,最简单的方法就是加密。客户端发送请求给服务端,服务端返回加密后的数据给客户端,客户端通过密钥解密,获取内容。这个过程中,只有看客户端和与之通信的服务端才有密钥,所以,如果加密算法的安全性足够强,是能够保证数据不被第三方看到的。并且由于加密方式未知,通信的内容也无法被篡改,也不太容易被冒充身份。
当然,这只是理想状态下的情形。在互联网环境中,每个服务端和客户端通信时都要使用不同的密钥,而且在不同的会话过程中也要使用不同的密钥。而双方通信前,必须要商定使用哪一种密钥,或者存储密钥,这在实际情况中几乎是不可能的。
为了解决密钥的分发问题,https采用了非对称加密算法。既然有非对称加密,就一定有对称加密,下面解释一下二者的区别。
**对称加密:**如下图,加密和解密使用相同的密钥,解密为加密的逆运算。
**非对称加密:**与对称加密对应的,非对称加密则有两个密钥,一个公钥,一个私钥。公钥和私钥是一对,二者只能配合使用,虽然二者是相关的,但是无法通过公钥推断出私钥,反之也不可以。可以用公钥加密用私钥解密,也可以用私钥加密,用公钥解密。非对称加密有极强的保密性,安全性非常高,但是由于算法复杂,导致运算速度相对较慢。
有了非对称加密,似乎密钥分发的问题迎刃而解了。假设A,B 都有自己的公钥和私钥。则A和B通信的过程可以是:
(1)A和B交换彼此的公钥。
(2)A使用B的公钥,加密请求,发送给B。
(3)B使用私钥获取请求内容,并用A的公钥将应答数据加密后发送给A
(4)A通过自己的私钥解密数据,获得明文。
我们分析一下以上过程,首先这个过程是可以防止风险1的。对于风险2,即使被篡改了,无法被A正确解密,其破坏性也有限。对于风险3,如果中间人C可以获取A,B的通信内容,则完全可以在步骤(1) 获得A, B的公钥,再将自己的公钥分别分发给A, B,则A,B发送过程中的信息都是用C的公钥加密,C可以使用自己的私钥解密,并且A、B对此毫不知情。
造成这个问题的原因是通信双方无法得知,自己所获取到的对方的公钥的真实性。为了解决公钥真实性问题,https使用数字证书来保证公钥的真实性。
数字证书:
服务端会向权威机构申请数字证书。
数字证书中包含用于给浏览器加密的公钥,申请人的基本信息,但是会使用机构的私钥进行加密。
通信过程中,浏览器拿到了从服务端返回的证书,首先由于浏览器在安装的时候已经内置了信任的机构的证书,如果互相信任,则浏览器中保存了该机构用于对明文进行加密的私钥的公钥。浏览器使用公钥解密得到服务端的基本信息,如果和自己需要请求的服务端信息相同则表示信息是正确的,则可以获得服务端的公钥。在这个过程中,如果有第三方想要冒充服务端和浏览器通信,由于没有被信任的证书,所以是做不到的,或者即使有被信任的证书,但是整数中的身份信息是无法修改的,同样在身份验证过程中也是不会被浏览器接受的。
但是非对称加密算法有一个问题:由于算法复杂,导致运算时间长,如果每次通信都使用公钥加密数据,则会非常耗时。上文中我们说到,如果可以解决通信双方密钥分发的问题,则使用运算时间短的对称加密,在安全上也足够了。因此,https采用了对称加密 + 非对称加密的策略。非对称加密算法只用来交换对称加密的密钥和加密算法,在后面的通信中使用对称加密算法来加密数据,兼顾了安全性和效率。
三、https的运行过程
(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成”对话密钥”(对称加密算法密钥)。
(3) 双方采用”对话密钥”进行加密通信。
其中前两步是握手阶段。详细如下:
1.浏览器向服务器发送请求加密通信的请求。请求内容如下:
(1) 支持的协议版本,比如TLS 1.0版。
(2) 一个客户端生成的随机数,稍后用于生成”对话密钥”。
(3) 支持的加密方法,比如RSA公钥加密。
(4) 支持的压缩方法。
2.服务器收到请求后,向浏览器回应。内容如下:
(1) 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
(2) 一个服务器生成的随机数,稍后用于生成”对话密钥”。
(3) 确认使用的加密方法,比如RSA公钥加密。
(4) 服务器证书。
3.浏览器收到服务器的回应后,首先校验证书是否是受信任的机构颁发的,是否过期,如果都正常,使用内置的证书中的私钥解密服务器返回证书,得到服务器的域名等信息。如果和自己请求的服务器域名信息一致则校验通过。取出服务器证书中的公钥。并发消息给服务器,内容如下:
(1) 一个随机数。该随机数用服务器公钥加密,防止被窃听。
(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(3) 浏览器握手结束通知,表示浏览器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
4.服务器收到信息后,根据前三次通信的三个随机数,以及双方商定的加密算法,生成密钥。然后向浏览器发送如下信息:
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
使用三个随机数是为了增加随机度,增加算法的随机性,因为计算机生成的随机数一般都是伪随机数,使用三个伪随机数,可以近似看作随机数了。
经过以上四个步骤,浏览器和服务器商定了通信的密钥,则每次通信和http通信,除了信息会使用密钥加密,其他没什么区别了。
经常会出现因为某些原因导致https会话中断,如果重新进行握手比较耗时,常见的作法是使用session id,或者session ticket 来恢复https会话。
四、如何使用https
1.获取证书
2.服务器上安装证书
3.将网页加载的 HTTP 资源,要全部改成 HTTPS 链接。因为加密网页内如果有非加密的资源,浏览器是不会加载那些资源的。
4.修改服务器配置,将http导向https
参考文献:
1.zhuanlan.zhihu.com/p/43789231
2.zhuanlan.zhihu.com/p/36981565