热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

理解Https

一次网络的请求,会经过很多的中间人,比如路由器,猫,网络运营商的基站等等。如果使用HTTP这协议,些中间人&#

一次网络的请求,会经过很多的中间人,比如路由器,猫,网络运营商的基站等等。如果使用HTTP这协议,些中间人,是可以直接查看浏览器和服务器之间的数据的,相当于在裸奔。
以前在网络监管没有那么严格的时候,xx公司就会在服务器返回给客户端的数据上面添油加醋,比如说返回的网页上面加入广告,让你冲话费啥的。。。
思考:怎么保证这些中间人不能查看客户端和服务器之间的数据?
加密。用一个只有客户端和服务器知道的密码对数据进行加解密。中间人不知道密码,即使截获到了数据,也是一堆乱码,也不能进行查看修改。
记得上大学的时候,到银行办理过一个网上银行的服务。银行会给你发一个类似U盘的东西,当你想要转账的时候,就把这个东西插在电脑上,然后就能进行安全的转账了。
其实,这个U盘里面包含的就是客户端和服务端用来加密数据的密码。密码只有客户端和服务端知道,保证了绝对的安全。
客户端和服务端使用的都是同一个密码,这就是对称加密。
在这里插入图片描述

思考:在互联网应用中,如果每个应用的客户都下发一个U盾,来传递密码,全世界这么多应用、这么多用户,这是一个指数级的问题,没有办法实现。那么如何在互联网上安全的传输这个对称加密的密码而不被外泄呢?
引入非对称加密,用来传输对称加密所使用的秘钥。加密和解密用的不是同一个秘钥。公钥加密只有私钥能解,私钥加密只有公钥能解。

TCP三次握手之后,https中的ssl协议还会要求一次四次握手,主要用于商量对称加密的算法以及对称加密使用的秘钥。

  1. 客户端会say一个Hi,并且将自己支持的对称加密算法集合(cipher suites)发送给服务器,服务器会从这些算法中挑选一个自己也支持的对称加密的算法,并且返回给客户端。同时将自己的public key发送给客户端。
  2. 客户端得到响应之后,知道了要使用的对称加密的算法是什么,接下来,就会和服务器商量一个对称加密的秘钥。
  3. 客户端会随机生成一串秘钥,并且用服务端的public key进行加密。发送给服务器。
  4. 服务器在收到秘钥之后,使用自己的私钥进行解密得到对称加密的秘钥。由于公钥加密只有私钥能够解密,而私钥只有服务器才有,其它的中间人是没有的,中间人无法解密,所以保证了对称加密所使用的秘钥的安全。
    在这里插入图片描述思考:上面的流程绝对安全了吗?
    并不是。中间人可以冒充服务器和客户端的。
    如果服务器在下发公钥的时候,公钥被中间人拦截。
    1)冒充服务端:我不把这个公钥传递给客户端,而是我自己生成一对公私钥,然后将自己的公钥传给客户端。这样我就能冒充服务器和客户端进行通信了。
    2)冒充客户端:我不把客户端的请求转发给服务器,而是用服务器的公钥将自己生成的对称加密的秘钥加密之后,发给服务器,这样后面我就能够冒充客户端和服务器通信了。

在这里插入图片描述

思考:如何解决中间人冒充客户端或者服务器的问题?
这时候就需要引入第三方机构CA了。

  1. Server提供一些信息,比如网站的域名、邓白氏编码、营业执照、自己的公钥给CA机构
  2. CA机构对这些信息进行一个鉴别,主要是鉴别这个网站是不是属于你的。防止有人申请同一个网站的证书。一般验证的方法是让你在网站的某个目录放一个文件,并且在文件里面写上指定的内容。
  3. 验证通过之后,CA机构会拿自己的私钥,给server提供的信息签一个名。这样就得到了一个CA证书。CA私钥签名只有CA的公钥能够解开。
  4. 获得CA证书之后,网站的管理员需要将证书部署到server上。
  5. 客户端在请求服务器的时候,服务器会将包含自己的public key的证书发送给客户端
  6. 客户端拿到证书之后,会用CA的公钥对证书进行解密。CA的公钥也是包含在证书中的,一般是内置在操作系统中。
  7. 这样一来,就得到了serverpublic key了。后面再使用这个key协商对称加密的秘钥。
    在这里插入图片描述

思考:中间人能够解开server的证书吗?
能。既然客户端的操作系统能够内置CA机构的公钥,那么中间人的操作系统也可以。所以中间人也能够解开证书得到服务器的公钥。

思考:既然中间人能解开证书得到server的公钥,那么它还能冒充服务器吗?
不能。中间人如果需要冒充服务器,它需要创建一个伪证书。它不可能从CA再去申请一个相同域名的证书了,因为CA机构会进行验证(如果真的申请成功了怎么办?CA机构会为你的损失给你赔钱)。既然不能申请证书,那么可不可以自己伪造一个?
即使伪造了也没啥用。因为中间人需要拿自己的私钥签名一个伪证书,而客户端现在会用内置的CA机构的公钥去解密收到的证书。中间人发过来的伪证书,客户端是没有办法使用内置的公钥解开的。(当然如果你的系统受到了攻击导入了一些包含公钥的不正常的证书话,就不能避免这个问题,所以我们不能随便给系统导入证书)

思考:中间人现在能够冒充客户端吗?
这时候是可以的。因为中间人能够得到server的公钥。中间人不把客户端的请求发给服务器,而是用服务器的公钥将自己生成的对称加密的秘钥加密之后发给服务器,这样后面就能够冒充客户端和服务器通信了。
解决办法:到这里,都是客户端去验证server端是不是真正的server,这就是https的单向认证。HTTPS还有一个双向认证,server端也去验证下是不是真正的客户端在和自己通信。既然server端能够申请证书,那么客户端能不能也去CA申请一个证书?证明自己是真正的客户端。可以的。
双向认证可以参考这篇文章:https://www.jianshu.com/p/2b2d1f511959?utm_campaign=haruki


推荐阅读
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细介绍如何使用Samba软件配置CIFS文件共享服务,涵盖安装、配置、权限管理及多用户挂载等关键步骤。通过具体示例和命令行操作,帮助读者快速搭建并优化Samba服务器。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
author-avatar
意华嘉泰6
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有