探秘HTTPS

334次阅读  |  发布于2年以前

今天给大家分享下HTTPS的相关知识。作为前端工程师,对于天天打交道的HTTP我们肯定都熟得不能再熟了,每一次通过浏览器发出的请求都是需要符合HTTP协议的。那么HTTPS和HTTP的区别大家了解吗?

这是一个经典的面试题,大部分人会这么回答

1 . HTTPS比HTTP多了一个S(Secure),也就是说HTTPS是安全版的HTTP

2 . 端口号不同。HTTP使用80端口,HTTPS使用443端口

3 . HTTPS用的是非对称加密算法

上面的回答能给几分?等看完本文我们可以再回头来看下这个回答

那么,HTTPS是如何实现安全的数据传输呢?想彻底搞明白这个问题,就需要了解HTTP的发展历程、HTTP遇到的问题、对称与非对称加密算法、数字签名、第三方证书颁发机构等概念。

所以,想要全面了解HTTPS,还是要从HTTP的发展历程说起......

I.HTTP

HTTP是Hypertext Transfer Protocal 的缩写,中文全称是超文本传输协议。

HTTP是TCP/IP协议簇的最高层--应用层协议。

浏览器和服务器在使用HTTP协议相互传递超文本数据时,将数据放入报文体内,同时填充首部(请求头或响应头)构成完整HTTP报文并交到下层传输层,之后每一层加上相应的首部(控制部分)便一层层的下发,最终由物理层将二进制数据以电信号的形式发送出去。HTTP报文结构如下

版本 产生时间 内容概括 发展现状
HTTP/0.9 1991年 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 非正式标准
HTTP/1.0 1996年 传输内容、格式、首部和数组大小不限制,增加POST、PUT、PATCH、HEAD、 OPTIONS、DELETE方式 正式标准,广泛使用
HTTP/1.1 1997年 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 最为广泛
HTTP/2 2015年 最为广泛 逐渐兴起

由HTTP的发展历程来看,最开始版本的HTTP(HTTP1.0)在每次建立TCP连接后只能发起一次HTTP请求,请求完毕就释放TCP连接。我们都知道TCP连接的建立需要经过三次握手的过程,而每次发送HTTP请求都需要重新建立TCP连接,毫无疑问是很低效的。所以HTTP1.1改善了这一点,使用长连接的机制,也就是“一次TCP连接,N次HTTP请求”。

HTTP协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

(HTTP1.0若要开启长连接,需要加上Connection: keep-alive请求头)

因此,为了保证数据传输的安全性,必须要对HTTP数据进行加密。

II.加密方式

加密方式分为三种:对称加密、非对称加密、数字摘要。前两种适合数据传输加密,而数字摘要不可逆的特性常被用于数字签名。

对称加密

对称加密也称为密钥加密或单向加密,就是使用同一套密钥来进行加密和解密。密钥可以理解为加密算法。对称加密图示如下

广泛使用的对称加密有:

DES(Data Encryption Standard) 数据加密标准,速度较快,适用于加密大量数据的场合。目前DES已经不是一种安全的加密方法,主要因为它使用的56位密钥过短
3DES(Triple DES) 基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。可以解决因计算机运算能力的增强,DES容易被暴力破解的问题
AES(Advanced Encryption Standard) 高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密

可以在线体验对称加密[1]

P.S. base64编码也属于对称加密哦

非对称加密

非对称加密使用一对密钥(公钥和私钥)进行加密和解密。非对称加密可以在不直接传递密钥的情况下,完成解密,具体步骤如下:

1 . 乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

2 . 甲方获取乙方的公钥,然后用它对信息加密。

3 . 乙方得到加密后的信息,用私钥解密。

以最典型的非对称加密算法--RSA算法举个例子:

想要彻底搞懂RSA,需要了解数论的知识,全部推导过程 RSA加密算法[2]。本文简单介绍思路:使用两个超大质数以及其乘积作为生成公钥和私钥的材料,想要从公钥推算出私钥是非常困难的(需要对超大数因式分解为两个很大质数的乘积)。目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。

如何选择?

想要治本,就要找到一个第三方公证人来证明公钥没有被替换,因此就引出了 CA 的概念

III.CA

CA就是 Certificate Authority,颁发数字证书的机构。作为受信任的第三方,CA承担公钥体系中公钥的合法性检验的责任。证书就是源服务器向可信任的第三方机构申请的数据文件。这个证书除了表明这个域名是属于谁的,颁发日期等,还包括了第三方证书的私钥。服务器将公钥放在数字证书中,只要证书是可信的,公钥就是可信的。下图是飞书域名的证书中部分内容的信息

数字签名

IV.HTTPS

《图解HTTP》书中提到HTTPS就是身披SSL外壳的HTTP。

SSL 在1999年被更名为 TLS

所以说,HTTPS 并不是一项新的应用层协议,只是 HTTP 通信接口部分由 SSL 和 TLS 替代而已。HTTP 会先直接和 TCP 进行通信。而HTTPS 会演变为先和 SSL 进行通信,然后再由 SSL 和 TCP 进行通信。SSL 是一个独立的协议,不只有 HTTP 可以使用,其他应用层协议也可以使用,比如FTP、SMTP都可以使用SSL来加密。

HTTPS请求全流程如下图

1 . 用户在浏览器发起HTTPS请求,默认使用服务端的443端口进行连接;

2 . HTTPS需要使用一套CA 数字证书,证书内会附带一个服务器的公钥Pub,而与之对应的私钥Private保留在服务端不公开;

3 . 服务端收到请求,返回配置好的包含公钥Pub的证书给客户端;

4 . 客户端收到证书,校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示HTTPS警告信息,如果通过则继续;

5 . 客户端生成一个用于对称加密的随机Key,并用证书内的公钥Pub进行加密,发送给服务端;

6 . 服务端收到随机Key的密文,使用与公钥Pub配对的私钥Private进行解密,得到客户端真正想发送的随机Key

7 . 服务端使用客户端发送过来的随机Key对要传输的HTTP数据进行对称加密,将密文返回客户端;

8 . 客户端使用随机Key对称解密密文,得到HTTP数据明文;

9 . 后续HTTPS请求使用之前交换好的随机Key进行对称加解密。

HTTPS确实解决了HTTP的三个安全性问题:

(1) 保密性:结合非对称加密和对称加密实现保密性。用非对称加密方式加密对称加密的秘钥,再用对称加密方式加密数据

(2) 完整性:通过第三方CA的数字签名解决完整性问题

(3) 身份校验:通过第三方CA的数字证书验证服务器的身份

最后我们总结一下HTTPS的优缺点

HTTPS优点 HTTPS缺点
使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器 HTTPS时间是HTTP的2-100倍,因为需要经历SSL(TLS)握手,且非对称加密速度较慢
安全可靠,防止数据在传输过程中被窃取、改变,确保数据的完整性 HTTPS 协议的安全是有范围的,在黑客攻击、拒绝服务攻击和服务器劫持等方面几乎起不到什么作用
HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大 SSL 证书的信用链体系并不安全。特别是在某些国家可以控制 CA根证书的情况下,中间人攻击一样可行

可以看到,HTTPS的确是当今安全传输HTTP的最优解,但他并不是完美的,仍会有漏洞

参考

《图解HTTP》

RSA算法原理[3]

HTTPS升级指南[4]

SSL/TLS协议运行机制的概述[5]

参考资料

[1]对称加密: http://www.jsons.cn/textencrypt/

[2]RSA加密算法: https://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

[3]RSA算法原理: https://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

[4]HTTPS升级指南: http://www.ruanyifeng.com/blog/2016/08/migrate-from-http-to-https.html

[5]SSL/TLS协议运行机制的概述: https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8