关于https
http是明文通信,所以第三方可以窃听并获取通信内容,甚至是篡改,甚至冒充他人身份参与通信,通信安全没有任何保障。
SSL/TLS就是为了解决着三个问题设计的,在HTTP的基础上加上TLS就是https协议,对应到OSI模型上,就是在应用层(http协议)和传输层(TCP协议)中间增加了一个SSL/TLS子层,保障通信安全。
具体的实现是:在TCP握手完成后,进行SSL握手,通过握手,双方会彼此确认身份,并协商出一个密钥和加密方法,之后的数据收发都会用协商的加密方法和密钥进行加密解密。
SSL/TLS 握手
所以是否安全的关键都在于握手阶段的身份确认和密钥协商,身份确认是通过数字证书,由大家公认的机构颁发和校验;密钥协商流程相对复杂,需要在确认出一个只有双方才知道的密钥,整个握手流程可以分为四步:
- 客户端告知服务器自己支持的加密方式、SSL/TLS的版本和一个随机数A
- 服务器告知客户端选择的加密方式、自己的证书(包含公钥)和服务器生成的另一个随机数B
- 客户端验证身份后,确认公钥的正确性,然后再生成一个随机数C,并用服务器证书中公钥加密,发送给服务器。
- 服务器收到加密的C后,用自己的私钥解密,得到C。然后给客户端发送接下来编码变更通知和握手结束通知。
至此,握手阶段结束,服务器和客户端都知道ABC三个随机数,并且用他们生成一个对称的会话密钥,接下来的通信数据都会通过这个密钥进行加密解密。
因为第三方没有服务器私钥,计算不出第三个随机数C,所以也没办法计算出密钥。因此只有通信双方可以解密出来对端发送的数据,保障了通信的安全。
HTTPS证书
证书是验证服务器身份的关键,那什么是证书?浏览器又如何验证证书?证书中都包含哪些内容呢?
证书本质上是一个二进制文件,它包含证书的颁发机构、持有者、有效期、签名、指纹、服务器公钥等信息,以CSDN的证书为例:
验证HTTPS证书
CA机构除了可以给别人颁发证书外,还可以给自己颁发证书,通常CA机构自己的证书叫做根证书;浏览器通常会预安装一些可信机构的根证书,里面带有机构的公钥。服务器证书的验证就需要用到根证书的公钥,具体的流程是:
用CA证书中的公钥解密签名,得到指纹和指纹算法,然后用指纹算法计算证书内容,和已有的指纹比对,如果一致就代表证书没有被篡改过。
然后再验证证书的持有者是否是和正在访问的服务,再验证颁发时间、有效期等等,都没问题后,就算确认服务器身份了
https 耗时 vs http 耗时
就实际的通信流程来说,https是在http的基础上,多了初期的TLS四次握手和后期实际数据的加密解密。所以不管是连接建立和传输阶段,https都要比http慢一点点。
握手的速度除了跟网络有关,还和证书的安全等级有关。证书有1024、2048、4096位等若干安全等级,位数越多,加解密的耗时越多,所以并不是等级越高越好,在实际使用时,根据安全需求选择合适强度的证书。
参考: