网络

最详细的HTTPS介绍(转载)

2017-07-28  本文已影响44人  android_hcf

为什么需要https

HTTP是明文传输的,也就意味着,介于发送端、接收端中间的任意节点都可以知道你们传输的内容是什么。这些节点可能是路由器、代理等。
举个最常见的例子,用户登录。用户输入账号、密码,如果采用HTTP的话,只要在代理服务器上做点手脚就可以拿到你的密码了。

用户登录 -> 代理服务器(做手脚) -> 实际授权服务器

在发送端对密码进行加密?没用的,虽然别人不知道你原始密码多少,但能够拿到加密后的账号密码,照样能登录。

HTTPS是如何保障安全的

HTTPS其实就是secure http的意思啦,也就是http的安全升级版。稍微了解网络基础的同学都知道,http是应用层协议,位于HTTP协议之下是传输协议TCP。TCP负责传输,HTTP则定义了数据如何进行包装。

HTTP -> TCP(明文传输)

HTTPS相对于HTTP有哪些不同呢?其实就是在HTTP跟TCP之间加上了加密层TLS/SSL。

神马是TLS/SSL

通俗的讲,TLS、SSL其实是类似的东西,SSL是个加密套件,负责对HTTP的数据进行加密。TLS是SSL的升级版,现在提到HTTPS,加密套件基本指的TLS。

传输加密流程

原先是应用层将数据直接给到TCP进行传输,现在改成应用层将数据给到TLS/SSL,将数据加密后再给到TCL进行传输。
大致如图所示。

SSL/TLS 协议

就是这么回事。将数据加密后再传输,而不是直接让数据在复杂而又充满危险的网络中裸奔,在很大程度上保证了数据的安全。这样的话,即使数据被中间节点截获,坏人也看不懂。

HTTPS是如何加密数据的

一般来说,分为对称加密和非对称加密(也叫公开密钥加密)

什么是公钥呢?其实就是字面上的意思1——公开的密钥,谁都可以查到。因此非对称密钥也叫公开密钥加密。
公钥、私钥两个有什么联系呢?
简单的说就是,通过公钥加密的数据,只能通过私钥解开。通过私钥加密的数据,只能通过公钥解开。

很多同学都知道用私钥能解开公钥加密的数据,但忽略了一点,私钥加密的数据,同样可以用公钥解密出来。而这点对于理解HTTPS的整套加密、授权体系非常关键。

举个非对称加密的例子
  登录用户:小明
  授权网站:某知名社交网站(以下简称XX)
  步骤一:小明输入账号密码 ——> 浏览器用公钥加密 ——> 请求发给XX
  步骤二:XX用私钥解密,验证通过 ——> 获取小明社交数据,用私钥加密 ——> 浏览器用公钥解密并展示

用非对称加密,就能解决数据传输安全的问题了吗?前面特意强调了以下,私钥加密的数据,公钥是可以解开的。也就是说,非对称加密只能保证单项数据传输的安全性。

此外,还有公钥如何分发/获取的问题。下面会对这两个问题进行进一步的探讨。

公开密钥加密:两个明显的问题
问题一:公钥如何获取
浏览器是怎么获得XX的公钥的?当然,小明可以自己去网上查,XX也可以将公钥贴在自己的主页。然而,对于一个动不动就成败上千万的社交网站来说,会给用户造成极大的不便利,毕竟大部分用户都不知道“公钥”是什么东西。

问题二:数据传输仅单向安全
前面提到,公钥加密的数据,只有私钥能解开,于是小明的账号、密码是安全了,半路不怕被拦截。

然后有个很大的问题:私钥加密的数据,公钥也能解开。加上公钥是公开的,小明的隐私数据相当于在网上换了种方式裸奔。(中间代理服务器拿到了公钥后,毫不犹豫的就可以解密小明的数据)

下面就针对这两个问题进行解答。

概括来说,整个简化的加密流程就是:

HTTPS加密通信时序图

了解了HTTPS加密通信的流程后,对于数据裸奔的疑虑应该基本打消了。然而,细心的同学可能又有疑问了:怎么样确保证书是合法有效的?

转载者备注:经过其他资料了解,
对称密钥的获取并不是通过客户端直接发送给服务器的,
而是在握手期间客户端和服务器端经过协商,
确定加密算法后,客户端和服务器端分别生成的对称密钥。
对称密钥生成过程:(第一次握手随机数+第二次握手随机数+第三次握手随机数)+确定的加密算法=对称密钥

证书非法可能有两种情况:

  1. 证书是伪造的:压根不是CA颁发的
  2. 证书被篡改过:比如将XX网站的公钥给替换了

举个例子:
我们知道,这个世界上存在一种东西叫做代理。于是,上面小明登录XX网站可能是这样的,小明的登录请求先到了代理服务器,代理服务器再将请求转发到授权服务器。

小明 ——> 邪恶的代理服务器 ——> 登录授权服务器
小明 <—— 邪恶的代理服务器 <—— 授权服务器

如果善良的小明相信了这个证书,那他就再次裸奔了。当然不能这样,那么,是通过什么机制来防止这种事情的发生呢?

下面,我们来看看“证书”有哪些内容,然后就可以大致猜到是如何进行预防的了。

证书简介
在正式介绍证书的格式前,先插播一个小广告,科普下数字签名和摘要,然后再对证书进行非深入的介绍。

为什么呢?因为数字签名、摘要是证书防伪非常关键的武器。

数字签名与摘要
简单来说,“摘要”就是对传输的内容,通过hash算法计算出一段固定长度的串(也就是“摘要”就是通过hash算法计算出的一个hash值)。然后,再通过CA的私钥对这段摘要进行加密,加密后得到的结果就是“数字签名”。(这里提到的CA的私钥,后面再进行介绍)

明文 ——> hash运算得到摘要 ——> 私钥加密得到数字签名

结合上面的内容,我们知道,这段数字签名只有CA的公钥才能解密。

有一点需要补充下,就是:CA本身有自己的证书,俗称为“根证书”,这个“根证书”是用来证明CA的身份的,本质上是一份普通的数字证书。浏览器通常会内置大多数主流权威CA的根证书。

接下来,我们再来看看神秘的“证书”究竟包含了什么内容,然后就大致猜到是如何对非法证书进行预防的了。

证书格式

  1. 证书版本号(Version)
    证书版本号知名X.509证书的格式版本,现在的值可以为:
      1)0:v1
      2)1:v2
      3)2:v3
    也为将来的版本进行了预定义

  2. 证书序列号(Serial Number)
    序列号指定由CA分配给证书的唯一的“数字型标识符”。当证书被取消是,实际上是将此证书的序列号放入由CA签发的CRL中。这也是序列号唯一的原因。

  3. 签发机构名(Issuer)
    此域用来标识签发证书的CA的X.500 DN(DN-Distinguished Name)名字。包括:
      1)国家(C)
      2)省市(ST)
      3)地区(L)
      4)组织机构(O)
      5)单位部门(OU)
      6)通用名(CN)
      7)邮箱地址

  4. 有效期(Validity)
    指定证书的有效期,包括:
      1)证书开始生效的日期时间
      2)证书失效的日期时间
    每次使用证书时,需要检查证书是否在有效期内。

  5. 证书用户名(Subject)
    指定证书持有者的X.500唯一名字。包括:
      1)国家(C)
      2)省市(ST)
      3)地区(L)
      4)组织机构(O)
      5)单位部门(OU)
      6)通用名(CN)
      7)邮箱地址

  6. 证书持有者公开密钥信息(Subject Public Key Info)
    证书持有者公开密钥信息域包括两个重要信息:
      1)证书持有者的公开密钥的值。
      2)公开密钥使用的算法标识符。此标识符包含公开密钥算法和hash算法。

  7. 扩展项(Extension)
    X.509 V3证书是在v2的基础上一标准式或普通形式增加了扩展项,以使证书能够附带额外信息。标准扩展是指由X.509 V3版本定义的对V2版本增加的具有广泛应用前景的扩展项,任何人都可以向一些权威机构,如ISO,来注册一些其他扩展,如果这些扩展项应用广泛,也许以后会成为标准扩展项。

  8. 签发者唯一标识符(Issuer Unique Identifier)
    签发者唯一标识符在第2班加入证书定义中。此域用在当同一个X.500名字用于多个认证机构时,用一比特字符串来唯一标识签发者的X.500名字(这些名字都是由谁签发的)。可选。

  9. 证书持有者唯一标识符(Subject Unique Identifier)
    持有证书者唯一标识符在第2班的标准中加入X.509证书定义。此域用在当同一个X.500名字用于多个证书持有者时,用一比特字符串来唯一标识证书持有者的X.500 名字。可选。

  10. 签名算法标识符(Signature Algorithm)
    签名算法标识用来指定由CA签发证书是所使用的“签名算法”。算法标识符用来指定CA签发证书是所使用的:
      1)公开密钥算法;
      2)hash算法
    例如:sha256WithRSAEncryption
    须向国际知名标准组织(例如ISO)注册

  11. 签名值(Issuer's Signature)
    证书签发机构对证书上述内容的签名值。

如何辨别非法证书
上面提到,XX证书包含了如下内容:
  证书包含了对应的颁发机构CA
  证书内容本身的数字签名(用CA私钥加密)
  证书持有者的公钥
  证书签名用到的hash算法

浏览器内置的CA的根证书包含了CA的公钥(非常重要!!!)

好了,接下来讲解如何识别伪造证书以及篡改证书的场景:

完全伪造的证书
这种情况比较简单,对证书进行检查:
  1)证书颁发的机构时伪造的:浏览器不认识,直接认为是危险证书
  2)证书颁发的机构确实存在,于是根据CA名,找到对应内置的CA根证书、CA的公钥
  3)用CA公钥,对伪造的证书的摘要进行解密,发现解不了,认为是危险证书

篡改过的证书
假设代理通过某种途径,拿到XX的证书,然后将证书的公钥偷偷修改成自己的,然后喜滋滋的认为用户要上钩了。然而是在太单纯了:
  1)检查证书,根据CA名,找到对应的CA根证书,以及CA的公钥。
  2)用CA的公钥,对证书的数字签名进行解密,得到对应的证书摘要A
  3)根据证书签名使用的hash算法,计算出当前证书的摘要B
  4)对比A和B,发现不一致,判定是危险证书

上面啰啰嗦嗦讲了一大通,HTTPS如何确保数据加密传输的安全的机制基本都覆盖到了,太过技术细节的就直接跳过了。最后还有两个问题:
  1)网站是怎么把证书给到用户(浏览器)的?
  2)上面的对称密钥是怎么协商出来的?

这两个问题,其实就是HTTPS握手阶段要干的事情。HTTPS的数据传输流程整体上跟HTTP是类似的,同样包含两个阶段:握手、数据传输。
  握手:证书下发,密钥协商(这个阶段都是明文的)
  数据传输:这个阶段才是加密的,用的就是握手阶段协商出来的对称密钥

原文转载出处:最详细的HTTPS介绍

上一篇下一篇

猜你喜欢

热点阅读