HTTP详解之HTTPS(含面试题)

3,523 阅读7分钟

HTTPS相关知识讲解

为什么要有HTTPS?

因为HTTP是不安全的。

  1. 机密性,HTTP在通信过程中使用明文,这使得通信过程可能会被窃听。为了防止被窃听,最常见的处理方式就是加密。加密方式如下:
    • 通信加密:HTTP协议中没有加密机制,可以使用SSL或者TSL来进行加密;
    • 内容的加密:对通信内容进行加密,将报文中所包含的内容进行加密;
  2. 完整性,由于HTTP协议无法验证报文的完整性,因此数据在传输过程中可能已经遭到中间人攻击,导致报文被篡改。
  3. 身份认证,HTTP协议中不会对请求和应答的双方进行身份确认,所以身份有可能遭遇伪装。HTTPS的SSL不仅提供加密服务,还提供证书,用来确定通信方。证书是由值得信任的第三方机构办法,伪造证书异常困难,所以只要能够确认通信方持有的证书,则可以确认对方身份。

什么是HTTPS?

HTTPS的端口号是443,HTTP的端口号是80,除了这点与http不同之外,其他的都完全沿用HTTP。那么HTTPS是如何做到安全的呢?实现方式就在于这个“S”上。HTTPS的下层协议是SSL/TLS。也就是说HTTPS是身披SSL外壳的HTTP,即HTTP+加密+认证+完整性保护=HTTPS。

什么是SSL/TLS

通过上一个问题我们知道,https本身没有什么本身,都是靠着SSL/TLS来支撑,那么到底SSL/TLS是什么来历呢?
SSL即安全套接层,是一个非常好的安全通信协议,其发展到v3版本的时候,互联网工程组将其改名为TLS传输层安全,目前应用最广泛的版本是1.2,除了HTTP,SSL/TLS还承接了其他应用协议,比如FTP=>FTPS等。 https.png

HTTPS是如何解决上面的三个风险的呢?

通过混合加密,保证了信息的机密性

按照密钥的使用方式,常见加密有两种方式:对称加密和非对称加密。
对称加密以共享密钥的方式加密,也就是说必须要将密钥发送给对方,可是在互联网环境中,如何转发密钥呢?如果被窃听密钥落入攻击者之手,加密就失去了意义。
非对称加密使用一对非对称的密钥,一把叫做私钥,一把叫做公钥。顾名思义,私钥不能让任何人知道,公钥任何人都可以获得。使用方式是:发送方将报文用公钥进行加密处理,对方收到后用私钥进行解密,也不用担心密钥被攻击者窃听而盗走。因为非对称加密是基于大数运算,所以速度很,还有一个缺点是相同强度的加密,非对称加密需要更多的位数。
所以HTTPS利用了两者的优势,将两种方式组合起来用于通信。在交换密钥阶段使用非对称加密的方式,之后建立通信交换报文阶段则使用对称加密方式。

摘要算法用来实现完整性

摘要算法是常说的散列函数和哈希函数,可以为数据生成独一无二的指纹,用于校验数据的完整性。客户端在发送数据之前通过摘要算法算出明文的指纹,发送的时候将明文+指纹一同加密,发送给服务器,服务器接收到后进行解密,在用相同的摘要算法得到接收到的明文的指纹,与消息中携带的指纹进行对比,若指纹相同,则说明是完整的。

将服务器公钥放在数字证书中,解决了冒充的风险

上文写到利用加密可以保证报文的机密性,这个过程中还有一个公钥信任的问题,如何保证公钥没有被修改呢?为了解决上述问题,可以使用由数字证书认证机构颁发的公开密钥认证证书,即CA认证。只要证书是可信的,那么公钥就是可信的。

HTTPS链接的建立过程

在HTTP协议中,建立连接后会立即发送请求报文,但是HTTPS还需要另外一个“握手”的过程,即TLS握手。TLS的握手过程如下图所示: ssl.png TLS通过两次往返(四个消息),完成了握手的过程。结合上图我们分析一下握手过程:

  1. 浏览器发送Client Hello消息,信息如下:
    • 客户端支持的SSL/TLS版本号,如TLS1.2版本
    • 支持的密码套件,如ECDHE
    • 客户端产生的随机数C,用于生成后续的会话密钥
  2. 服务器收到Client Hello消息后,会发送Server Hello
    • 确实SSL/TLS协议版本,如果浏览器不支持,则关闭加密通信
    • 确认密码套件列表,选择最合适的加密算法,如ECDHE
    • 服务器产生的随机数S,用于生成后续的会话密钥
    • 服务端为了证明身份,把证书也发送给客户端
  3. 客户端回应,Client Key Exchange。客户端收到服务器的消息后,用浏览器或者系统中的CA公钥验证数字证书的真实性,如果证书没问题,客户端从数字证书中取出服务器的公钥,用其加密报文。
    • 一个随机数,该随机数会被上面提到的服务器的公钥加密,以防被黑客破解。这个随机数加上上文生成的其他两个随机数,使用会话中约定的加密算法,会各自生成加密会话的主密钥
    • 加密通信算法改变通知,随后的信息都将用会话密钥加密通信
    • Finished消息,结束通知。把之前所有发送的数据做一个摘要再加密一下,让服务器做验证
  4. 服务器的最后回应。
    • 加密通信算法改变通知
    • Finished消息,结束通知。把之前所有发送的数据做一个摘要再加密一下,让客户端做验证

常见面试题汇总

Q: 为什么需要证书?

A: 防止“中间人”攻击,确定会话双方的身份

Q: 使用 HTTPS还会被抓包吗?

A: 可以被抓包,只不过抓包后看不到明文,无法篡改

Q: HTTPS的加密过程是怎么样的?

A: 客户端向服务端索要并验证其公钥,用公钥对TLS握手过程中产生的随机数进行加密生成会话密钥,双方采用会话密钥进行加密通信

Q: HTTPS 握手过程中,客户端如何验证证书的合法性

A: 数字证书包括序列号、用途、颁发者、有效时间、公钥,如果只是简单的将这些信息发送给浏览器,中间人可以很轻易的将公钥改成自己的公钥,解决办法就是使用数字签名。将证书的信息生成摘要,将摘要用CA的私钥进行加密,生成数字签名。服务器将数字证书和数字签名一同发送给浏览器,因为有数字签名,所以数字证书无法被中间人修改(修改后的话会导致摘要变了,数字签名实现了不可否认)。浏览器拿到数字证书,根据“证书链”去验证其可信度。

Q: 介绍下 HTTPS 中间人攻击

A: 在传输过程中截获篡改数据。CA证书可以解决中间人攻击的问题