HTTPS工作原理
在传统的HTTP协议中,在网络上传播的信息有可能被窃听,篡改。而HTTPS的引入,就是为了解决这些安全问题,下面我们就来探究一下HTTPS的工作原理。
什么是HTTPS
HTTPS是一种以安全为目标的HTTP协议,简单来说就是HTTP的安全版。即在HTTP层下面加入SSL层,SSL层负责加解密,HTTPS的安全基础是SSL。
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。
HTTP与HTTPS的区别
- HTTP是明文传输,HTTPS通过SSL/TLS进行了加密。
- HTTP的端口号是80,HTTPS的端口号是443。
- HTTPS需要到CA申请证书,一般免费证书很少,需要交费,当浏览器访问HTTPS通信的Web网站时,浏览器的地址栏内会出现一个带锁的标记,对HTTPS的显示方式会因浏览器的不同而有所改变。
- HTTPS的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
HTTP通信有什么问题?为什么需要HTTPS?
通信双方使用明文,内容可能被窃听
由于HTTP本身不具备加密的功能,所以也无法做到对通信整体进行加密。
数据从发送端传递给接收端这个过程中,中间需要经过多个网络设备,所有经过这些设备上的数据都有可能被截获或窥视。例如抓包工具Wireshark、Fiddler,这些工具可以获取轻而易举的获取HTTP协议报文的请求和响应的内容,并对其进行解析。即使请求体和响应体中敏感的内容进行加密处理,但是加密处理后的报文信息本身还是会被看到的。
不验证通信方的身份,因此有可能遭遇伪装
HTTP协议中的请求和响应不会对通信方进行确认。在HTTP协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到格式合法的请求,不管对方是谁都会返回一个响应(但也仅限于发送端的 IP地址和端口号没有被Web服务器设定限制访问的前提下)。
HTTP协议的实现本身非常简单,不论是谁发送过来的请求都会返回响应,因此不确认通信方,会存在各种隐患。比如目标的Web服务器有可能是已伪装的Web服务器。
无法证明报文的完整性,所以可能遭篡改
所谓完整性是指信息的准确度。若无法证明其完整性,通常也就意味着无法判断信息是否准确。由于HTTP协议无法证明通信的报文完整性,因此,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。换句话说,没有任何办法确认,发出的请求/响应和接收到的请求/响应是前后相同的。
HTTPS如何解决上述三个问题?
HTTPS协议保证安全基本依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 、对称加密和非对称加密,其利用非对称加密实现身份认证和**协商,对称加密算法采用协商的**对数据加密,基于散列函数验证信息的完整性。
解决内容可能被窃听的问题——加密
对称加密
这种方式加密和解密同用一个**。加密和解密都会用到**。没有**就无法对密码解密,反过来说,任何人只要持有**就能解密了。
以对称加密方式加密时必须将**也发给对方。可究竟怎样才能安全地转交?在互联网上转发**时,如果通信被监听那么**就可会落人攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的**。
非对称加密(SSH协议采用这个方式)
非对称加密使用一对**:一把叫做私钥,另一把叫做公钥。顾名思义,私钥不能让其他任何人知道,而公钥则可以随意发布,任何人都可以获得。
使用非对称加密方式,发送密文的一方使用对方的公钥进行加密处理,对方收到被加密的信息后,再使用自己的私钥进行解密。利用这种方式,不需要发送用来解密的私钥,也不必担心**被攻击者窃听而盗走。
非对称加密的特点是信息传输一对多,服务器只需要维持一个私钥就能够和多个客户端进行加密通信。
这种方式有以下缺点:
- 公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容。
- 公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改。
- 使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率。
对称加密+非对称加密(HTTPS采用这种方式)
使用对称**的好处是解密的效率比较快,使用非对称**的好处是可以使得传输的内容不能被**,因为就算你拦截到了数据,但是没有对应的私钥,也是不能**内容的。就比如说你抢到了一个保险柜,但是没有保险柜的钥匙也不能打开保险柜。那我们就将对称加密与非对称加密结合起来,充分利用两者各自的优势,在交换**环节使用非对称加密方式,之后的建立通信交换报文阶段则使用对称加密方式。
具体做法是:发送密文的一方使用对方的公钥进行加密处理“对称的**”,然后对方用自己的私钥解密拿到“对称的**”,这样可以确保交换的**是安全的前提下,使用对称加密方式进行通信。所以,HTTPS采用对称加密和非对称加密两者并用的混合加密机制。
解决报文可能遭篡改问题——数字签名
网络传输过程中需要经过很多中间节点,虽然数据无法被解密,但可能被篡改,那如何校验数据的完整性呢?校验数字签名。
数字签名有两种功效:
- 能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。
- 数字签名能确定消息的完整性,证明数据是否未被篡改过。
发送者生成数字签名:将一段文本先用Hash函数生成消息摘要,然后用发送者的私钥加密生成数字签名,与原文一起传送给接收者。
接收者校验数字签名:接收者用发送者的公钥解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与上一步得到的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过。
当然,这个过程的前提是客户端要知道服务器端的公钥。问题的关键的是,和消息本身一样,服务器端的公钥不能在不安全的网络中直接发送给客户端,或者说客户端拿到的公钥如何证明是服务器端的。
此时就需要引入了证书颁发机构(Certificate Authority,简称CA),CA数量并不多,客户端内置了所有受信任CA的证书。CA对服务器端的公钥(和其他信息)数字签名后生成证书。
解决通信方身份可能被伪装的问题—数字证书
数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上。
我们来介绍一下数字证书认证机构的业务流程:
- 服务器端的运营人员向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
- CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
- 如信息审核通过,CA会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构CA的信息、有效时间、证书***等信息的明文,同时包含一个签名。其中签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用CA的私钥对信息摘要进行加密,密文即签名;
- 客户端向服务器端发出请求时,服务器返回证书文件;
- 客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即服务器的公开**是值得信赖的。
- 客户端还会验证证书相关的域名信息、有效时间等信息;客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应CA的证书,证书也会被判定非法。
HTTPS工作流程
- 浏览器发起一个HTTPS(例如
https://www.baidu.com/)的请求。 - 服务器端把事先配置好的公钥证书返回给客户端。
- 浏览器验证公钥证书:比如是否在有效期内,证书的用途是不是匹配客户端请求的站点,如果验证通过则继续,不通过则显示警告信息。
- 浏览器使用伪随机数生成器生成加密所使用的对称**,然后用证书的公钥加密这个对称**,发给服务器。
- 服务器使用自己的私钥解密这个消息,得到对称**。至此,Client和Server双方都持有了相同的对称**。
- 服务器使用对称**对浏览器第一次请求URL对应的响应进行加密,发送给浏览器。
- 此后浏览器和服务器都使用这个对称**进行通信。