| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> HTTPS学习之教你弄透到底什么是HTTPS -> 正文阅读 |
|
[网络协议]HTTPS学习之教你弄透到底什么是HTTPS |
本文谈谈我的看法,主要分为以下几个方面:
一、什么是 HTTPSHTTPS,也称作 HTTP over TLS,TLS 前身是 SSL,会有各个版本。TLS 协议在 TCP/IP 协议栈中的关系如下: 上图描述了在 TCP/IP 协议栈中 TLS(各子协议)和 HTTP 的关系,HTTP+TLS 也就是 HTTPS。和 HTTP 相比,HTTPS 的优势:
c/c++linux服务器开发高级架构师学习路线大纲:学习路线导图,学习视频点击:C/C++Linux服务器开发高级架构师/Linux后台架构师二、HTTPS如何工作的1、工作流程如下图所示,就是HTTPS协议的工作流程。? 2、TCP三次握手首先是TCP协议的三次握手,如下图所示:
? 我们通过wireshark抓包查看三次握手过程:
通过wireshark抓包,首先我们测试用www.huawei.com,先ping 网址得到IP。
图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTPS的Client Hello, 这说明HTTP的确是使用TCP建立连接的。 第一次握手数据包 客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图。 数据包的关键属性如下:
第二次握手的数据包 服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图: 数据包的关键属性如下:
C/C++Linux服务器开发高级架构师学习视频 点击 linux服务器学习资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。第三次握手的数据包 客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图: 数据包的关键属性如下:
就这样通过了TCP三次握手,建立了连接。 3、HTTPS握手3.1、客户端发起Client Hello握手Client Hello握手 我们以抓博客园www.cnblogs.com为例,可以看到一个Client Hello握手,我们可以看到客户端握手发起了了一个握手类型为Client Hello的握手(Handshake Type:Client Hello),同时附带了这么一些信息:
3.2、服务端收到Client Hello握手并发起Server Hello握手并下发证书Server ACK回应 在客户端发送Client Hello握手后,服务端会回应ACK信息,如下图所示: 接下来HTTPS 服务器马上给客户端回复了下面这 4 条 SSL 握手信息。
Sever Hello握手 服务端也会发一串随机数Random2,并告诉客户端,服务器端准备选择TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256作为秘钥交互的加密协议套装,该加密协议的套装名字肯定出现在客户端发送给服务器的支持的 32 个列表中。 Certificate证书 SSL 服务器证书信息。在这条 HTTPS 服务器给客户端回复消息 SSL 握手信息里面,其还会把服务器端的 SSL 证书发送给客户端,从图中的转包信息中,我们能清晰地发现服务器端 SSL 证书的相关信息。 需要注意的是,如果是 SSL 的双向认证,服务器端也可以要求客户端把 SSL 证书发送给服务器端(对应的 SSL 握手消息名称为:CertificateRequest),这个时候,客户端就会把其 SSL 证书发送给服务器端,从而证明其就是服务器端信任的客户端。 Server Key Exchange Server以及Server Hello Done 如下图所示,HTTPS 服务器告诉了客户端其将会采用的 EC Diffie-Hellman 算法进行 HTTPS 服务器和客户端的秘钥交换,并提供了 EC Diffie-Hellman 算法使用到的服务器端的参数:
? 3.3、客户端完成密钥交换并发起加密传输请求当客户端收到服务器端的相关公钥信息、SSL 证书以及摘要算法和摘要信息后,会发送一个ack告诉服务端已经收到hello数据包以及证书。 此时客户端需要验证服务器发过来的证书的合法性:通过操作系统内置的ca证书,来验证服务器证书的颁发者和过期时间是否合法,如果存在数据签名,则用操作系统中颁发者CA的公钥对签名解密,用相同的hash算法算出签名的hash值,将这个hash值与签名中的hash值对比。验证是否是真实的服务器发送的。然后客户端会响应下面3 条 SSL 握手信息:
Client Key Exchange?握手信息 客户端验证通过,取出证书中的公钥,然后再生成一个随机数random3,用这个公钥对random3加密,生成PreMaster Key,客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有?Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为什么要使用三个随机数呢?这是因为 SSL/TLS 握手过程的数据都是明文传输的,并且多个随机数种子来生成秘钥不容易被暴力破解出来。 根据PreMaster Key,服务器和客户端会计算出相同的主密码(Master secret),然后根据主密码生成下面的比特序列(秘钥素材)。
Change Cipher Spec Change Cipher Spec握手信息就是告诉服务端,要换密码了。 然后访问网站时,会出现浏览器的警告: 客户端发出使用主密码加密的结束信息,告诉服务器端:“秘钥交换握手协议到此结束”。 ? 3.4、服务端也告知客户端进行加密传输然后HTTPS 服务端马上给客户端回复 2 条 SSL 握手信息,这时轮到服务器端发送“Change Cipher Spec”消息了,服务器告诉客户端:“好,现在我也要切换密码了”。服务器端用预备主密码(Pre-Master secret)计算出的主秘钥加密了一条信息,并发送给客户端:“好的,秘钥交换握手协议到此结束”。如果通信双方都能把结束消息解密成功,说明主秘钥已经交换成功。就可以发送真正的用主密码加密的应用数据的信息了。 3.5、开始进行数据加密传输服务端就可以用对称秘钥把加密过的 HTML 网页内容发送给客户端了,如下图所示:
三、HTTPS真的安全么HTTPS 真的完全安全吗?连访问的域名都获取不到?答案是否定的。上述 HTTPS 在握手阶段有一个很重要的东西:证书。 1、SNI:域名裸奔当访问?HTTPS 站点时,会首先与服务器建立 SSL 连接,第一步就是请求服务器的证书。 当一个?Server IP 只对应一个域名(站点)时,很方便,任意客户端请求过来,无脑返回该域名(服务)对应的证书即可。但 IP 地址(IPv4)是有限的呀,多个域名复用同一个 IP 地址的时候怎么办?服务器在发送证书时,不知道浏览器访问的是哪个域名,所以不能根据不同域名发送不同的证书。因此 TLS 协议升级了,多了 SNI 这个东西,SNI 即 Server Name Indication,是为了解决一个服务器使用多个域名和证书的 SSL/TLS 扩展。现在主流客户端都支持这个协议的。 它的原理是:在与服务器建立?SSL 连接之前,先发送要访问站点的域名(Hostname),这样服务器会根据这个域名返回一个合适的证书。此时还没有办法进行加解密,因此至少这个域名是裸奔的。如下图所示,访问博客园在进行Client Hello握手时就会带上需要访问的域名: 2、中间人攻击HTTPS 中的关键其实在于这个证书。中间人攻击就是在客户端、服务器之间多了个『中介』,『中介』在客户端、服务器双方中伪装对方。如下所示这个『MitmProxy』充当了中间人: 然后访问网站时,会出现浏览器的警告: 提示,连接不是私密连接,其实就是浏览器识别了证书不太对劲,没有信任。而如果此时你信任浏览器,则可以正常访问。因此,当你信任证书后,在中间人面前,又是一览无余了。 因此,一般去申请ca证书的时候,选择正规的CA机构进行证书申请。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:24:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |