HTTP 与 HTTPS
HTTP (HyperText Transfer Protocol)协议为超文本传输协议,常用在 Web 浏览器和网站服务器之间的通信,http 协议以明文发送内容,并不会提供任何加密功能。如果攻击者截取了http 传输报文,就可以获取到其中的信息,甚至恶意修改内容。因此,http 协议不适用于传输一些敏感信息,如密码、信用卡号等支付信息。
为了解决 http 协议的这个缺陷,在实际应用中常常使用 HTTPS (HyperText Transfer Protocol Secure)协议,即安全套接字层超文本传输协议。https 在 http 的基础上加入了 安全套接字层(SSL,Secure Socket Layer)协议或者传输层安全(TLS,Transport Layer Security)协议。SSL 协议依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密,以保证数据传输的安全。TLS 由 TLS 记录协议和 TLS 握手协议组成,用于两个应用程序之间提供保密性和数据完整性。
需要注意的是,http 是应用层协议,https 是传输层协议(或者说 ssl / tls 是传输层协议)。
客户端输入 url 后的相应过程
http 的工作过程通常包括请求和相应两个环节,属于标准的客户端服务器模型( C/S 模型)。客户端发起 http 协议请求,服务器接收到请求后,返回对应的相应。具体过程包括:
- url 地址解析:域名解析系统(DNS)解析域名得到访问网站所在主机的 IP 地址。
- 完整的 url 通常包括模式协议(https)、域名、访问端口、 虚拟目录、文件名部分、参数部分、锚点部分等。
- 进行 DNS 解析前,会先从浏览器 DNS 缓存查找,一旦找到就完成了解析工程。如果没有找到,接着会从电脑本地的 hosts 文件中查找(最简单的科学上 google 的方法就是通过修改 hosts 文件实现)。一般来说,除非特别指定,否则 hosts 文件是不会存在解析地址的。这时只能向运营商服务器发送解析报文,获取域名对应的 IP 地址。
- 浏览器向首选 DNS 服务器发起域名解析请求,通过 UDP 协议向 DNS 的 53 端口发起递归请求。先请求本地域名服务器(Local DNS Server)解析,若没找到结果再向根域名服务器(Root Server)发起解析请求,其返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址。
- 实际生活中访问页面时常常会出现奇奇怪怪的的广告,那么很大可能是运营商 DNS 被劫持,一般通过手动设置 DNS 可以避免。
- 构建 http 请求报文:封装的内容包括目标地址以及部分本机信息。
- 构建 TCP 包:建立 TCP 连接 (TCP 的三次握手)。
- 发送请求命令:成功建立 TCP 连接后,客户机向服务器发送请求。
- 一般的网站访问会发送 GET 请求。
- 在实际网络链路上传送数据帧时,还涉及到 ARP(地址解析协议),根据 IP 地址,通过 ARP 广播请求获取目的主机的物理地址(MAC 地址)。
- 服务器响应:服务器接收到 http 请求报文,给予相应的响应信息。
- 服务器关闭 TCP 连接:通常由 Web 服务器发起关闭 TCP 连接的请求。
- 从 HTTP 1.1 开始,服务器可以与客户端保持长连接,这取决于服务器的操作。
- 像网页版微信为了保证实时显示消息,就不会关闭 TCP 连接。
- 客户端解析报文:解析 html 代码,对于像 css,js 或者图片这一类静态资源,会发起另外的请求,解析 html之后再客户端屏幕上渲染图形结果。
F5刷新浏览器:当我们使用 F5 刷新页面时,浏览器会直接向目标 url 发送请求,而不是读取浏览器缓存的数据。
浏览器业务中的 UDP
在 DNS 解析域名的过程中,DNS 服务默认使用 UDP 协议获得查询结果,通常仅当结果超过 512 字节或者进行 DNS 服务器同步时才会使用 TCP 协议。这是因为 DNS 的使用非常频繁,又是基础,响应速度是优先需要考虑的。使用 UDP 可以满足速度上的要求,但同时也引入了类似于 “DNS 攻击” 这类问题。
WebRTC(Web Real-Time Communication)出现之前,DNS 几乎是浏览器唯一使用的基于 UDP 的协议。WebRTC 提供的三大功能中,MediaStream 与网络无关,RTCPeerConnection 和 RTCDataChannel 都是基于 UDP。
Google 正在试验一种新的传输层协议:QUIC(Quick UDP Internet Connections),它的本质是基于 UDP 实现 HTTP,相当于之前的 TCP + TLS。从目前的资料来看,QUIC 可以大幅减少建立连接的时间,这是通过简化握手步骤从而减少 RTT(Round-Trip Time)来实现的。
GET 与 POST
GET 是指完整请求一个资源,POST 是指提交表单。
HTTP 常见状态码
- 1XX: 指示信息,表示请求已接受,继续处理;
- 2XX: 成功,表示请求已接受,已处理。常见的是 200;
- 3XX:重定向,要完成请求必须进行更进一步地操作。例如常见的有 301 永久重定向和 302 临时重定向。302 重定向的网站会保留原有的网址,而影响搜索引擎的抓取;
- 4XX:客户端错误,请求有语法错误或请求无法实现。常见的有 400 错误,前后端协议字段不一致;403错误,表示资源不可用,访问被禁止;404 错误,资源不存在;
- 5XX:服务端错误,无法响应客户端请求。
HTTPS
SSL
SSL(Secure Socket Layer),安全套接字层,位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL 通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议主要包括 SSL 记录协议和 SSL 握手协议两个层次。
SSL 协议提供的服务主要有:
- 认证用户和服务器,确保数据发送到正确的客户机和服务器。
- 加密数据以防止数据中途被窃取。
- 维护数据的完整性,确保数据在传输过程中不被改变。
SSL 协议的工作流程需要实现两个认证阶段。
服务器认证阶段:(四次握手)
- 客户端向服务器端发送一个开始信息以创建一个新的会话连接。
- 服务器根据用户的信息确定是否需要生成新的主**,如需要则服务器在相应客户时将包含生成主**所需的信息。
- 客户根据收到的服务器响应信息,生成一个主**,并用服务器的公开**加密后传给服务器。
- 服务器使用私钥恢复主**,并返回给客户一个用主**认证的信息,以此让客户认证服务器。
用户认证阶段:
- 在服务器通过了客户认证之后,服务器会发送一个提问给客户,客户则返回数字签名后的提问和其公开**,从而向服务器提供认证。
从上述过程可以看出,SSL 协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。在后期的发展中,单一认证的问题越来越突出,难以协调各方间的安全传输和信任关系,难以支持网上信用卡支付和电子交易等业务。
TLS
TLS 以 SSL 3.0 为基础于 1999 年作为 SSL 的新版本退出。
TLS(Transport Layer Security),传输层安全协议,
- 更安全的 MAC 算法。
- 更严密的警报。
- “灰色区域”规范有更明确的定义。
- TLS 对于安全性的改进。
该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。
TLS 记录协议提供的连接安全性具有两个基本特性:
- 私有:数据加密过程使用对称加密(DES、RC4 等)。对称加密所产生的**对每个连接都是唯一的,且此**基于另一个协议(如握手协议)协商。记录协议也可以不加密使用。
- 可靠:信息传输包括使用**的 MAC 进行信息完整性检查。安全哈希功能(SHA、MD5 等)用于 MAC 计算。记录协议在没有 MAC 的情况下也能操作,但一般只能用于这种模式,即有另一个协议正在使用记录协议传输协商安全参数。
TLS 记录协议用于封装各种高层协议。作为这种封装协议之一的握手协议允许服务器与客户机在应用程序协议传输和接收其第一个数据字节前彼此之间相互认证,协商加密算法和加***。 TLS 握手协议提供的连接安全具有三个基本属性:
- 可以使用非对称的,或公共**的加密方法来认证对等方的身份。该认证是可选的,但至少需要一个结点方。
- 共享加***的协商是安全的。对偷窃者来说协商加密是难以获得的。此外经过认证过的连接不能获得加密,即使是进入连接中间的攻击者也不能。
- 协商是可靠的。没有经过通信方成员的检测,任何攻击者都不能修改通信协商。
TLS 的最大优势就在于:TLS 是独立于应用协议。高层协议可以透明地分布在 TLS 协议上面。然而, TLS 标准并没有规定应用程序如何在 TLS 上增加安全性;它把如何启动 TLS 握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。
SSL 2.0 和 SSL 3.0 已经被 IEFT 组织废弃。多年来,在被废弃的 SSL 协议中一直存在漏洞并被发现。大多数现代浏览器遇到使用废弃协议的 Web 服务时,会降低用户体验,以 https 表示警告来表现。因此,目前通常在服务端禁止使用 SSL 协议,仅仅保留 TLS 协议开启。
HTTPS = HTTP + SSL
HTTP 协议没有办法确认通信方,有可能在传输过程中遭到篡改而不知。此时 HTTPS 出现了,它在 HTTP 上再加入加密处理和认证机制,HTTPS 是披着 SSL 外壳的 HTTP。https 协议的作用主要包括两个方面:建立一个信息安全通道;确认网站的真实性。
HTTPS 采用共享秘钥加密和公开秘钥加密混用的加密机制。
-
共享秘钥加密:使用一对非对称的秘钥。一把叫做私有秘钥,一把叫做公有秘钥。发送方使用公有秘钥加密信息,接收方使用私有秘钥进行解密。
-
公开秘钥加密:发送方和接收方使用同一把秘钥进行加密。但是被第三者获得秘钥后可以肆意妄为。
为了证实公开**的“正统性”,我们通过数字证书认证机构(CA)颁布的公开秘钥证书,可以确定申请者的身份并对已申请的公开**进行签名,然后分配这个公开秘钥,并将这个公开秘钥放入公钥证书后绑定一起。服务器会将这份数字证书发送给客户端,以便进行公开秘钥加密通信。
https 与 http 的主要区别如下:
- https 协议需要到 CA 申请证书,一般免费证书较少,因而需要一定费用。
- http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
- http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是 443。
- http 的连接很简单,是无状态的;https 协议是由 ssl+http 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。
由于在通信过程中需要加密和解密,所以与 HTTP 相比,HTTPS 的速度会慢 2-100 倍,虽然可以用 SSL 专用加速服务器来改善一下,但是仍然没有根本性的解决方法。
HTTPS 工作过程
HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议。客户端对服务器发来的证书进行验证,验证通过后使用非对称加密对数据通信时的**进行协商。协商后获得一致的对称加***。然后使用对称加密算法进行TCP连接,后续的过程跟http的过程一致。
具体工作过程如下:
- 客户端发起 https 请求(443 端口)。
- 服务器配置:采用 https 协议的服务器必须要有一套数字证书。
- 传送证书(公钥、颁发机构、过期时间等)。
- 客户端解析证书:由客户端的 TLS 完成,验证公钥的有效性。生成一个随机值,用证书进行加密。
- 传送加密信息
- 服务端解密信息:服务端用自己的私钥解密后,得到客户端传送过来的随机值,之后的传输内容可以用该随机值与信息通过某种算法混合在一起,进行对称加密。
- 传输加密后的信息
- 客户端解密信息:双方都知道随机值,信息可以在客户端被还原。