HTTPS 原理解析

    xiaoxiao2021-03-25  153

    Zery

    让技术成为我们的一种能力,但不是所有能力

    博客园首页新随笔联系订阅

    HTTPS 原理解析

    一 前言

      在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0,定义在RFC 2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。目前TLS的版本是1.2,定义在RFC 5246中,暂时还没有被广泛的使用 ()

    概念可参考百科

    http://baike.baidu.com/link?url=M8pBu1j_22f0PW6izvAOCTjhepyRcT320U9LDmjyzb586OYS_aBALxfqIGVca1V-8MJeSl3bTUEOThMuwpamPK

     

     

    二  HTTPS 验证原理

      Https在真正请求数据前,先会与服务有几次握手验证,以证明相互的身份,以下图为例

     

     

     

    2.1  验证流程

     

     注:文中所写的序号与图不对应但流程是对应的

    1 客户端发起一个https的请求,把自身支持的一系列Cipher Suite(密钥算法套件,简称Cipher)发送给服务端

     

    2  服务端,接收到客户端所有的Cipher后与自身支持的对比,如果不支持则连接断开,反之则会从中选出一种加密算法和HASH算法

       以证书的形式返回给客户端 证书中还包含了 公钥 颁证机构 网址 失效日期等等。

     

    3 客户端收到服务端响应后会做以下几件事

        3.1 验证证书的合法性    

        颁发证书的机构是否合法与是否过期,证书中包含的网站地址是否与正在访问的地址一致等

            证书验证通过后,在浏览器的地址栏会加上一把小锁(每家浏览器验证通过后的提示不一样 不做讨论)

       3.2 生成随机密码

            如果证书验证通过,或者用户接受了不授信的证书,此时浏览器会生成一串随机数,然后用证书中的公钥加密。       

        3.3 HASH握手信息

           用最开始约定好的HASH方式,把握手消息取HASH值,  然后用 随机数加密 “握手消息+握手消息HASH值(签名)”  并一起发送给服务端

           在这里之所以要取握手消息的HASH值,主要是把握手消息做一个签名,用于验证握手消息在传输过程中没有被篡改过。

     

    4  服务端拿到客户端传来的密文,用自己的私钥来解密握手消息取出随机数密码,再用随机数密码 解密 握手消息与HASH值,并与传过来的HASH值做对比确认是否一致。

        然后用随机密码加密一段握手消息(握手消息+握手消息的HASH值 )给客户端

     

    5  客户端用随机数解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密  

         因为这串密钥只有客户端和服务端知道,所以即使中间请求被拦截也是没法解密数据的,以此保证了通信的安全

      

    非对称加密算法:RSA,DSA/DSS     在客户端与服务端相互验证的过程中用的是对称加密  对称加密算法:AES,RC4,3DES     客户端与服务端相互验证通过后,以随机数作为密钥时,就是对称加密 HASH算法:MD5,SHA1,SHA256  在确认握手消息没有被篡改时 

     

     

    2.2  客户端如何验证 证书的合法性?

     

    1. 验证证书是否在有效期内。

      在服务端面返回的证书中会包含证书的有效期,可以通过失效日期来验证 证书是否过期

    2. 验证证书是否被吊销了。

      被吊销后的证书是无效的。验证吊销有CRL(证书吊销列表)和OCSP(在线证书检查)两种方法。

    证书被吊销后会被记录在CRL中,CA会定期发布CRL。应用程序可以依靠CRL来检查证书是否被吊销了。

    CRL有两个缺点,一是有可能会很大,下载很麻烦。针对这种情况有增量CRL这种方案。二是有滞后性,就算证书被吊销了,应用也只能等到发布最新的CRL后才能知道。

    增量CRL也能解决一部分问题,但没有彻底解决。OCSP是在线证书状态检查协议。应用按照标准发送一个请求,对某张证书进行查询,之后服务器返回证书状态。

    OCSP可以认为是即时的(实际实现中可能会有一定延迟),所以没有CRL的缺点。

     

    3. 验证证书是否是上级CA签发的。

    windows中保留了所有受信任的根证书,浏览器可以查看信任的根证书,自然可以验证web服务器的证书, 是不是由这些受信任根证书颁发的或者受信任根证书的二级证书机构颁发的(根证书机构可能会受权给底下的中级证书机构,然后由中级证书机构颁发中级证书) 在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信          

    三  手机如何抓取HTTPS的请求数据

          当站点由HTTP转成HTTPS后是更安全了,但是有时候要看线上的请求数据解决问题时却麻烦了,因为是HTTPS的请求,你就算拦截到了那也是加密的数据,没有任何意义。   那有方法解决吗? 答案是肯定的! 接下来就来个实例教程,教大家如何查看HTTPS的请求数据     首先需要安装Fiddler 用于拦截请求,和颁发https证书   3.1  Fiddler根证书导出       按图中操作把导出,再将导出的的根证书" FiddlerRoot.cer" 的后辍名 改为"crt"  " FiddlerRoot.crt" 因为手机没法直接安装 cer格式的证书          3.2  证书安装   在本机把证书移到本机IIS中的某个网站的物理目录中,然后在手机浏览器中访问该证书的目录 如:"192.168.0.102:8001/FiddlerRoot.crt"  如图            此时手机会提示按装根证书,其实安装一个不受信的根证书是非常危险的,如果你安装了某些钓鱼网站或者有危害的根证书,那只要是该根证书下的所有证书都会验证通过, 那随便一个钓鱼网的网站只要安装了该根证书下的证书,都不会有任何警告提示。 很可能让用户有财产损失。所以在安装根证书时,手机系统会要求你输入锁屏密码,以确保是本人操作。 安装过程如下     Fiddler的根证书名字都提示了是不受信的根证书        安装完成                3.3  通过Fiddler抓取手机的HTTPS请求          Fiddler默认侦听的端口是8888,把手机WiFI的Http 代理设为本机Fiddler的地址如下图    这样手机上所有的请求都会先通过Fiddler,Fiddler再转发到目标服务器   注意: 在家中的路由器中有线与无线通常不在一个网段,会导致Fiddler无法抓到手机的包,需要手动设置路由,可自行百度                  代理也设好之后便可以开始抓到Https的请求内容了如图 Https的默认端口号是 “443”可以看出红框中的是未装根证书前的请求,加了一把小锁,而且请求记录都是灰色的 而安装证书后请求则一切正常,请求内容也都可以正常看到。            3.4  为什么安装了Fiddler根证书可以看到Https请求内容     要解释这个问题,就需要了解最开始的Https的验证原理了,回顾一下,先是客户端把自己支持的加密方式提交到服务端,然后服务端 会返回一个证书 到这一步问题来了,手机未什么要安装Fiddler的证书呢?   第一 因为Fiddler在客户端(手机)发出Https请求时,充当了服务器的角色,需要返回一个证书给客户端, 但是Fiddler的证书并不是CA机构颁发的,客户端一验证就知道是假的连接肯定就断了,那怎么办呢? 那就想办法让客户端信任这个服务端,于是就在客户端安装一个Fiddler的根证书。 所以只要是通过Fiddler的Https请求,验证根证书时自然会通过,因为Fiddler的根证书你已经受信了!        第二 现在只是客户端(手机)和Fiddler这个伪服务端的Https验证通过了,还没有到真正的服务端去取数据的,此时Fiddler会以客户端的身份与真正的服务端再进行一次HTTPS的验证,最后拿到数据后 又以服务端的身份与客户端(手机)通信。也就是说在一次请求中数据被两次加解密,一次是手机到Fiddler,一次是Fiddler到真正的服务端。   整个过程  手机----》Fiddler----》 服务器  Fiddler 即充当了服务端又充当了客户端,才使得数据能够正常的交互,这个过程中最重要的一环就是手机端安装的 根证书!        

    四  总结

       写了这么多,其实也只是把Https的基本流程写清楚了一部分,这其中每一个步骤深入下去都是一门学科,而对于我们而言,能清楚其大致运作流程,做到心中有数据就算可以了, Https在目前的网络数据安全传输占据着重要地位,目前可能也没有更优的方案来代替Https。另外一定要注意 不要随便安装不确定的的根证书,以免带来不必要的损失。 写这篇文章时,已经进入我的春节假期,而我也已经踏上了 回家的火车,大家有疑问可以在评论中回复,如有错误之处还望大家能指出,以免误导他人   提前祝大家新年快乐!        

    如果您觉得本文让您有所收获,不妨点下赞,为我的付出,给一点点回报!

    如果您觉得本人也有点意思,不妨点个观注,大家一起谈技术,谈人生!

       

     以下为参考资料

    http://www.guokr.com/post/114121/  https原理   http://www.guokr.com/post/116169/ SSL证书   http://www.cnblogs.com/svan/p/5090201.html https工作原理   http://blog.csdn.net/clh604/article/details/22179907 Https 原理   https://www.zhihu.com/question/37370216/answer/71956414   浏览器如何验证HTTPS证书的合法性?   http://blog.csdn.net/wkk2620632/article/details/39433673    公钥证书cer,pfx   http://www.07net01.com/zhishi/640504.html   数字证书资料cer和pfx的区别 分类: Http 好文要顶 关注我 收藏该文 Zery 关注 - 82 粉丝 - 554 +加关注 26 0 « 上一篇: 让数据决策你的行为--拉勾网数据分析 » 下一篇: xml posted @ 2016-02-01 08:53 Zery 阅读( 8343) 评论( 12) 编辑 收藏 评论列表    #1楼 2016-02-01 09:08 某个人。   Thx 4 shared. 支持(0) 反对(0) http://pic.cnblogs.com/face/498413/20160819174055.png    #2楼 2016-02-01 09:11 Lumia1020   Mark 支持(0) 反对(0) http://pic.cnblogs.com/face/620936/20170119143545.png    #3楼 2016-02-01 13:21 明海哥哥   这么早就放假,羡慕 支持(0) 反对(0)    #4楼 2016-02-01 14:18 oct   证书crt上的公钥只是用来加密随机数,而真正的内容通信是由客户端产生的这个随机数作为密钥进行加密。那么如果一个站点的客户端数量非常庞大,那么网站服务器端岂不是要维护很大的一个随机密钥的表在缓存当中? 支持(1) 反对(0)    #5楼 2016-02-01 14:32 西瓜不哭   不错 !! 支持(0) 反对(0)    #6楼 2016-02-01 16:09 都是那行码   阅读中发现这里可能博主少写了一个字。 非对称加密算法:RSA,DSA/DSS 在客户端与服务端相互验证的过程中用的是非对称加密 支持(1) 反对(0)    #7楼 2016-02-01 22:27 Sieata   mark 支持(0) 反对(0)    #8楼 2016-02-02 09:34 SzeCheng   前两天我干了这样一件事情。 利用Fiddler做代理,篡改访问返回的数据。 把访问 https://smp-device-content.apple.com/static/region/v2/config.json 的结果篡改为 https://smp-device-content.apple.com/static/region/v2/config-beta.json 想来欺骗手机。 结果手机去请求,Fiddler上显示了Tunnel to。 手机上显示无网络连接。 这是什么地方出了问题呢? 还有Tunnel to 是代表了什么? 支持(0) 反对(0) http://pic.cnblogs.com/face/715262/20150118161150.png    #9楼 2016-02-02 16:17 zhidan   mark 支持(0) 反对(0) http://pic.cnblogs.com/face/478748/20140814135509.png    #10楼 [ 楼主] 2016-02-03 21:29 Zery   @ SzeCheng 为了防止中间人攻击 请求的消息中会有消息签名 客户端服务端都会对消息进行签名验证如果不一致则会断开连接 你就是签名不一致所以断开连接了 支持(0) 反对(0) http://pic.cnblogs.com/face/366784/20130905143458.png    #11楼 2016-02-04 12:08 SzeCheng   @ Zery 我估计也是这样的 不过Tunnel to 是个什么意思呢 支持(0) 反对(0) http://pic.cnblogs.com/face/715262/20150118161150.png    #12楼 3360900 2016/2/14 10:53:47 2016-02-14 10:53 Json   mark 支持(0) 反对(0) http://pic.cnblogs.com/face/u290610.jpg?id=09223729 刷新评论 刷新页面 返回顶部 注册用户登录后才能发表评论,请 登录 或 注册, 访问网站首页。 【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库 【推荐】Google+GitHub联手打造前端工程师课程 最新IT新闻: · 维基解密:全球手机成CIA窃听器 关机也能录音 · 实拍国内最大共享单车工厂:10分钟下线16辆 · Google计划收购数据科学社区Kaggle · 微软旗下社交网站So.cl将于2017年3月15日关停 · 今天没Windows 10新版?原是临推送前被紧急撤回 » 更多新闻... 最新知识库文章: · 垃圾回收原来是这么回事 · 「代码家」的学习过程和学习经验分享 · 写给未来的程序媛 · 高质量的工程代码为什么难写 · 循序渐进地代码重构 » 更多知识库文章...

    公告

    正在读的书:

        

    昵称: Zery 园龄: 5年2个月 粉丝: 554 关注: 82 +加关注 <2017年3月> 日一二三四五六2627281234567891011121314151617181920212223242526272829303112345678

    常用链接

    我的随笔我的评论我的参与最新评论我的标签

    我的标签

    C# 基础(10)IL 系列(3)javascript(2)EF(2)个人作品集(2)生活感悟(2)遮罩(1)面试相关(1)jquery遮罩(1)读书计划(1)更多

    随笔分类

    ASP.NET(1) ASP.NET MVC C#基础知识(15) ElasticSearch(1) Entity FrameWork(2) Http (1) JavaScript(4) Linux Python SQL Server(1) TCP/IP 查询资料(3) 个人作品集(5) 面试题目(2) 设计模式(6) 生活感悟(3) 学习目标(1)

    随笔档案

    2017年2月 (1) 2017年1月 (1) 2016年12月 (1) 2016年11月 (3) 2016年5月 (2) 2016年4月 (2) 2016年2月 (2) 2016年1月 (1) 2015年12月 (1) 2015年4月 (1) 2014年10月 (2) 2014年6月 (1) 2014年4月 (5) 2014年3月 (2) 2013年12月 (1) 2013年11月 (4) 2013年10月 (9) 2013年9月 (4) 2013年8月 (5) 2012年10月 (1)

    文章档案

    2016年11月 (1)

    积分与排名

    积分 - 91687 排名 - 2620

    阅读排行榜

    1. 读懂正则表达式就这么简单(18206)2. 读懂IL代码就这么简单 (一)(13901)3. 做为技术人员为什么要写博客(12285)4. C#操作XML方法集合(10014)5. HTTPS 原理解析(8342)6. 采集博客园文章,用瀑布流+无限滚动展示(附源码)(7096)7. 文件夹管理工具(MVC+zTree+layer)(附源码)(6025)8. 2014年读书计划(5902)9. 常用加解密方法汇总 工具 (附源码)(5895)10. 让数据决策你的行为--拉勾网数据分析(5707)

    评论排行榜

    1. 读懂IL代码就这么简单 (一)(102)2. 2014年读书计划(101)3. 做为技术人员为什么要写博客(76)4. 百度广告 高亮 Chrome插件(附源码)(51)5. 采集博客园文章,用瀑布流+无限滚动展示(附源码)(49)6. 文件夹管理工具(MVC+zTree+layer)(附源码)(43)7. 读懂正则表达式就这么简单(38)8. 委托 你怎么看?(37)9. 常用加解密方法汇总 工具 (附源码)(33)10. C#操作XML方法集合(31)

    推荐排行榜

    1. 读懂IL代码就这么简单 (一)(146)2. 做为技术人员为什么要写博客(131)3. 读懂正则表达式就这么简单(110)4. 常用加解密方法汇总 工具 (附源码)(96)5. 让数据决策你的行为--拉勾网数据分析(87)6. 采集博客园文章,用瀑布流+无限滚动展示(附源码)(68)7. 文件夹管理工具(MVC+zTree+layer)(附源码)(59)8. 读懂IL代码就这么简单(二)(43)9. 2014年读书计划(42)10. 委托 你怎么看?(41) Copyright ©2017 Zery
    转载请注明原文地址: https://ju.6miu.com/read-3018.html

    最新回复(0)