HTTPS(Hypertext Transfer Protocol over Secure Socket Layer,基于安全套接字层的超文本传输协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。其所用的端口号是443。
SSL和TLS
SSL:SSL(Secure Socket Layer,安全套接字层),是Netscape公司设计的主要用于web的安全传输协议。这种协议在WEB上获得了广泛的应用。通过证书认证来确保客户端和网站服务器之间的通信数据是加密安全的。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
TLS:TLS(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
SSL 发展到 v3 时已经证明了它自身是一个非常好的安全通信协议,于是互联网工程组 IETF 在 1999 年把它改名为 TLS(传输层安全,Transport Layer Security),正式标准化,版本号从 1.0 重新算起,所以 TLS1.0 实际上就是 SSLv3.1。TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1(可简单理解为同一事物不同阶段的不同称呼)。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。
TLS 已经发展出了三个版本,分别是 2006 年的 1.1、2008 年的 1.2 和2018年的 1.3。每个新版本都紧跟密码学的发展和互联网的现状,持续强化安全和性能,已经成为了信息安全领域中的权威标准。
目前应用的最广泛的 TLS 是 1.2,而之前的协议(TLS1.1/1.0、SSLv3/v2)都已经被认为是不安全的。
为什么使用HTTPS
HTTPS协议主要是为了解决HTTP协议存在的安全问题,使用HTTP协议传输,存在以下风险:
(1) 窃听⻛险,⽐如通信链路上可以获取通信内容,从而盗取用户账号。
(2) 篡改⻛险,⽐如强制植⼊垃圾⼴告,带来视觉污染。
(3) 冒充⻛险,⽐如冒充他人身份购物,导致用户金钱损失。
HTTPS原理
HTTPS就是在应用层和网络层补充了SSL/TSL。HTTP 的请求/响应一般可分为六步:(1) 建立TCP连接;(2) 发送HTTP请求;(3) 服务器处理请求;(4) 返回HTTP响应;(5) 释放TCP连接;(6) 浏览器解析返回的资源和数据。而,HTTPS是在完成TCP连接建立后,再补充一个SSL连接建立的过程,建立安全连接后,才是发送HTTP请求等后续事宜。接下来重点介绍下SSL建立连接(这里指TLS 1.2)的过程。
(1) 在 TCP 建立连接之后,浏览器会首先发一个"Client Hello"消息,也就是跟服务器“打招呼”。里面有客户端的版本号、支持的密码套件,还有一个随机数(Client Random)明文,用于后续生成会话密钥。
(2) 服务器收到"Client Hello"后,会返回一个"Server Hello"消息。把版本号对一下,也给出一个随机数(Server Random)明文,然后从客户端提供的密码套件列表里选一个作为本次通信使用的密码套件(如 ECDHE 算法)。同时,服务器为了证明自己的身份,就把证书(Server Certificate)也发给了客户端。因为服务器已经选择了密码套件,所以它会在证书后发送"Server Key Exchange"消息,里面是公钥(Server Params),用来实现密钥交换算法,再加上自己的私钥签名认证。
之后是“Server Hello Done”消息,表示"打招呼完毕"。这样第一个消息往返就结束了(两个 TCP 包),结果是客户端和服务器通过明文共享了三个信息:Client Random、Server Random 和 Server Params。
(3) 浏览器拿到服务器的证书后,开始确认证书的真实性,用证书公钥验证签名。确认服务器身份后,浏览器根据已选择的密码套件,生成一个公钥(Client Params),然后用"Client Key Exchange"消息发给服务器。现在浏览器和服务器手里都拿到了密钥交换算法的两个参数(Client Params、Server Params),接着就用密码套件算法,算出"Pre-Master"。现在浏览器和服务器手里有了三个随机数:Client Random、Server Random 和 Pre-Master。用这三个作为原始材料,就可以生成用于加密会话的主密钥,叫"Master Secret"。而黑客因为拿不到"Pre-Master",所以也就得不到主密钥。
为什么需要Client Random、Server Random 和 Pre-Master 三个随机数?这主要是因为,TLS 协议不信任浏览器或服务器伪随机数的可靠性,为了保证真正的"完全随机"、“不可预测”,就把三个不可靠的随机数混合起来,那么"随机"的程度就更高了,安全性也就更有保障。
有了主密钥和基于主密钥派生的会话密钥(Session Secret),握手就快结束了。浏览器发送一个"Change Cipher Spec"消息,然后再发送一个"Finished"消息,把之前所有发送的数据做个摘要,再加密一下,让服务器做个验证。
(4) 服务器接收到浏览器的验证请求后,按照相同的步骤,分别发送"Change Cipher Spec"和"Finished"消息。
(5) 完成上述操作后,TSL连接就建立完成了,接下来就是通过加密的方式来发送HTTP请求和响应。
为什么使用证书
简单来说,证书+数字签名的方式,可以保证证书内容不被篡改,防止"中间人攻击",相当于告诉了浏览器验证服务器身份的手段,也即单向认证。
单向认证和双向认证
单向认证就是客户端需要认证服务端。
双向认证和单向认证原理基本差不多,主要区别是除了客户端需要认证服务端以外,服务端对客户端也需要认证。什么场景下需要验证客户端呢?比如一些银行业务,银行会要求客户必须在电脑上插入它们签发的U盾之类的东西,或者安装什么控件,这里就类似客户端证书的概念,没有这个证书的人无法使用银行提供的业务。
每次进行HTTPS请求时都必须在SSL/TLS层进行握手传输密钥吗?
每次请求都经历一次密钥传输过程非常耗时,那怎么达到只传输一次呢?服务器会为每个浏览器维护一个session ID,在TLS握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了。
HTTPS用的是对称加密还是非对称加密
要回答这个问题,需要再梳理一下HTTPS的原理。HTTPS原理见上文。
介绍完HTTPS的原理,就可以知道,HTTPS使用非对称加密传输一个对称密钥,让服务器和浏览器都得知。然后两边都使用这个对称密钥来加密解密收发数据。因为传输密钥K是用非对称加密方式,很难破解比较安全。而具体传输数据则是用对称加密方式,加快传输速度。两全其美。
云服务如何实现HTTPS
对云服务来说,没有必要在每个微服务里实现HTTPS,网上也有很多面向Spring Boot实现HTTPS的文章。对于云服务来说,只需在服务入口处实现即可,常见的实现场景有两种,一种是面向静态资源的CDN,另一种是面向服务的LB。当然,可能还包括防火墙等其他情况。具体可以参考这两篇WIKI:一文带你搞懂阿里云上HTTPS配置、腾讯云实现全站 HTTPS 方案。
对开发者、架构师来说,只需要了解HTTPS的原理,并在需要实现HTTPS时,根据现有设计,在对应的组件上实现HTTPS配置,而这配置一般都是依赖云平台。
HTTPS缺点
HTTPS协议具有以下缺点:
(1) HTTPS协议多次握手,导致页面的加载时间延长近50%。
(2) HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗。
(3) 申请SSL证书需要钱,功能越强大的证书费用越高。
(4) SSL涉及到的安全算法会消耗 CPU 资源,对服务器资源消耗较大。
HTTP 与 HTTPS 的区别
HTTP 是超⽂本传输协议,信息是明⽂传输,存在安全⻛险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在TCP 和 HTTP ⽹络层之间加⼊了 SSL/TLS 安全协议,使得报⽂能够加密传输。
HTTP 连接建⽴相对简单, TCP 三次握⼿之后便可进⾏ HTTP 的报⽂传输。⽽ HTTPS 在 TCP 三次握⼿之后,还需进⾏ SSL/TLS 的握⼿过程,才可进⼊加密报⽂传输。
HTTP 的端⼝号是 80,HTTPS 的端⼝号是 443。
HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
参考
https://blog.csdn.net/hguisu/article/details/8680808 HTTPS实现原理
https://zhuanlan.zhihu.com/p/466239718 面试必备:计算机网络常问的六十二个问题
https://zhuanlan.zhihu.com/p/27395037 HTTPS系列干货(一):HTTPS 原理详解
https://www.zhihu.com/tardis/zm/art/72616216 十分钟搞懂HTTP和HTTPS协议?
https://www.rfc-editor.org/rfc/rfc8446 TLS 1.3
https://developer.mozilla.org/zh-CN/docs/Web/Security/Transport_Layer_Security 传输层安全
https://www.cnblogs.com/huansky/p/13977181.html 深入浅出 HTTPS (详解版)
https://zhuanlan.zhihu.com/p/43789231 彻底搞懂HTTPS的加密原理
https://zhuanlan.zhihu.com/p/96494976 你知道,HTTPS用的是对称加密还是非对称加密?
https://www.jianshu.com/p/918d9f517749 https中的对称加密和非对称加密
https://zhuanlan.zhihu.com/p/162082184 对称还是非对称——https中到底使用了啥?
https://cloud.tencent.com/document/product/400/6813 腾讯云实现全站 HTTPS 方案
https://help.aliyun.com/practice_detail/444367 一文带你搞懂阿里云上HTTPS配置