目录
1. 案例引入
普通的介绍信:
假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,他咋办捏?常用的办法是带 A 公司开的一张介绍信,在信中说:兹有张三先生前往贵公司办理业务,请给予接洽......。然后在信上敲上A公司的公章。
张三先生到了 B 公司后,把介绍信递给 B 公司的前台李四小姐。李小姐一看介绍信上有 A 公司的公章,而且 A 公司是经常和 B 公司有业务往来的,这位李小姐就相信张先生不是歹人了。
说到这,有同学会问了:万一公章是伪造的,咋办?在此先声明,在本例中,先假设公章是难以伪造的。
引入中介机构的介绍信:
如果和 B 公司有业务往来的公司很多,每个公司的公章都不同,那前台就要懂得分辨各种公章,非常麻烦。所以,有个中介公司 C 发现了这个商机。C公司专门开设了一项“代理公章”的业务。
今后,A 公司的业务员去 B 公司,需要带2个介绍信:
- 介绍信1:含有 C 公司的公章及 A 公司的公章,并且特地注明:C 公司信任 A 公司。
- 介绍信2:仅含有 A 公司的公章,然后写上:兹有张三先生前往贵公司办理业务,请给予接洽......。
某些不开窍的同学会问了,这样不是增加麻烦了吗?有啥好处捏?
主要的好处在于,对于接待公司的前台,就不需要记住各个公司的公章分别是啥样子;他只要记住中介公司 C 的公章即可。当他/她拿到两份介绍信之后,先对介绍信1的 C 公章验明正身;确认无误之后,再比对介绍信1和介绍信2的两个 A 公章是否一致。如果是一样的,那就可以证明介绍信2是可以信任的了。
2. 基本概念
2.1 什么是证书
证书就好比以上例子里面的公章。通过公章,可以证明该介绍信确实是对应的公司发出的。
理论上,人人都可以找个证书工具,自己做一个证书。那如何防止坏人自己制作证书出来骗人呢?这就需要CA
2.2 什么是CA
CA,Certificate Authority,数字证书认证中心,它是负责管理和签发证书的第三方机构,就好比例子里面的中介——C 公司
一般来说,CA必须是所有行业和所有公众都信任的、认可的。因此它必须具有足够的权威性。就好比A、B两公司都必须信任C公司,才会找 C 公司作为公章(证书)的中介。
2.3 什么是CA证书
CA 证书,顾名思义,就是CA颁发的证书。
前面已经说了,人人都可以找工具制作证书。但是一般人制作出来的证书是没啥用处的。因为你不是权威的CA机关,自己搞的证书不具有权威性。
这就好比上述的例子里,某个坏人自己刻了一个公章,盖到介绍信上。但是别人一看,不是受信任的中介公司的公章,就不予理睬。
2.4 什么是证书之间的信任关系
在案例中,引入中介后,业务员要同时带两个介绍信。第一个介绍信包含了两个公章,并注明:公章C信任公章A。证书间的信任关系,就和这个类似。就是用一个证书来证明另一个证书是真实可信的。
2.5 什么是证书信任链
实际上,证书之间的信任关系,是可以嵌套的。比如,C 信任 A1,A1 信任 A2,A2 信任 A3......这个叫做证书的信任链。只要你信任链上的头一个证书,那后续的证书,都是可以信任的。
2.6 什么是根证书
假设 C 证书信任 A 和 B;然后 A 信任 A1 和 A2;B 信任 B1 和 B2。则它们之间,构成如下的一个树形关系
处于最顶上的树根位置的那个证书,就是“根证书”。除了根证书,其它证书都要依靠上一级的证书来证明自己。那谁来证明“根证书”可靠呢?实际上,根证书自己证明自己是可靠的(换句话说,根证书不需要被证明)。所以:根证书是整个证书体系安全的根本
3. 证书的生成和使用
申请者提交自己的公钥和一些个人信息(如:申请者国家、省份、城市、单位、域名、邮箱等)给CA,CA对申请者的这些信息单向加密生成摘要信息,然后使用CA的私钥加密整个摘要信息,这样就得到了CA对申请者的数字签名。在数字签名上再加上CA自己的一些信息(如CA的机构名称,CA层次路径等)以及该证书的信息(如证书有效期限),就得到了所谓的数字证书。
过程如下所示:
如果用户信任了某个CA,就可以获取了该CA的公钥(实际上信任CA的其中一个作用就是获取CA公钥),使用该公钥解密数字证书就可以验证申请者的信息以及申请者公钥的可靠性(申请者的公钥只被CA的私钥加密,解密该私钥后只是需要验证可靠性)。
这里的关键是CA使用自己的私钥给申请者加密,那么如何保证CA是可信并且合法的呢?根CA是通过自签署数字证书的方式标榜自己的可信性和合法性,第一级子CA由根CA颁发合法数字证书,第二级直至所有的子CA都由上一级子CA颁发数字证书。对于多级子CA只需要信任根CA即可,因为获取了根CA的公钥,可以解密第一级子CA的证书并获取验证第一级子CA的公钥,层层递进,最终获取到为申请者颁发数字证书的机构并获取它的公钥。
另一种情况,虽然信任了根CA,但如果根CA授权的某个二级或者某个二级授权的三级CA不在信任列表中,就需要将这个中间的CA补齐,否则中间出现断层,无法成功解密该中间CA颁发的证书。通常这种中间CA的证书称为chain证书,例如"xxx.com.chain.crt"。如果购买的证书发给你的文件中包含了chain.crt文件,则说明他是中间CA,且有些浏览器或操作系统中没有内置它的CA,这时应该将chain证书也配置到web server上。
信任CA后,每次接收到需要解密的数字证书时,还要去该颁发机构指定网站的证书吊销列表(CRL)中查询该证书是否被吊销,对于吊销后的证书应该不予以信任,这是信任CA的第二个作用。导致证书被吊销的可能性不少,例如申请者的私钥被黑客获取,申请者申请吊销等。
也有公司使用自签的证书,例如某些银行、12306有时候就要求下载证书并安装。使用自签证书的好处当然是省钱、方便啦。
4. 证书文件后缀
对于 X.509 标准的证书有两种不同编码格式:
- 采用 PEM 编码就以 .pem 作为文件扩展名,以“ - BEGIN ...”前缀的ASCII(Base64)数据。
- 采用 DER 编码就以 .der 作为文件扩展名,二进制DER编码证书
其实PEM就是对DER的内容做了base64的编码并做了一下格式化的输出而已。
但常见的证书扩展名还包括 .crt、.cer、.p12 等,他们采用的编码格式可能不同,内容也有所差别,但大多数都能互相转换,总结如下:
- .pem:采用 PEM 编码格式的 X.509 证书的文件扩展名;
- .der:采用 DER 编码格式的 X.509 证书的文件扩展名;
- .crt:即 certificate 的缩写,常见于类 UNIX 系统。可能是 PEM 编码,也可能是 DER 编码,但绝大多数情况下此格式证书都是采用 PEM 编码;
- .cer:也是 certificate 的缩写,常见于 Windows 系统。可能是 PEM 编码,也可能是 DER 编码,但绝大多数情况下此格式证书都是采用 DER 编码
- .p12:也写作 .pfx,全称:PKCS#12,是公钥加密标准(Public Key Cryptography Standards,PKCS)系列的一种,它定义了描述个人信息交换语法(Personal Information Exchange Syntax)的标准,可以用来将包含了公钥的 X.509 证书和证书对应的私钥以及其他相关信息打包,进行交换。简单理解:一份.p12文件 = X.509证书 + 私钥;
- .csr:Certificate Signing Request 的缩写,即证书签名请求,它并不是证书的格式,而是用于向权威证书颁发机构 CA 获得签名证书的申请,其核心内容包含一个 RSA 公钥和其他附带信息。在生成这个 .csr 申请的时候,同时也会生成一个配对 RSA 私钥,私钥通常需要严格保存于服务端,不能外泄。
- .key: 通常用来存放一个 RSA 公钥或者私钥,它并非 X.509 证书格式,编码同样可能是 PEM,也可能是 DER
5. 证书标准X.509
简而言之:X.509标准的证书是公钥证书,只有公钥。
5.1 X.509证书内容
x.509标准规定了证书可以包含什么信息,并说明了记录信息的方法。
例如:
Linux下:
Windows下:
5.2 PKCS#7和PKCS#12
X.509是数字证书的规范,PKCS#7和PKCS#12是两种封装形式。比如说同样的电影,有的是avi格式,有的是mpg+
6. CA证书和用户证书的区别
从功能上看:
- CA证书可以颁发下级证书或进行签名
- 用户证书不能为下级颁发证书或签名
从文件内容上看:
① basicConstraints:该扩展项用于决定证书是否可以当作CA证书。格式为basicConstraints=CA:true | false
- 如果CA的flag设置为true,那么该证书允许作为一个CA证书,即可以颁发下级证书或进行签名;
- 如果CA的flag设置为false,那么该证书就不能作为CA,;
- 如果basicConstraints扩展项未设置,那么证书被认为可疑的CA,即"possible CA"。
② keyUsage:该扩展项用于指定证书额外的使用限制,即也是使用目的的一种表现方式。
- 如果keyUsage扩展项被指定,那么该证书将又有额外的使用限制。
- CA证书文件中必须至少设置keyUsage=keyCertSign,即:表示此证书功能可以签署其他证书
- 如果设置了keyUsage扩展项,那么不论是否使用了critical,都将被限制在指定的使用目的purpose上。