课程咨询 :13623629309

太原PHP培训 > 达内新闻 > 太原php培训:HTTPS 科普扫盲帖(2)
  • 太原php培训:HTTPS 科普扫盲帖(2)

    发布:太原PHP培训      来源:达内新闻      时间:2016-09-14

  • 证书可能存在哪些问题

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

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

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

    举个例子:

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

    小明 –> 邪恶的代理服务器 –> 登陆授权服务器
    小明

    然后,这个世界坏人太多了,某一天,代理服务器动了坏心思(也有可能是被入侵),将小明的请求拦截了。同时,返回了一个非法的证书。

    小明 –> 邪恶的代理服务器 –x–> 登陆授权服务器
    小明 登陆授权服务器

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

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

    证书简介

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

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

    数字签名与摘要

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

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

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

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

    数字签名、摘要进一步了解可参考 这篇文章

    证书格式

    先无耻的贴上一大段内容,证书格式来自这篇不错的文章《OpenSSL 与 SSL 数字证书概念贴

    内容非常多,这里我们需要关注的有几个点:

    1. 证书包含了颁发证书的机构的名字 — CA
    2. 证书内容本身的数字签名(用CA私钥加密)
    3. 证书持有者的公钥
    4. 证书签名用到的hash算法

    此外,有一点需要补充下,就是:

    1. CA本身有自己的证书,江湖人称“根证书”。这个“根证书”是用来证明CA的身份的,本质是一份普通的数字证书。
    2. 浏览器通常会内置大多数主流权威CA的根证书。

    证书格式

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

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

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

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

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

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

    7. 证书持有者公开密钥信息(Subject Public Key Info)
    证书持有者公开密钥信息域包含两个重要信息:
    1) 证书持有者的公开密钥的值
    2) 公开密钥使用的算法标识符。此标识符包含公开密钥算法和hash算法。
    8. 扩展项(extension)
    X.509 V3证书是在v2的基础上一标准形式或普通形式增加了扩展项,以使证书能够附带额外信息。标准扩展是指
    由X.509 V3版本定义的对V2版本增加的具有广泛应用前景的扩展项,任何人都可以向一些权威机构,如ISO,来
    注册一些其他扩展,如果这些扩展项应用广泛,也许以后会成为标准扩展项。

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

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

    11. 签名算法(Signature Algorithm)
    证书签发机构对证书上述内容的签名算法
    example: sha256WithRSAEncryption

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

    如何辨别非法证书

    上面提到,XX证书包含了如下内容:

    1. 证书包含了颁发证书的机构的名字 — CA
    2. 证书内容本身的数字签名(用CA私钥加密)
    3. 证书持有者的公钥
    4. 证书签名用到的hash算法

    浏览器内置的CA的根证书包含了如下关键内容:

    1. CA的公钥(非常重要!!!)

    好了,接下来针对之前提到的两种非法证书的场景,讲解下怎么识别

    完全伪造的证书

    这种情况比较简单,对证书进行检查:

    1. 证书颁发的机构是伪造的:浏览器不认识,直接认为是危险证书
    2. 证书颁发的机构是确实存在的,于是根据CA名,找到对应内置的CA根证书、CA的公钥。
    3. 用CA的公钥,对伪造的证书的摘要进行解密,发现解不了。认为是危险证书

    篡改过的证书

    假设代理通过某种途径,拿到XX的证书,然后将证书的公钥偷偷修改成自己的,然后喜滋滋的认为用户要上钩了。然而太单纯了:

    1. 检查证书,根据CA名,找到对应的CA根证书,以及CA的公钥。
    2. 用CA的公钥,对证书的数字签名进行解密,得到对应的证书摘要AA
    3. 根据证书签名使用的hash算法,计算出当前证书的摘要BB
    4. 对比AA跟BB,发现不一致–> 判定是危险证书

    HTTPS握手流程

    上面啰啰嗦嗦讲了一大通,HTTPS如何确保数据加密传输的安全的机制基本都覆盖到了,太过技术细节的就直接跳过了。

    最后还有最后两个问题:

    1. 网站是怎么把证书给到用户(浏览器)的
    2. 上面提到的对称密钥是怎么协商出来的

    上面两个问题,其实就是HTTPS握手阶段要干的事情。HTTPS的数据传输流程整体上跟HTTP是类似的,同样包含两个阶段:握手、数据传输。

    1. 握手:证书下发,密钥协商(这个阶段都是明文的)
    2. 数据传输:这个阶段才是加密的,用的就是握手阶段协商出来的对称密钥

    阮老师的文章写的非常不错,通俗易懂,感兴趣的同学可以看下。

    达内时代科技集团致力于培养面向电信和金融领域JavaC++C#/.Net3G/Android3G/IOSPHP、嵌入式、软件测试、UID、网络营销、网络工程、会计、UEDwebUnity3D、大数据、童程童美等17大方向中高端软件人才课程与少儿教育课程。选择太原php培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!想找工作的求职者可以加QQ3373924515(太原达内就业服务部)咨询了解。

上一篇:太原php培训班:HTTPS 科普扫盲帖(1)

下一篇:太原php培训班:在 CentOS 7.x / Fedora 21 上面体验 PHP 7.0

最新开班日期  |  更多

php高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-29

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-29

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-29

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-29

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56

    在线客服系统