仅仅作为自己复习
应用面试、深入学习:Http和Https之间的区别,及原理分析 - SegmentFault 思否
HTTP简介
HTTP协议(HyperText Transfer Protocol,超文本传输协议,属于应用层)是用于从服务器传输超内容到本地浏览器的传送协议。是一个无状态的协议
顺便说一下TCP/IP协议(简要)
TCP/IP协议(**传输层**):TCP/IP实际上是两个协议(TCP : Transmission Control Protocol 传输控制协议和IP: Internet Protocol 网际协议), IP :只用于计算机之间的通信,它不保证数据内容是否以正确的顺序到达目标计算机,只是接收数据和发送数据 TCP : 用于应用程序之间的通信,它用来保证计算机发送的数据以正确的顺序到达目标计算器
HTTP的请求过程
1、请求地址URL解析 (在本地解析出当前请求的协议名、端口号、主机名,通过本地DNS域名解析服务解析出域名对应的IP地址)
2、封装HTTP请求数据包
3、将HTTP请求数据包封装成TCP包(即TCP三次握手)
注意在浏览器正式发起请求前,首先要建立TCP连接,一般TCP连接的端口号是80
4、客户端(浏览器)发送请求命令
5、服务器响应请求(返回数据)
6、服务器关闭TCP连接
注意HTTP请求是无状态的,即服务器发送完客户端(浏览器)请求的数据后就会关闭TCP连接
// 在浏览器端设置该属性
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,这样浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
HTTPS简介
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),简单来讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。
SSL:(Secure Socket Layer,安全套接字层),通过使用证书认证来确保客户端和网站服务器之间的通信数据是加密安全的。
SSL协议位于TCP/IP协议与各种应用层协议之间。
TLS:TLS(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
SSL和TLS的主要区别?
TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。
说到HTTPS肯定少不了加密解密,我们来了解下相关内容(加解密算法)
有两种基本的加解密算法类型:
1、对称加密(symmetrcic encryption):密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES,RC5,3DES等;例如我们创建一个带密码(口令)的加密压缩包。当你下次要把这个压缩文件解开的时候,你需要输入【同样的】密码。在这个例子中,密码/口令就如同刚才说的“密钥”。
对称加密主要问题是共享秘钥,除你的计算机(客户端)知道另外一台计算机(服务器)的私钥秘钥,否则无法对通信流进行加密解密。解决这个问题的方案是非对称加密。
2、非对称加密:使用两个秘钥:公共秘钥和私有秘钥。私有秘钥由一方密码保存(一般是服务器保存),另一方任何人都可以获得公共秘钥。一般来说指:加密时使用公钥,解密时使用私钥。
这种密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。
HTTPS原理示意图
总结及答疑
① 证书验证阶段
- 浏览器发起 HTTPS 请求
- 服务端返回CA证书(包含公钥)
- 客户端验证证书是否合法,如果不合法则提示告警
② 数据传输阶段
- 当证书验证合法后,在本地生成随机数
- 通过公钥加密随机数,并把加密后的随机数传输到服务端
- 服务端通过私钥对随机数进行解密
- 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输
为什么数据传输是用对称加密?
非对称加密的加解密效率是非常低的,而在https 的应用场景中通常客户端端与服务端之间存在大量的ajax交互,非对称加密的效率是无法接受的;
另外,在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。
为什么需要 CA 认证机构颁发证书?
HTTP 协议被认为不安全是因为传输过程容易被监听、伪造服务器,而 HTTPS 协议主要解决的便是网络传输的安全性问题。
首先我们假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的“中间人攻击”问题。
“中间人攻击”的具体过程如下:
过程原理:
- 本地请求被劫持(如DNS劫持等),所有请求均发送到中间人的服务器
- 中间人服务器返回中间人自己的证书
- 客户端创建随机数,通过中间人证书的公钥对随机数加密后传送给中间人,然后凭随机数构造对称加密对传输内容进行加密传输
- 中间人因为拥有客户端的随机数,可以通过对称加密算法进行内容解密
- 中间人以客户端的请求内容再向正规网站发起请求
- 因为中间人与服务器的通信过程是合法的,正规网站通过建立的安全通道返回加密后的数据
- 中间人凭借与正规网站建立的对称加密算法对内容进行解密
- 中间人通过与客户端建立的对称加密算法对正规内容返回的数据进行加密传输
- 客户端通过与中间人建立的对称加密算法对返回结果数据进行解密
由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。
中间人攻击:总结起来一句话就是客户端不知道CA证书是不是合法的,谁都可以冒充合法的服务器,从而获取到真实的客户端生成的内容及随机数相关的值,然后中间人再利用获取到这些值去和真实的服务器进行https请求(这个过程是合法的,因为中间人这个服务器拿的真实的客户端数据,模仿真实的客户端请求)。
浏览器如何验证证书的合法性?
- 验证证书上的域名、有效期等信息是否正确。
- 判断证书来源是否合法。每份签发证书都可以根据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书可以对对应机构签发证书完成来源验证;
- 判断证书是否被篡改。需要与 CA 服务器进行校验;
- 判断证书是否已吊销。通过CRL(Certificate Revocation List 证书注销列表)和 OCSP(Online Certificate Status Protocol 在线证书状态协议)实现,其中 OCSP 可用于第3步中以减少与 CA 服务器的交互,提高验证效率
只有认证机构可以生成证书吗?
从技术上角度来看谁都可以生成证书,只要有证书就可以完成网站的 HTTPS 传输。但是浏览器会提示风险。
用了 HTTPS 会被抓包吗?
会,但是得是用户授权了同意了访问该网站,只要是用户主动授权访问风险网站,都可能造成数据被中间人抓包
先写到这