CA 机构是如何保护自己私钥的？
无意中翻到这个老问题，随手在中英文互联网上搜了一圈之后，我意外发现没几个人对数字证书颁发机构（Certificate Authority，CA）的安全机制有个基本概念，更不要提各种具体的保护措施了。作为整个通信加密领域举足轻重的存在，大家只是默认“这个东西很安全”，但却很少有人仔细讨论它到底有多安全，这不得不说是一件很迷的事情。所以今天我就开一篇回答，聊聊CA是如何保护自己的私钥不被窃取的。 在这里先给不了解公钥加密体系的读者做一个简短的科普吧。所谓的CA，通俗来说就是担保人，互联网上所有身份的担保人。 比如说Google需要向用户证明自己是Google，那么Google就需要找到一家靠谱的CA，请工作人员核对各项手续和身份证明，然后为Google签发一张数字证书（Certificate）。在证书上,记载着Google的所有身份信息，和一个CA签下的数字签名（Signature）。 而CA的私钥（Private Key），是用来签名的一段二进制数据，通俗来说就是CA手里的那根签字笔。一旦这根签字笔外泄出去，那么攻击者就能够随心所欲地签发任何证书，伪装成Google、微软、中国银行等任何一家公司/机构，直接颠覆整个互联网的信用体系。用户将无法分辨网线对面到底是银行还是黑客，只能任人宰割，这可以说是不亚于“互联网崩溃”级别的大地震。 （当然，前提是这些公司没有启用HPKP协议，但是这个话题有些超纲了。） 以下讨论的主要是DigiCert（目前世界最大的证书颁发机构之一）当前施行的保护机制，其他证书颁发机构与它相比可能会有一定出入，但是不会偏差太大。 DigiCert当前的安全机制主要由四层组成： 在本科阶段的密码学教材里面，为了便于理解，课本上一般会说数字证书是向CA申请之后，由CA直接颁发的。但在现实生活中，申请者是根本没机会见到CA的，申请者见到的是一个名为RA的中介层。 RA扮演的角色相当于是一个防火墙或者说签证官，所有的申请都要先交给RA。审核通过之后，申请才会被上呈到CA手里等待确认。在CA和RA之间，存在一条双向认证的保密信道。只有手握RA私钥的人，才会被当做RA来对待，才有资格向上提交申请。这就保证了CA的通信接口不会直接对外暴露，减少了防守方的工作压力。 由于RA仅仅是一个联络员，手里保存的信息相对没那么敏感，所以RA的安保措施也就相对简单： 想要攻击CA，RA就是第一道拦路虎。在这个位置，攻击者一般有三种思路： 前两条思路算是超纲了，在本条回答里姑且略去不提。而如果采取第三条思路的话，就要接着面对下一道防护体系了。 CA的物理防护机制着重于保护以下三个场所： 一：数据中心 听到数据中心这个词，是不是就以为这是存放CA私钥的地方啊？不好意思，CA私钥这个东西实在是太敏感了。哪怕是顶尖的商用数据中心，也是没资格存放CA私钥的。数据中心扮演的角色，仅仅相当于一个操作台。操作者可以从这里把操作提交上去，等待签发室签字。 但是，仅仅操作台也已经够敏感了。攻击者掌握这里之后完全可以签发自己的证书，只是会留下记录而已。所以对于数据中心，DigiCert采用如下规格的保护措施： 另外，每个数据中心都有专人进行持续的维护，一旦有某个数据中心出现维护中断的状况，那么DigiCert将会第一时间派人前去数据中心进行四项检查： 检查完成后，进行检查的管理员必须一一签字，并且登记审核人身份。 二：CA私钥离线存放室 好，终于到了重中之重了。 在最开始的科普里我提到过，私钥就是一段二进制数据，这听起来是不是很脆弱？黑客溜进某台机器里面，就可以神不知鬼不觉地复制走这段数据，然后海阔凭鱼跃天高任鸟飞，想怎么快活怎么快活。题主大概也是想到了这一点，所以在题目里问：“私钥是不是被某个拥有至高无上权力的人记在大脑里了？” 然而，目前RSA私钥需要起码2048位，ECDSA私钥需要起码384位。这么长的二进制数字，背错一位就全废了，没人担得起这个责任。更不用说每次还要背出来打到电脑里，这个过程就十分危险，会留下很多条潜在的攻击路径。 所以事情肯定不可能是这么来的。 CA手里，有一台神奇的机器，被称作加密模组（Cryptomodule）。这个机器的特点在于，它把加密解密相关的所有功能全部包揽了。所有的私钥，都直接在这台机器里生成；在这台机器里存储；在这台机器里参与计算。所有的敏感数据都直接锁在这台机器里加密解密，CA私钥这个东西，从生到死，不会有任何机会离开这台机器。哪怕你把这台机器拆了，里面的存储器也有特殊的封装技术和加密保护，任何人都没法轻易把里面的内容读出来。 从某种意义上讲，加密模组就是私钥本身，就是题主想象中的那个“至高无上的权力者”。除了把加密模组这整台机器拆掉或者搬走之外，基本上没有任何其他办法能拿到里面的私钥。这样一来，只要保护好加密模组，私钥的安全性就有保证了。 在这点上，DigiCert具体采取的安全措施是： 顺便一提，这个加密模组可不是随便做做就完事的。美国联邦政府甚至专门为加密模组制定了一份69页的技术标准FIPS 140-2，详细划分了四个不同的安全等级和相应要求，重要设施采用的加密模组一般Level 2起步。 三：私钥生成室与证书签发室 一般来讲，私钥生成与证书签发可以直接在私钥存放点进行。但是如果有特殊情况的话，也可以在另一间同等安全性的房间里完成。在私钥生成和模组激活的过程中，需要保证最少两名操作员时刻关注着设备的情况。 模组激活之后，签发证书的流程则分为两种，一种是人工确认签发，一种是机器自动签发。这两种签发方式，分别对应两种不同级别的私钥：根CA私钥（Root CA Private Key）和中间CA私钥（Intermediate CA Private Key）。 那么这两种CA有什么区别呢？ 在前文里我们提到过，所谓的CA其实就是担保人，它们的作用主要是担保其他人的身份。可是，如果我们使用同一枚私钥，直接担保所有人的身份的话，一旦这枚私钥损坏或丢失，就会造成很大的问题。 所以目前比较成熟的CA机构采取的都是这样一种分层结构：根CA负责担保所有中间CA的身份，而中间CA则负责担保Google、Facebook等外部公司的身份。 这样一来，一旦中间CA的私钥出现了严重的问题，如损坏、失窃等，CA机构就可以用根CA迅速创建一个新的中间CA私钥，把出问题的旧私钥换掉。 由于这种情况出现的频率很低，中间CA续签证书也往往以数十年为期，所以根CA很少有派上用场的时候，属于轻易不会用上的“重器”，用它签发证书往往需要两名操作员人工确认。 而中间CA的业务则相对比较繁忙，它激活后往往直接和数据中心相连，可以很方便地在线签发各类证书。另外，它的每次签发都会在日志系统中留下记录，以便之后进行安全审计。 既然CA物理上讲这么难以渗透的话，可不可以混入或者收买内部的工作人员呢？可以，但是很难。 DigiCert的CA工作人员大致可以分为三类： 任何一项操作，都必须要由一名CA管理员和一名相应的操作员共同完成。内部审查员无权做出任何操作，但是会在事后对操作记录进行审查。也就是说，CA进行任何一项操作，都要牵扯到最少三名工作人员，要收买就必须一口气买齐。 除此之外，DigiCert的工作人员每十年就要遭受一次严苛的背景调查，调查他们过去三年的居住经历，以及过去五年的工作经历、教育经历、犯罪记录等等。而且，最关键的几个工作岗位必须交给美国公民。（咳，看出来DigiCert的屁股坐哪边了吧？） 至于DigiCert员工需要定期接受安全培训这点，我个人怀疑其实没什么用。毕竟大公司的安全培训一般翻来覆去就那么一段，员工多做几次之后闭着眼睛都能过考试，实际操作中反而未必会按照培训来。 哪怕你最后成功骗取几位DigiCert员工为你卖命，把设备偷了出来/签发了假证书，你以为你就万事大吉了吗？没有。 DigiCert的所有操作都是有日志记录的，而且日志设备只可追加不可修改，你根本没法抹消自己的操作日志。每两个月，DigiCert都会遣专人审计日志。每条操作日志都会离线保存至少七年，以便在有人东窗事发之后进行追查。 更变态的是，如果攻击者通过某种手段，强行让日志系统瘫痪的话，那么整个RA、CA系统就会全部停机。换句话说，如果你的操作留不下记录，那么你就别想做任何操作。 有了这层保险之后，任何人，哪怕收了天价的贿赂，做事前也必须掂量掂量。除非那个贿赂者真的手眼通天，通天到了整个DigiCert都不得不老老实实听话的地步，才有可能破坏这套安全体系。 好了，知道了这四层防护体系，是不是已经对攻击证书颁发机构感到跃跃欲试了？请请请，五年起步上不封顶。  觉得本文有价值的话，欢迎点个赞支持一下。对信息安全感兴趣的同学，也欢迎阅读我写的其他信息安全科普类文章：