数字证书及CA常识介绍

前言
自从苹果要求所有开发者在2017年1月1日前,要开启ATS功能(App Transport Security)来强制App在链接web服务的时候通过HTTPS链接而不是HTTP,以此来保护用户数据在传输过程中的安全。然后还有Mozilla决定停止信任沃通和StartCom证书,以及最近测试调试需要能看到https传输内容(可以通过wireshark和charles以及Fiddler来显示https的传输内容).
虽然能用这些工具看到https的传输内容,但是我对这些CA相关的东西不是很懂。
所以觉得有必要给自己扫盲CA证书的基础知识。
本文就是博主自己去查阅资料并整理相关的知识点来梳理这些关系,如果哪里不对或者理解错误还希望能帮忙指出。如果能给出文档出处的链接,感恩。

目录结构

  • 举个栗子
  • 专业术语
  • 证书作用
  • 总结

举个栗子

因为证书体系的相关知识比较枯燥、晦涩。所以先用个通俗易懂的栗子来说明这个身份认证机制。

普通的情书

想必大家都写过情书或听说过写情书吧?
假设家在东边的Jack要表达对家在西边的Rose的思念之情,遂决定写一封情书(情书的内容:一日不见,如三秋兮.)随便找了个要去西边的送信人(Old Wang)带给Rose。
概括下这个场景的需求:Jack能将一日不见,如三秋兮的思念之情传达给Rose。

  • 期望的寄送过程

    Old Wang将信完整(也没有偷窥信件的内容)送到Rose手上,Rose看完信后很开心。

  • 实际上寄送过程可能是这样子的

    • Old Wang出于好奇偷窥了信件的内容,然后再送到Rose手上,Rose看完信后很开心。
    • Old Wang刚好是Rose家隔壁的,他不仅偷窥了信件的内容,还修改了信件的内容为:我不喜欢你了,分手吧,然后再送到Rose手上。Rose看完信后很伤心。Rose写了封信询问Jack为什么,然后让Old Wang送到Jack手上,Old Wang故技重施又修改了信件的内容。最后Old Wang通过这种在送信过程中修改信件内容成功让Jack和Rose分手,并趁虚而入成为了Rose男朋友。

从上面的描述来看问题是出现在送信人的身上,但即使找个正义、正直的送信人也有可能在送信的途中信件被Old Wang调包。所以问题就变怎样让收到手的信件证明它就是Jack寄来给Rose(或Rose寄给Jack的)!如果能证明这封信件确实是Jack写给Rose(或Rose写给Jack的)。
某些爱思考的同学会问了,那如果送信人被杀了岂不是送不到?就算信件能送到Rose手并且证明了信件确实是Jack所写的但也有可能已经被偷窥了啊喂?
阿席巴!爱思考的童鞋说的极是,是我前提没说好。关于偷窥的事情其实是为了https做铺垫的,我们这里现在主要是介绍数字证书和CA的常识,所以关键的地方就是:证明xx东西确实是xx东西。用例子里面的话说就是:证明Jack情书确实是Jack情书(即情书确实是Jack所写,并且没有被篡改过)。因为我们需求就是:Jack能将一日不见,如三秋兮的思念之情传达给Rose。

有加盖章的情书

好,回到刚才的栗子。那怎么证明这封信件是Jack寄给Rose的呢?常用的办法就是在信件上敲上Jack的印章。,这样子当Rose收到情书一看上面的印章是Jack的,Rose就相信这封信件确实是Jack所发来的。那这个印章就是用来证明这个被送达的情书信件确实是Jack写给Rose的情书信件的东西。
说到这,爱思考的童鞋又会问了:万一Jack的印章是伪造的,怎么办捏?
就喜欢爱思考的童鞋。在此栗子中,我先声明,先假设印章是难以伪造的,不然只能凉拌了

引入镖局的情书

好,回到刚才的话题。如果Rose是个很受欢迎的大美女,并且还是单身(假设Jack还不是Rose的男朋友),有着一大堆追求者(Jack,Jack1,Jack2,Jack3),那么Rose就要很烦恼了。因为她要记得住每个Jack的印章是什么样子的,不然弄混了或者其中有个印章被Old Wang调包都不知道,非常的消耗脑容量。
所以我们的镖局发现了这个商机。开设了一项代理送信的业务。

那么剧情的发展就是:家在东边的Jack要表达对家在西边的Rose的思念之情,遂决定写一封情书(情书的内容:一日不见,如三秋兮.)于是去镖局签订镖单(镖单上盖了镖局的印章(镖章)和Jack的印章(J章))并写明:镖章信任J章(即J章确实是Jack的而不是Jack1或者其他人的)让镖局负责把信件(信件上盖了Jack的印章)带给Rose,然后Rose从镖师手中拿到镖单和信件,先验证镖单上的镖章是否是真的,确认是真的以后再对比镖单上的J章和信件伤的J章是否是一致的如果是一致的就认为这确实是Jack写来的信件。
说到这,爱抬杠的同学会反驳问:万一镖局是假的或者镖章是假的,咋办捏?在此,我先声明,在本例中,先假设镖局和镖章都是是难以假冒的,否则我的故事没法说下去,还是只能凉拌了

专业术语

萝莉啰嗦了半天,终于举完了一个我自认为比较通俗易懂的栗子。如果看到这,你还是不知道这个栗子在说啥。那下面的内容,可以不用浪费时间看了。
先把上面的栗子和相关的名词做个解释。

  • 什么是证书?
    “证书”(digital certificate;public key certificate)(专业的解释看证书)
    它是用来证明xx东西确实是xx东西的一个东西。用上面的栗子来说就是印章。通过镖章,可以证明这个人(镖单)确实是镖局的,通过J章可以证明这封信件确实是Jack所写的。
    理论上,人人都可以自己做印章,即人人都可以自己做个证书。那如何防止Old Wang自己制作J章来骗Rose,即如何防止坏人自己制作证书出来骗人呢?这就要涉及到CA了。
  • 什么是CA?
    CA是Certificate Authority的缩写,也叫证书授权中心(专业的解释看CA)
    它是负责管理和签发证书的第三方机构,拿栗子里面的来说这个——CA就是镖局。一般来说,CA必须是所有行业和所有公众都信任的、认可的。因此它必须具有足够的权威性。就好比Jack和Rose必须信任镖局,才会找镖局作为印章的中介。
  • 什么是CA证书?
    CA证书,顾名思义,就是CA颁发的证书。
    前面说了,人人都可以自己制作证书,但是你自己制作出来的证书是没有用的最多只能在自己的内部流通使用,因为你不是权威的CA机构,你自己弄的证书不具备权威性其他人是不认同你的。
    拿栗子来说,就是(假设Jack去了Old Wang假扮的镖局寄信件)Old Wang自己刻了一个镖章,盖到镖单上,然后送到Rose手中,但是Rose一看镖章不是镖局的,知道是假的镖局,就不理睬了。Old Wang的阴谋就没法继续了。
    如若没有特殊说明,后面提及的证书都是指CA证书。
  • 什么是证书之间的信任关系?
    就是用一个证书来证明另外一个证书是真的。就好比栗子中镖单上盖了镖章和J章,并注明镖章信任J章是类似的。
  • 什么是证书信任链?
    因为证书之间的信任关系是可以嵌套的,所以会存在一个叫做证书的信任连的关系。比如镖局没空送信,于是找了投递员A1并做了镖章信任A1章,投递员A1也没空送信,于是找了投递员A2并做了A1章A2章…这个就叫做证书的信任链。只要你信任链上的第一个证书,那么链上在第一个以后的证书,都是可以信任的。
  • 什么是根证书?
    根证书root certificate(专业的解释看root certificate)
    为了说清楚根证书是什么,我再来举个复杂的栗子。
    假设你要买iPhone,你会去苹果的官网买,然后在官网(A)看见说可以直接去本地的直营店买因为官网指定了信任本地的直营店(A1)。因为你信任苹果的官网,所以你去它指定的本地直营店买,然后你在直营店买了iPhone,然后你可能还要买手机壳和蓝牙耳机和贴膜。于是问了直营店(A1)哪里能买手机壳、蓝牙耳机、贴膜,于是直营店告诉你(A1)信任xx手机壳专卖店(B1)、(A1)信任xx蓝牙耳机专卖店(C1)、(A1)信任xx贴膜专卖店(D1)。然后因为这个信任链接(A信任A1,A1信任B1,A1信任C1,A1信任D1)你去了xx手机壳专卖店、xx蓝牙耳机专卖店、xx贴膜专卖店购买对应的东西。(当然D1还能继续往下信任,比如D1信任E2:一个祖传贴膜技术的小哥)
    上面说的这些A、A1、B1、C1、D1、E2它们之间构成了个树形的关系。
    如果画成图就是一个树形的关系图,有机会再画。
    那么处于树根的位置的证书,就是所谓根证书。出了根证书,其他的证书都需要它的上一级证书来证明自己是可信任的证书。爱思考的同学可能就会马上追问:其他证书都需要上一级证书来证明自己是可信任的,那么根证书呢?它可是位于最顶上的没有上一级证书来证明它。
    哈哈,没错,没有其他证书能证明根证书是可信任的,所以根证书是自己证明自己是可信任的(即根证书不需要证明)。
    哈哈。马上有同学会想到。那如果根证书出了问题(不可信任了),那么整个证书链上的证书都是不可信任的。就好像多米诺骨牌牌一样第一个倒下,后面的都是要跟着倒下的。
    补充:根证书是CA认证中心给自己颁发的证书,是信任链的起始点。
    所以如果根证书是不可信任的,那说明这个CA认证中心是不可信任的,不是权威的。从这里应该可以看出根证书是自己证明自己是可信任的。

证书作用

CA证书的作用有很多,我就列出我接触比较多的2个。

  • 验证网站是否可信(针对https)(是否是真的官网)
    平时我们访问一些对数据比较敏感的网页(比如登录页面),在地址栏上会出现一把绿色的🔒,其使用的的协议是https而不是http。因为http协议是明文传输的,一旦有坏蛋在嗅探你的网络通讯,ta就能看到你传输的内容(密码账号啥的);而https是加密后的http,这个可以保证你的传输过程无法被坏蛋偷窥。
    but,不要认为 有了加密就可以高枕无忧了。假设有个坏蛋,弄了个假的网银的站点,然后你不小心上了这个站点。然后你有很不小心吧账号和密码都输入了。那这个坏蛋就能拿到你的账号密码了。(不是说有加密了吗?怎么还是能拿到?因为这个加密是你和站点协商好的,站点是能解密出来的)
    所以为了防止坏蛋使用这种招数,HTTPS除了有加密机制,还有一个证书机制。通过证书来确保,你正在链接的站点是可信任的站点。
    补充:每个浏览器都会内置一些它信任的根证书
    在使用浏览器购买火车票的时候,地址栏的https是不是会划红线。点击红线前面的🔒会弹出过一个框:kyfw.12306.cn,此网站使用了安全系数较低的安全配置,因此您的连接可能不具有私密性。
    会出现这个的原因是12306使用的证书并没有包含在浏览器内置的根证书里面,也就是说12306使用的是不可信的证书,浏览器才会提示出上面的警告。所以,如果你以后上某个知名的网站,发现浏览器跳出上述警告,就要小心了。

    12306

  • 验证文件是否可信(是否被篡改)
    待完善

    总结

    待完善

Zerlz wechat
扫码关注一个很懒的程序员!
Winter is coming, give me a penny!