1、为什么需要引入CA
由上一篇我们知道,TLS/SSL通过非对称加密码,让客户端与服务端协商出一个通过的公共密钥,然后通过这个临时的公共密钥对http的明文进行加密解密。这样是可以保证通讯的安全,但有个问题:协商密码的时候,客户端需要先知道服务端的公钥才可以通过非对称加密来协商密钥,而对服务端要求的前提是合法的服务器掌握着对应的私钥。这个问题就引发出了以下的隐患:
- 客户端 C 和服务器 S 进行通信,中间节点 M 截获了二者的通信;
- 节点 M 自己计算产生一对公钥 pub_M 和私钥 pri_M;
- C 向 S 请求公钥时,M 把自己的公钥 pub_M 发给了 C;
- C 使用公钥 pub_M 加密的数据能够被 M 解密,因为 M 掌握对应的私钥 pri_M,而 C 无法根据公钥信息判断服务器的身份,从而 C 和 M 之间建立了"可信"加密连接;
- 中间节点 M 和服务器S之间再建立合法的连接,因此 C 和 S 之间通信被M完全掌握,M 可以进行信息的窃听、篡改等操作。
另外,服务器也可以对自己的发出的信息进行否认,不承认相关信息是自己发出。
因此该方案下至少存在两类问题:中间人攻击和信息抵赖。
Paste_Image.png解决上述身份验证问题的关键是确保获取的公钥途径是合法的,能够验证服务器的身份信息,为此需要引入权威的第三方机构 CA。CA 负责核实公钥的拥有者的信息,并颁发认证"证书",同时能够为使用者提供证书验证服务,即 PKI 体系。
2、CA与身份认证的原理
要理解CA是怎么进行安全的认证需要先了解一个事情:多数浏览器开发商在发布版本时会事先植入常用认证机构(CA)的的公钥。
基本的原理为,CA 负责审核信息,然后对关键信息利用私钥进行"签名",公开对应的公钥,客户端可以利用公钥验证签名。CA 也可以吊销已经签发的证书,基本的方式包括两类 CRL 文件和 OCSP。CA 使用具体的流程如下:
1.服务端生成公钥私钥对,确认申请信息,生成请求文件(不包含私钥)并向CA申请认证
2.CA会对服务端的申请进行线上线下的校验,核实主体是否为真实存在,企业是否合法等
3.CA审核通过会向服务端签发一份文件---即证书
- 证书包含了服务端的公钥,签发的CA,有效时间,域名等明文信息
- 把明文通过hash函数生成摘要,CA用自己的私钥对摘要进行加密生成签名
4.服务端收到证书并保存
5.客户端向服务端发送请求,服务端会先把证书返回给客户端
6.客户端 C 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应** CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即服务端的公钥**合法
7.客户端然后验证证书相关的域名信息、有效时间等信息
8.客户端会内置信任 CA 的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA 的证书,证书也会被判定非法
在这个过程注意几点:
- 申请证书不需要提供私钥,确保私钥永远只能服务器掌握;
- 证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;
- 内置 CA 对应的证书称为根证书,颁发者和使用者相同,自己为自己签名,即自签名证书;
- 证书=公钥+申请者与颁发者信息+签名;
网友评论