| |
|
开发:
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安全通信机制 |
一点点历史回顾ARPAnet Reference Model1969年11月,美国国防部 高级研究计划管理局( ARPA 全称: Advanced Research Projects Agency)开始建立一个命名为ARPAnet的网络,这是就是互联网的前身,一个军事用途的网络。 TCP/IP Reference Model随着ARPAnet网络的逐渐发展,更多的主机接入,原来的架构和协议已经不够用了,研究人员把重点投向了第二代网络协议的研究,于是TCP/IP协议簇出现了。而TCP/IP簇使用的网络参考模型就是TCP/IP参考模型,我们称之为“五层网络模型”。 当然也有人说这个TCP/IP参考模型是四层的,不是五层的。其实这么理解也是对的,TCP/IP参考模型只是一种概念,并没有相关的标准。TCP/IP协议里边 只是要求能够提供给其上层-网络互连层(Internet layer)一个访问接口,以便在其上传递IP分组就可以。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。 OSI Reference Model全称Open Systems Interconnection Reference Model,即“开放式系统互连参考模型”,是七层参考模型。 1978年(或1979年),为了统一网络系统的体系结构,ISO(International Standards Organization国际标准化组织)和CCITT(International Telegraph and Telephone Consultative Committee国际电报电话咨询委员会)分别起草了定义网络模型的文档。1983年,这两份文档合并,形成一个标准,称为开放系统互连的基本参考模型(the OSI Reference Model)。它把通信系统划分成七个不同的抽象层,每一层服务于上一层,并由下面的层提供服务。1984年,该标准分别被列入了ISO标准(ISO 7498) 和 CCITT标准(X.200)。 TCP/IP参考模型 和 OSI参考模型无论是TCP/IP四层模型还是OSI七层模型,简单来讲,发送数据的时候就是数据经过层层包装,包装成每一层能看得明白的信息,然后到了物理层转化成了二进制流,发送出去,接收方再经过逆向的层层剥离,把数据拿出来,最后就完成了数据的传输。
Http和Https的关系HTTP通信,是不加密的通信。所有信息明文传播,带来了三大风险。
而SSL/TLS协议的诞生便是为了解决这三大风险:
HTTPS就是在TCP协议层和HTTP协议层中间架起了一层SSL/TSL协议层,这一层能够把在网络中传输的数据进行有效的加密。下面是基于SSL协议的五层网络模型图:
SSL/TLSSSL(Secure Sockets Layer安全套接层),是一种网络安全协议。主要依赖数字证书、非对称加密、对称加密、数据完整性校验以及随机数这5个密码学的基础知识,构建出一个完整可信的传输链。 TLS(Transport Layer Security传输层安全协议),是基于SSL协议的通用化协议,正逐步替代SSL。 SSL/TLS分为两层,一层是记录协议(建立在可靠的传输协议上(比如tcp),提供数据封装,加密解密,数据建议等基本功能),一层是握手协议(建立在记录协议上,在实际的数据传输开始前,进行加密算法的协商,通信密钥的交换等)。 SSL/TLS发展历史
目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支持。TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。 基本运行过程SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息并发送给服务器,服务器收到密文后,用自己的私钥解密。 那么,非对称加密的引入是否解决了数据传输的安全问题?这个问题大家可以思考一下,我们稍后再讨论。 另外,细心的人都会发现,非对称加密机制的安全性,必须建立在公钥的安全发放这个大前提上。毕竟在大多数情况下,通信双方并不是面对面的,无法通过安全可靠的物理介质交换公钥,公钥本身也是通过网络传输的,那么,如何防止公钥的传输过程被攻击?举个简单的例子,A和B为了通信安全,约定使用非对称加密进行通信,在开始加密通信前,B需要通过网络向A发放自己的公钥B’和一段密文,但此时C截获了B‘的发放过程,将自己伪装成B,并将自己的公钥C‘和自己的私钥加密的一段密文发放给了A,A拿到C’后,验证解密过程成功,就以为自己拿到的确实是B‘,于是开始了加密通信,这样,A和B都以为自己在和对方通信,但实际上他们其实各自在和C通信,此时C就可以为所欲为。 针对公钥的安全发放问题,解决办法就是数字证书。私钥持有者需要向CA购买数字证书,将公钥放在数字证书中传输,任何第三方只要验证了数字证书是可信的,就可以相信该证书中的公钥是可信的。 然而,细心的人可能又有疑问了:数字证书会不会也存在问题,换句话说,如何保证数字证书的有效安全? 数字证书的非法可能有两种情况:
数字证书的可靠性,就要靠数字签名来保证了。关于数字证书和数字签名的详细介绍,参考我的另一篇文章《Android签名机制》-准备知识,这里不再赘述。 解决了证书的安全发放问题后,再回头看第一个问题:非对称加密的引入是否解决了数据传输的安全问题? 答案是,还不够! 为什么这么说?因为非对称加密只能保证数据的传输单向安全。所谓非对称加密,就是一方加密的信息,只能由另一方解密。虽然私钥只有自己(服务器)持有,但是公钥却是公开的,任何人都可以持有公钥,那么服务器用私钥加密过的信息,任何持有公钥的人都可以解密出来,换句话说,服务器的数据相当于是在网络上换了种方式裸奔。 ※引申思考:既然私钥加密的数据并没有隐私性可言,是不是私钥加密就没有用处了? 说到这里,你可能会有疑惑:加入了SSL加密层,服务器数据还是在裸奔,还不如直接用HTTP来的省事。 非也非也,单纯的非对称加密确实只能保证数据传输的单向安全。然而SSL不仅用了非对称加密,同时还结合了对称加密机制,来确保数据传输的双向安全,而这同时也解决了非对称加密效率过低的弊病。 概括来说,整个简化的加密通信的流程就是:
上述过程的前4步,又称为“握手阶段”。 SSL/TLS握手阶段的详细过程1.客户端发出请求(ClientHello)首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。 在这一步,客户端主要向服务器提供以下信息:
2.服务器回应(SeverHello)服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。 服务器的回应包含以下内容:
除此之外,如果服务器需要使用双向认证,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。 3.客户端回应客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。 如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。
上面的随机数C,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。 此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。 4.服务器的最后回应服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"(对称密钥)。然后,向客户端最后发送下面信息。 至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
为什么更加安全的HTTPS没有在互联网中全面应用
Stackoverflow 的创始人也曾经针对为什么Stackoverflow不使用https做出了回答:Stackoverflow.com: the road to SSL ? Nick Craver 中间人攻击关于HTTPS,经常会提到的就是中间人攻击,即所谓的Man-in-the-middle attack(MITM),顾名思义,就是攻击者插入到原本直接通信的双方,让双方以为还在直接跟对方通讯,但实际上双方的通信对方已变成了中间人,信息已经被中间人获取或篡改。 1.SSL证书欺骗攻击此类攻击较为简单常见。首先通过ARP欺骗、DNS劫持甚至网关劫持等等,将客户端的访问重定向到攻击者的机器,让客户端机器与攻击者机器建立HTTPS连接(使用伪造证书),而攻击者机器再跟服务端连接。这样用户在客户端看到的是相同域名的网站,但浏览器会提示证书不可信,用户不点击“继续浏览”就能避免被劫持。所以这是最简单的攻击方式,也是最容易识别的攻击方式。 2.SSL剥离攻击SSL剥离,即将HTTPS连接降级到HTTP连接。假如客户端直接访问HTTPS的URL,攻击者是没办法直接进行降级的,因为HTTPS与HTTP虽然都是TCP连接,但HTTPS在传输HTTP数据之前,需要进行SSL握手,并协商对称密钥用于后续的加密传输;假如客户端与攻击者进行SSL握手,而攻击者无法提供可信任的证书来让客户端验证通过进行连接,所以客户端的系统会判断为SSL握手失败,断开连接。 该攻击方式主要是利用用户并不会每次都直接在浏览器上输入https://xxx.xxx.com来访问网站,或者有些网站并非全网HTTPS,而是只在需要进行敏感数据传输时才使用HTTPS的漏洞。中间人攻击者在劫持了客户端与服务端的HTTP会话后,将HTTP页面里面所有的https://超链接都换成http://,用户在点击相应的链接时,是使用HTTP协议来进行访问;这样,就算服务器对相应的URL只支持HTTPS链接,但中间人一样可以和服务建立HTTPS连接之后,将数据使用HTTP协议转发给客户端,实现会话劫持。 这种攻击手段更让人难以提防,因为它使用HTTP,不会让浏览器出现HTTPS证书不可信的警告,而且用户很少会去看浏览器上的URL是https://还是http://。特别是App的WebView中,应用一般会把URL隐藏掉,用户根本无法直接查看到URL出现异常。 老和尚和小和尚的故事作者:牟旭东 下面开始讲一个无聊的故事,和问题关系不大,时间紧张的看官可以到此为止了。 |
|
网络协议 最新文章 |
使用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 19:22:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |