前言】最近看过几篇文章,内容是关于“全民HTTPS”的。为什么HTTPS,突然会受到如此多业内人士的青睐呢?HTTPS究竟是什么呢?它与HTTP又有怎样的区别呢?

带着这个问题,我查看了很多网上的资料,但是太多的专业词汇,让我感到头疼,很难理解。按我个人的认知,这个世界上根本不存在任何高深的道理,尤其是西方讲究科学性的思维,再高深,也不可能高深过中国传统思想中的八个字“只可意会,不可言传”,完全不该诉你,让你自己去领悟,这多难啊。

所以,我又耐着性子,参照翟志军的《也许,这样理解HTTPS更容易》一文,以及百度词条的相关定义,用类比的方法,追根溯源,重新梳理一下,才恍然大悟。本着分享的精神,我就把自己所感所悟的过程记录下来,希望大家读罢此文,也能有所感悟!

思考一:为什么HTTPS会突然受到青睐?

答案就四个字——HTTP劫持

思考二:什么是HTTP劫持?

        官方解释:什么是HTTP劫持呢,大多数情况是运营商HTTP劫持,当我们使用HTTP请求请求一个网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文,让客户端(通常是浏览器)展示“错误”的数据,通常是一些弹窗,宣传性广告或者直接显示某网站的内容。

        通俗解释:你预定了某类军事杂志类比“客户端向服务器发送了一条请求,访问军事网站”,此时黑心快递员类比“不要脸的运行商或黑客”拆封了你的快递类比“劫持了你的正常数据流”,然后在军事杂志的每一页,都贴上了“包小姐”的小广告类比“精心设计的网络数据报文,再送行打包送给你,获得额外盈利。

引申:什么是DNS劫持?

        官方解释:DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务或诈骗钱财的目的。

        通俗解释:高考填报考时,你在志愿书上填写了“北大”类比“正常请求”,但是你的前任偷走了你的志愿书类比“劫持了DNS服务器”,把他改成了“北大某鸟”。最后的结果就是,你以690分的成绩考入了北大某鸟类比“最终访问了假网址”,然后还伪装北大招生办,让你往某银行卡打入5千元学费(类比“后续诈骗钱财”)。

一句话概括:HTTP劫持与DNS劫持的区别?

        HTTP劫持:你打开的是人民日报的官方网站,右下角却弹出了蓝翔的挖掘机广告。

        DNS劫持:你在地址栏输入的是人民日报的网页地址,却打开了淘宝特卖的钓鱼网站。

思考三:HTTP为什么会被劫持?

一句话:HTTP在传输的过程中使用的是明文

通俗解释:你在快递东西的时候,快递员是可以看到你的物品的,这样,他就可以随意更换篡改你的东西。

思考四:如何避免HTTP明文的不良影响呢?(推演HTTPS协议的前世今生)

        1.最先想到的就是对明文进行加密,比如各种对称加密(DES);

安全成立的条件:S足够安全,且只有A和B知道;

但是这样就可以了吗?——远没想象那么简单!

如果服务器端B对所有的客户端通信A都使用同样的对称加密算法S,那么,这是不是就可以轻易破解,也就无异于没有加密了呢?

          

         2.如何即能使用对称加密算法,又不公开密钥?

答:Web服务器与每个客户端使用不同的对称加密算法:

         3.服务器端B怎么告诉客户端A该使用哪种对称加密算法S呢?

         答:通过协商。

但是,这样就安全了吗?——依然没有,因为这个协商过程,本身又是裸露的,依然可以被获知,那么怎么办呢?

有人说继续对“协商内容”进行加密,那么,此时你有没有发现,已经陷入一个死循环了呢?

         4.如何解决这种对称加密的死循环呢?

答:用非对称加密(常用RSA)。

         5.什么是非对称加密?

         官方解释:对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

通俗解释:政府的财政收入(类比“私钥加密后的密文”),只要是公民,都有权知道(类比“只要是公钥,都可以解密”);但是公民个人的收入(类比“公钥加密后的密文”),除了自己,只有政府才可以知道,其他人不行(类比“只有私钥可以解密”)。中国政府只有一个,但公民是有很多的(类比“私钥只有一个人有,而公钥可以发给所有的人”)。

此时你应该明白了:HTTPS同时需要对称加密算法和非对称加密算法

        6.要达到Web服务器针对每个客户端使用不同的对称加密算法,同时,我们也不能让第三者知道这个对称加密算法是什么,怎么办?

答:使用随机数。就是使用随机数来生成对称加密算法。这样就可以做到服务器和客户端每次交互都是新的加密算法、只有在交互的那一该才确定加密算法。

此时,你明白为什么HTTPS协议握手阶段会有这么多的随机数了吧。

        7.如何让客户端安全地得到公钥呢?

答:两种假设:

①让服务器端将公钥放到一个远程服务器,客户端可以请求得到;

②让服务器端将公钥发送给每一个客户端;

先看假设①,将公钥放到一个远程服务器,客户端又需要发送请求才能得到。注意,一旦有请求,又有明文,又回到那个死循环了。显然不可以!

再看假设②,仍然有一个问题:如果服务器端发送公钥给客户端时,被中间人调包了,怎么办?显然不可以!

为了方便能理解,请看下图:

        8.如何解决公钥被调包的隐患呢?

公钥被调包的问题出现,是因为我们的客户端无法分辨返回公钥的人到底是中间人,还是真的服务器。这其实就是密码学中提的身份验证问题。

问题的关键在于:我们选择直接将公钥传递给客户端的方案,我们始终无法解决公钥传递被中间人调包的问题。

所以,我们不能直接将服务器的公钥传递给客户端,而是第三方机构使用它的私钥对我们的公钥进行加密后,再传给客户端。客户端再使用第三方机构的公钥进行解密,这样就引出了数字证书的概念。

        9.什么是数字证书?

        官方解释:数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。数字证书是一种权威性的电子文档,可以由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书,也可以由企业级CA系统进行签发。

        说明:证书中只有服务器交给第三方机构的公钥,而且这个公钥被第三方机构的私钥加密了。如果能解密,就说明这个公钥没有被中间人调包。因为如果中间人使用自己的私钥加密后的东西传给客户端,客户端是无法使用第三方的公钥进行解密的。

但是第三方机构不可能只给你一家公司制作证书,它也可能会给中间人这样有坏心思的公司发放证书。这样的,中间人就有机会对你的证书进行调包,客户端在这种情况下是无法分辨出是接收的是你的证书,还是中间人的。因为不论中间人,还是你的证书,都能使用第三方机构的公钥进行解密。

这样,又出现了不安全因素,像下面这样:

        10.如何解决同一机构颁发的不同证书被篡改的问题呢?

要解决这个问题,我们首先要想清楚11和12这两个问题:

        11.谁来负责辨别同一机构下不同证书呢?

        答:客户端。客户端在拿到证书后,自己就有能力分辨证书是否被篡改了。

        12.如何才能拥有分辨证书是否被篡改的能力呢?

        答:使用数字证书。我们从现实中找灵感。比如你是HR,你手上拿到候选人的学历证书,证书上写了持证人,颁发机构,颁发时间等等,同时证书上,还写有一个最重要的:证书编号!我们怎么鉴别这张证书是的真伪呢?只要拿着这个证书编号上相关机构去查,如果证书上的持证人与现实的这个候选人一致,同时证书编号也能对应上,那么就说明这个证书是真实的。

       13.客户端本地怎么验证证书呢?

让证书本身写上“如何根据证书的内容生成证书编号”。也就是:客户端拿到证书后,根据证书上的方法自己生成一个证书编号,如果自己生成的证书编号与证书上的证书编号相同,那么说明这个证书是真实的。同时,为避免证书编号本身又被调包,所以使用第三方的私钥进行加密。

这地方有些抽象,我们来个图帮助理解:

当客户端拿到证书后,开始对证书中的内容进行验证,如果客户端计算出来的证书编号与证书中的证书编号相同,则验证通过。

        14.这么多机器,第三方机构的公钥怎么跑到了客户端的机器中呢?

其实呢,现实中,浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。

类比总结

上边例子中:

所提到的证书,其实就是HTTPS中的数字证书

所提到的证书编号就是HTTPS中的数字签名

所提到的第三方机构就是指数字证书签发机构(CA)

一句话总结HTTPS的原理

        HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构(CA)颁发的证书来保证非对称加密过程本身的安全,为了保证证书不被篡改,引入数字签名,客户端使用相同的对称加密算法,来验证证书的真实性,如此,最终解决了客户端与服务器端之间的通信安全问题。

白话图解HTTPS原理的更多相关文章

  1. HTTPS 原理浅析及其在 Android 中的使用

    作者:曹丰斌   本文首先分析HTTP协议在安全性上的不足,进而阐述HTTPS实现安全通信的关键技术点和原理.然后通过抓包分析HTTPS协议的握手以及通信过程.最后总结一下自己在开发过程中遇到的HTT ...

  2. https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名

    声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...

  3. (转)图解SSH原理

    图解SSH原理 原文:https://www.jianshu.com/p/33461b619d53 http://blog.51cto.com/forlinux/1352900---------SSH ...

  4. 网络知识杂谈 - https - 原理简述

    概述 简单描述 https 尽量介绍它的原理 实际的机制, 可能会更加复杂一些... 背景 这玩意, 困扰我好多年了 今天开始, 想做个了断 之前工作也接触过, 但从我的角度来说, 认识很浅 会配置 ...

  5. 白话TCP/IP原理

    TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议 ...

  6. HTTPS 原理解析

    一 前言 在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全.为了保证 ...

  7. (转) 一张图解AlphaGo原理及弱点

    一张图解AlphaGo原理及弱点 2016-03-23 郑宇,张钧波 CKDD 作者简介: 郑宇,博士, Editor-in-Chief of ACM Transactions on Intellig ...

  8. [转]HTTPS那些事(一)HTTPS原理

    [转]HTTPS那些事(一)HTTPS原理 http://www.guokr.com/post/114121/ 楔子谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>, ...

  9. Tengine HTTPS原理解析、实践与调试【转】

    本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...

随机推荐

  1. 【JavaEE】企业面试问题-Java基础

    1. Java基础部分   1.1 Java中的方法覆盖(Overwrite)和方法重载(Overloading)是什么意思? 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的 ...

  2. Ionic3 编程-应用启动进入引导页

    新建引导页面 ionic g page welcome 导入组件 修改模版文件:welcome.html 修改样式文件:welcome.scss 安装相关插件: 数据库使用SQLite:ionic c ...

  3. Spring框架学习之高级依赖关系配置(二)

    紧接着上篇内容,本篇文章将主要介绍XML Schema的简化配置和使用SpEL表达式语言来优化我们的配置文件. 一.基于XML Schema的简化配置方式 从Spring2.0以来,Spring支持使 ...

  4. Windows环境下多线程编程原理与应用读书笔记(8)————信号量及其应用

    <一>线程间同步原因 线程间竞争共享资源: 线程间为完成某个任务而协作: 通过互斥量可以实现线程间由于竞争所需要的同步,通过事件可以实现线程间由于协作所需要的同步. 信号量很好地将互斥量和 ...

  5. 第三方软件内嵌IE出现纵向滚动条消失的BUG,奇葩的IE BUG 真是无奇不有

    混了这么久 竟然还有这样难以解决的BUG,最后都跑到英文的MSDN上提问了,因为谷歌都谷不出朕的忧伤了,有木有. 提问原文如下:https://social.msdn.microsoft.com/Fo ...

  6. Golang源码探索(二) 协程的实现原理

    Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻 ...

  7. [小程序开发] 微信小程序内嵌网页web-view开发教程

    为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...

  8. java 整型数组基本排序,冒泡,快速选择,插入,归并

    在学java泛型,于是把排序拿来练练手了 import java.util.Arrays; public class GenericArraySort { public static void mai ...

  9. 阿里云ecs初始化磁盘后远程连接不到服务器

    阿里云初始化磁盘后远程连接不到服务器 报错: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ... 原因:阿里云ecs第一次链接服务器之后会在本地电 ...

  10. jenkins+docker 持续构建非docker in docker jenkins docker svn maven

    工欲善其事必先利其器,为了解脱程序员的,我们程序员本身发明了很多好用的工具,通过各种工具的组合来达到我们想要的结果 本文采用jenkins docker svn maven作为相关工具,项目sprin ...