互联网|万字长文拿下HTTPS,面试不再慌!



HTTP 协议仅仅制定了互联网传输的标准 , 简化了直接使用 TCP 协议进行通信的难度 。
互联网|万字长文拿下HTTPS,面试不再慌!
本文插图
图片来自 Pexels

less is more 的概念本身很好 , 但是过于简单也会承担一些后果:
①通信使用明文 , 内容可能会窃听
HTTP 本身不具备加密的功能 , 所以也无法做到对通信整体(使用 HTTP 协议通信的请求和响应的内容)进行加密 。 即 , HTTP 报文使用明文(指未经过加密的报文)方式发送 。
②报文是否是正经用户发出的报文无法得知 , 可能被篡改
HTTP 协议无法证明通信的报文完整性 , 因此 , 在请求或响应送出之后直到对方接收之前的这段时间内 , 即使请求或响应的内容遭到篡改 , 也没有办法获悉 。
换句话说 , 没有任何办法确认 , 发出的请求/响应和接收到的请求/响应是前后相同的 。
③不验证发送方身份 , 可能遭遇伪装
HTTP 协议中的请求和响应不会对通信方进行确认 。 在 HTTP 协议通信时 , 由于不存在确认通信方的处理步骤 , 任何人都可以发起请求 。
另外 , 服务器只要接收到请求 , 不管对方是谁都会返回一个响应(但也仅限于发送端的 IP 地址和端口号没有被 Web 服务器设定限制访问的前提下) 。

HTTP 协议无法验证通信方身份 , 任何人都可以伪造虚假服务器欺骗用户 , 实现钓鱼欺诈 , 用户无法察觉 。
因为有以上问题且随着时代发展 , 黑客的技术能力也越来越强 , 非加密的 HTTP 请求很容易引起相关的网络安全问题 , 对于安全性能的攻防控制需求也越来越强烈 。
什么是安全
既然 HTTP 不安全 , 那什么样的通信过程才是安全的呢?
通常认为 , 如果通信过程具备了四个特性 , 就可以认为是安全的:
机密性(Secrecy/Confidentiality):是指对数据的保密 , 只能由可信的人访问 , 对其他人是不可见的秘密 , 简单来说就是不能让不相关的人看到不该看的东西 。
完整性(Integrity , 也叫一致性):是指数据在传输过程中没有被窜改 , 不多也不少 , 完完整整地保持着原状 。
身份认证(Authentication):是指确认对方的真实身份 , 也就是证明你真的是你 , 保证消息只能发送给可信的人 。 如果通信时另一方是假冒的网站 , 那么数据再保密也没有用 , 黑客完全可以使用冒充的身份套出各种信息 , 加密和没加密一样 。
不可否认(Non-repudiation/Undeniable) , 也叫不可抵赖 , 意思是不能否认已经发生过的行为 , 不能说话不算数 , 耍赖皮 。

使用前三个特性 , 可以解决安全通信的大部分问题 , 但如果缺了不可否认 , 那通信的事务真实性就得不到保证 , 有可能出现老赖 。
比如 , 小明借了小红一千元 , 没写借条 , 第二天矢口否认 , 小红也确实拿不出借钱的证据 , 只能认倒霉 。
另一种情况是小明借钱后还了小红 , 但没写收条 , 小红于是不承认小明还钱的事 , 说根本没还 , 要小明再掏出一千元 。
所以 , 只有同时具备了机密性、完整性、身份认证、不可否认这四个特性 , 通信双方的利益才能有保障 , 才能算得上是真正的安全 。
HTTPS 解决什么问题
HTTPS 为 HTTP 增加了刚才所说的四大安全特性 。
HTTPS 其实是一个非常简单的协议 , RFC 文档只有短短的 7 页 , 里面规定了新的协议名 HTTPS , 默认端口号 443 。
至于其他的什么请求 , 应答模式、报文结构、请求方法、URI、头字段、连接管理等等都完全沿用 HTTP , 没有任何新的东西 。
也就是说 , 除了协议名 HTTP 和端口号 80 这两点不同 , HTTPS 协议在语法、语义上和 HTTP 完全一样 , 优缺点也照单全收(当然要除去明文和不安全 ) 。


推荐阅读