【Linux】 一文搞懂应用层协议HTTPS:从加密原理到完整工作流程 相关专栏【Linux专栏】【C语言专栏】【测试专栏】【MySQL专栏】【C 专栏】 相关文章推荐【Linux】玩转Socket快速掌握UDP数据传输【测试】一文吃透软件测试全分类入门必懂核心体系【Linux】一文搞懂HTTP协议概念、报文格式与极简服务器实现【测试】软件测试入门必看需求、开发模型、测试模型全解析很高兴你点开这篇文章✨这里会持续更新我喜欢的内容关注我一起慢慢变好呀 点赞 ⭐ 收藏 评论文章目录前言一、HTTPS1. HTTPS的概念2. 什么是加密、解密、密钥3. 为什么要加密4. 常见的加密方式对称加密非对称加密5. 数据摘要 数据指纹6. 数字签名二、HTTPS 的工作过程探究方案 1 - 只使用对称加密不具可行性方案 2 - 只使用非对称加密方案 3 - 双方都使用非对称加密方案 4 - 非对称加密 对称加密中间人攻击 - 针对上面的场景引入证书理解数据签名方案 5 - 非对称加密 对称加密 证书认证1. 客户端认证环节2. 查看浏览器的受信任证书发布机构三、HTTPS的工作流程1. 建立连接2. 密钥协商3. 加密通信4. 断开连接流程示意图总结1. 第一组非对称加密2. 第二组(非对称加密)3. 第三组(对称加密)前言HTTPS是HTTP的安全升级版也是现在Web开发、接口调用的标配协议。但很多同学在学习时常常被对称加密、非对称加密、数字证书、中间人攻击这些概念绕晕搞不清HTTPS到底是怎么实现安全通信的。 本篇学习笔记从HTTPS的基础概念讲起带你拆解对称加密、非对称加密、数据摘要、数字签名等核心加密原理一步步对比五种通信方案的优劣解析中间人攻击的风险与证书认证的作用最后梳理HTTPS完整的工作流程帮你一次性理清HTTPS的安全逻辑彻底搞懂它的工作机制。 ✨ 一、HTTPS我们先回顾一下什么是HTTP那什么HTTPS是啥呢1. HTTPS的概念HTTPS 也是⼀个应用层协议 是在 HTTP 协议的基础上引⼊了⼀个加密层。HTTP 协议内容都是按照文本的方式明文传输的,没有进行任何的加密这就导致在传输过程中出现⼀些被篡改的情况示例2. 什么是加密、解密、密钥加密把明文(要传输的信息)进行⼀系列变换, ⽣成密文解密把密文再进行⼀系列变换, 还原成明文密钥在这个加密和解密的过程中, 往往需要⼀个或者多个中间的数据, 辅助进行这个过程, 这样的数据称为密钥3. 为什么要加密示例运营商劫持你的本意是下载一个天天动听未被劫持的效果, 点击下载按钮, 就会弹出天天动听的下载链接已被劫持的效果, 点击下载按钮, 就会弹出 QQ 浏览器的下载链接原因由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器, 交换机等), 那么运营商的网络设备就可以解析出你传输的数据内容, 并进行篡改点击 “下载按钮”, 其实就是在给服务器发送了⼀个 HTTP 请求, 获取到的 HTTP 响应其实就包含了该APP 的下载链接. 运营商劫持之后, 就发现这个请求是要下载天天动听, 那么就⾃动的把交给用户的响应给篡改成 “QQ浏览器” 的下载地址了4. 常见的加密方式对称加密采用单钥密码系统的加密方法同⼀个密钥可以同时用作信息的加密和解密这种加密方法称为对称加密也称为单密钥加密特征加密和解密所用的密钥是相同的常见对称加密算法(了解)DES、3DES、AES、TDEA、Blowfish、RC2等特点算法公开、计算量⼩、加密速度快、加密效率⾼说人话就是对称加密其实就是通过同⼀个 “密钥” , 把明文加密成密文, 并且也能把密文解密成明文非对称加密需要两个密钥来进行加密和解密公开密钥public key简称公钥私有密钥private key简称私钥常见非对称加密算法(了解)RSADSAECDSA特点算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂⽽使得加密解密速度没有对称加密解密的速度快。非对称加密要用到两个密钥, ⼀个叫做公钥, ⼀个叫做私钥;公钥和私钥是配对的. 最⼤的缺点就是运算速度非常慢⽐对称加密要慢很多通过公钥对明文加密, 变成密文通过私钥对密文解密, 变成明文也可以反着用通过私钥对明文加密, 变成密文通过公钥对密文解密, 变成明文5. 数据摘要 数据指纹数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash函数)对信息进行运算,⽣成⼀串固定⻓度的数字摘要。数字指纹并不是⼀种加密机制,但可以用来判断数据有没有被篡改。摘要常见算法有MD5、SHA1、SHA256、SHA512等算法把无限的映射成有限因此可能会有碰撞两个不同的信息算出的摘要相同但是概率非常低摘要特征和加密算法的区别是摘要严格意义不是加密因为没有解密只不过从摘要很难反推原信息通常用来进行数据对⽐具体例子6. 数字签名摘要经过加密就得到数字签名具体例子 ✨ 二、HTTPS 的工作过程探究既然要保证数据安全, 就需要进行 “加密”.网络传输中不再直接传输明文了, ⽽是加密之后的 “密文”.加密的方式有很多, 但是整体可以分成两⼤类: 对称加密 和 非对称加密方案 1 - 只使用对称加密不具可行性如果通信双方都各⾃持有同⼀个密钥X且没有别⼈知道这两方的通信安全当然是可以被保证的除非密钥被破解引⼊对称加密之后, 即使数据被截获, 由于⿊客不知道密钥是啥, 因此就无法进行解密, 也就不知道请求的真实内容是啥了那为何不具可行性呢服务器同⼀时刻其实是给很多客户端提供服务的这么多客户端, 每个⼈用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了, ⿊客就也能拿到了). 因此服务器就需要维护每个客户端和每个密钥之间的关联关系, 这也是个很⿇烦的事情比较理想的做法, 就是能在客户端和服务器建立连接的时候, 双方协商确定这次的密钥是啥但是如果直接把密钥明文传输, 那么⿊客也就能获得密钥了~~ 此时后续的加密操作就形同虚设了因此密钥的传输也必须加密传输!重但是要想对密钥进行对称加密, 就仍然需要先协商确定⼀个 “密钥的密钥”. 这就成了 “先有鸡还是先有蛋” 的问题了. 此时密钥的传输再用对称加密就行不通了方案 2 - 只使用非对称加密重点内容鉴于非对称加密的机制如果服务器先把公钥以明文方式传输给浏览器之后浏览器向服务器传数据前都先用这个公钥加密好再传从客户端到服务器信道似乎是安全的(有安全问题)因为只有服务器有相应的私钥能解开公钥加密的数据。但是服务器到浏览器的这条路怎么保障安全如果服务器用它的私钥加密数据传给浏览器那么浏览器用公钥可以解密它⽽这个公钥是⼀开始通过明文传输给浏览器的若这个公钥被中间⼈劫持到了那他也能用该公钥解密服务器传来的信息了。方案 3 - 双方都使用非对称加密服务端拥有公钥S与对应的私钥S’客户端拥有公钥C与对应的私钥C’客户和服务端交换公钥客户端给服务端发信息先用S对数据加密再发送只能由服务器解密因为只有服务器有私钥S’服务端给客户端发信息先用C对数据加密在发送只能由客户端解密因为只有客户端有私钥C’这样貌似也行啊但是效率太低依旧有安全问题方案 4 - 非对称加密 对称加密先解决效率问题服务端具有非对称公钥S和私钥S’客户端发起https请求获取服务端公钥S客户端在本地⽣成对称密钥C, 通过公钥S加密, 发送给服务器.由于中间的网络设备没有私钥, 即使截获了数据, 也无法还原出内部的原文, 也就无法获取到对称密钥(真的吗)服务器通过私钥S’解密, 还原出客户端发送的对称密钥C. 并且使用这个对称密钥加密给客户端返回的响应数据.后续客户端和服务器的通信都只用对称加密即可. 由于该密钥只有客户端和服务器两个主机知道, 其他主机/设备不知道密钥即使截获数据也没有意义由于对称加密的效率⽐非对称加密⾼很多, 因此只是在开始阶段协商密钥的时候使用非对称加密, 后续的传输仍然使用对称加密.中间人攻击 - 针对上面的场景Man-in-the-MiddleAttack简称“MITM攻击”在方案2/3/4中客户端获取到公钥S之后对客户端形成的对称秘钥X用服务端给客户端的公钥S进行加密中间⼈即使窃取到了数据此时中间⼈确实无法解出客户端形成的密钥X因为只有服务器有私钥S’但是中间⼈的攻击如果在最开始握⼿协商的时候就进行了那就不⼀定了假设hacker已经成功成为中间⼈服务器具有非对称加密算法的公钥S私钥S’中间⼈具有非对称加密算法的公钥M私钥M’客户端向服务器发起请求服务器明文传送公钥S给客户端中间⼈劫持数据报文提取公钥S并保存好然后将被劫持报文中的公钥S替换成为⾃⼰的公钥M并将伪造报文发给客户端客户端收到报文提取公钥M(⾃⼰当然不知道公钥被更换过了)⾃⼰形成对称秘钥X用公钥M加密X形成报文发送给服务器中间⼈劫持后直接用⾃⼰的私钥M’进行解密得到通信秘钥X再用曾经保存的服务端公钥S加密后将报文推送给服务器服务器拿到报文用⾃⼰的私钥S’解密得到通信秘钥X双方开始采用X进行对称加密进行通信。但是⼀切都在中间⼈的掌握中劫持数据进行窃听甚⾄修改都是可以的上面的攻击方案同样适用于方案2方案3引入证书服务端在使用HTTPS前需要向CA机构申领⼀份数字证书数字证书⾥含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器浏览器从证书⾥获取公钥就行了证书就如⾝份证证明服务端公钥的权威性基本说明https://baike.baidu.com/item/CA%E8%AE%A4%E8%AF%81/6471579?fraladdin这个 证书 可以理解成是⼀个结构化的字符串, ⾥面包含了以下信息:证书发布机构证书有效期公钥证书所有者签名…需要注意的是申请证书的时候需要在特定平台⽣成查会同时⽣成⼀对⼉密钥对⼉即公钥和私钥。这对密钥对⼉就是用来在网络通信中进行明文加密以及数字签名的。其中公钥会随着CSR文件⼀起发给CA进行权威认证私钥服务端⾃⼰保留用来后续进行通信其实主要就是用来交换对称秘钥可以使用在线⽣成CSR和私钥https://myssl.com/csr_create.html形成CSR之后后续就是向CA进行申请认证不过⼀般认证过程很繁琐网络各种提供证书申请的服务商⼀般真的需要直接找平台解决就行理解数据签名签名的形成是基于非对称加密算法的注意⽬前暂时和https没有关系不要和https中的公钥私钥搞混了当服务端申请CA证书的时候CA机构会对该服务端进行审核并专门为该网站形成数字签名过程如下CA机构拥有非对称加密的私钥A和公钥A’CA机构对服务端申请的证书明文数据进行hash形成数据摘要然后对数据摘要用CA私钥A’加密得到数字签名S服务端申请的证书明文和数字签名S 共同组成了数字证书这样⼀份数字证书就可以颁发给服务端了方案 5 - 非对称加密 对称加密 证书认证在客户端和服务器刚⼀建立连接的时候, 服务器给客户端返回⼀个 证书证书包含了之前服务端的公钥, 也包含了网站的⾝份信息1. 客户端认证环节当客户端获取到这个证书之后, 会对证书进行校验(防⽌证书是伪造的).1判定证书的有效期是否过期2判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构).3验证证书是否被篡改: 从系统中拿到该证书发布机构的公钥, 对签名解密, 得到⼀个 hash 值(称为数据摘要), 设为 hash1. 然后计算整个证书的 hash 值, 设为 hash2.(4)对⽐ hash1 和 hash2 是否相等. 如果相等, 则说明证书是没有被篡改过的.2. 查看浏览器的受信任证书发布机构第一步Microsoft Edge 浏览器, 点击右上⻆的三个点第二步选择 “设置”, 搜索 “证书” , 即可看到以下界面. (如果没有在隐私设置和安全性-安全⾥面找找) ✨ 三、HTTPS的工作流程1. 建立连接客户端浏览器向服务器请求HTTPS连接​服务器返回数字证书含公钥、域名、有效期​浏览器验证证书是否合法可信2. 密钥协商浏览器生成随机会话密钥​用服务器公钥加密会话密钥发给服务器​服务器用自己私钥解密拿到会话密钥3. 加密通信双方用对称会话密钥加密传输数据​请求、响应全程密文防窃听、篡改4. 断开连接通信结束关闭加密会话流程示意图左侧都是客户端做的事情, 右侧都是服务器做的事情 ✨ 总结HTTPS 工作过程中涉及到的密钥有三组1. 第一组非对称加密用于校验证书是否被篡改服务器持有私钥(私钥在形成CSR文件与申请证书时获得), 客户端持有公钥(操作系统包含了可信任的 CA 认证机构有哪些, 同时持有对应的公钥). 服务器在客户端请求时返回携带签名的证书. 客户端通过这个公钥进行证书验证, 保证证书的合法性进⼀步保证证书中携带的服务端公钥权威性。2. 第二组(非对称加密)用于协商⽣成对称加密的密钥客户端用收到的CA证书中的公钥(是可被信任的)给随机⽣成的对称加密的密钥加密, 传输给服务器, 服务器通过私钥解密获取到对称加密密钥.3. 第三组(对称加密)客户端和服务器后续传输的数据都通过这个对称密钥加密解密其实⼀切的关键都是围绕这个对称加密的密钥. 其他的机制都是辅助这个密钥工作的第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器.第⼀组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥.谢谢你看到这里呀如果喜欢这篇内容点个关注下次更新不迷路✨ 点赞 ⭐ 收藏 评论