作者:Gh0u1L5
链接:https://www.zhihu.com/question/22260090/answer/648910720
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

无意中翻到这个老问题,随手在中英文互联网上搜了一圈之后,我意外发现没几个人对数字证书颁发机构(Certificate Authority,CA)的安全机制有个基本概念,更不要提各种具体的保护措施了。作为整个通信加密领域举足轻重的存在,大家只是默认“这个东西很安全”,但却很少有人仔细讨论它到底有多安全,这不得不说是一件很迷的事情。所以今天我就开一篇回答,聊聊CA是如何保护自己的私钥不被窃取的。


科普:CA是什么?私钥又是什么?

在这里先给不了解公钥加密体系的读者做一个简短的科普吧。所谓的CA,通俗来说就是担保人,互联网上所有身份的担保人。

比如说Google需要向用户证明自己是Google,那么Google就需要找到一家靠谱的CA,请工作人员核对各项手续和身份证明,然后为Google签发一张数字证书(Certificate)。在证书上,记载着Google的所有身份信息,和一个CA签下的数字签名(Signature)

而CA的私钥(Private Key),是用来签名的一段二进制数据,通俗来说就是CA手里的那根签字笔。一旦这根签字笔外泄出去,那么攻击者就能够随心所欲地签发任何证书,伪装成Google、微软、中国银行等任何一家公司/机构,直接颠覆整个互联网的信用体系。用户将无法分辨网线对面到底是银行还是黑客,只能任人宰割,这可以说是不亚于“互联网崩溃”级别的大地震。

(当然,前提是这些公司没有启用HPKP协议,但是这个话题有些超纲了。)


正题:CA如何保护自己的私钥

以下讨论的主要是DigiCert(目前世界最大的证书颁发机构之一)当前施行的保护机制,其他证书颁发机构与它相比可能会有一定出入,但是不会偏差太大。

DigiCert当前的安全机制主要由四层组成:

第一层保护:注册机构(Registration Authority,RA)

在本科阶段的密码学教材里面,为了便于理解,课本上一般会说数字证书是向CA申请之后,由CA直接颁发的。但在现实生活中,申请者是根本没机会见到CA的,申请者见到的是一个名为RA的中介层。

RA扮演的角色相当于是一个防火墙或者说签证官,所有的申请都要先交给RA。审核通过之后,申请才会被上呈到CA手里等待确认。在CA和RA之间,存在一条双向认证的保密信道。只有手握RA私钥的人,才会被当做RA来对待,才有资格向上提交申请。这就保证了CA的通信接口不会直接对外暴露,减少了防守方的工作压力。

由于RA仅仅是一个联络员,手里保存的信息相对没那么敏感,所以RA的安保措施也就相对简单:

  • 出入办公区域需要刷门禁卡,出入记录会登记在安保系统里。
  • 大楼的内外走廊、审批室与其他办公区域都会装备动作感应装置与摄像装置。
  • 非工作时间,所有的存储器与纸质材料都会锁在保险柜中存放。

想要攻击CA,RA就是第一道拦路虎。在这个位置,攻击者一般有三种思路:

  1. 通过社会工程学骗过RA的审核,打着某公司的旗号合法申请证书。
  2. 想办法窃取到RA私钥,假扮RA向CA提交申请。
  3. 把RA晾在一边,直接想办法偷取CA的私钥。

前两条思路算是超纲了,在本条回答里姑且略去不提。而如果采取第三条思路的话,就要接着面对下一道防护体系了。

第二层保护:CA物理防护机制

CA的物理防护机制着重于保护以下三个场所:

一:数据中心

听到数据中心这个词,是不是就以为这是存放CA私钥的地方啊?不好意思,CA私钥这个东西实在是太敏感了。哪怕是顶尖的商用数据中心,也是没资格存放CA私钥的。数据中心扮演的角色,仅仅相当于一个操作台。操作者可以从这里把操作提交上去,等待签发室签字。

但是,仅仅操作台也已经够敏感了。攻击者掌握这里之后完全可以签发自己的证书,只是会留下记录而已。所以对于数据中心,DigiCert采用如下规格的保护措施:

  • 365天 x 24小时无间断的保安巡逻。
  • 任何出入数据中心的工作人员都必须通过双重认证(门禁卡+指纹虹膜等生物识别)
  • 每一次门禁记录和生物识别记录都会被双双登记到一个不可修改的日志系统里。

另外,每个数据中心都有专人进行持续的维护,一旦有某个数据中心出现维护中断的状况,那么DigiCert将会第一时间派人前去数据中心进行四项检查:

  1. 所有设备均处于正常运作状态。
  2. 所有保密容器均未遭到破坏。
  3. 门锁等物理安全装置均处于正常状态。
  4. 整个区域没有外人非法访问。

检查完成后,进行检查的管理员必须一一签字,并且登记审核人身份。

二:CA私钥离线存放室

好,终于到了重中之重了。

在最开始的科普里我提到过,私钥就是一段二进制数据,这听起来是不是很脆弱?黑客溜进某台机器里面,就可以神不知鬼不觉地复制走这段数据,然后海阔凭鱼跃天高任鸟飞,想怎么快活怎么快活。题主大概也是想到了这一点,所以在题目里问:“私钥是不是被某个拥有至高无上权力的人记在大脑里了?”

然而,目前RSA私钥需要起码2048位,ECDSA私钥需要起码384位。这么长的二进制数字,背错一位就全废了,没人担得起这个责任。更不用说每次还要背出来打到电脑里,这个过程就十分危险,会留下很多条潜在的攻击路径。

所以事情肯定不可能是这么来的。

CA手里,有一台神奇的机器,被称作加密模组(Cryptomodule)。这个机器的特点在于,它把加密解密相关的所有功能全部包揽了。所有的私钥,都直接在这台机器里生成;在这台机器里存储;在这台机器里参与计算。所有的敏感数据都直接锁在这台机器里加密解密,CA私钥这个东西,从生到死,不会有任何机会离开这台机器。哪怕你把这台机器拆了,里面的存储器也有特殊的封装技术和加密保护,任何人都没法轻易把里面的内容读出来。

从某种意义上讲,加密模组就是私钥本身,就是题主想象中的那个“至高无上的权力者”。除了把加密模组这整台机器拆掉或者搬走之外,基本上没有任何其他办法能拿到里面的私钥。这样一来,只要保护好加密模组,私钥的安全性就有保证了。

在这点上,DigiCert具体采取的安全措施是:

  • 将加密模组锁在一台双认证保险柜里,需要最少两名工作人员同时认证才能打开。
  • 启动加密模组需要一张操作卡和一台动态密码生成器,完成这两项认证才能启动机器。
  • 操作卡和生成器要么锁在一个贴着封条的箱子里,要么锁在另一个双认证保险柜里。
  • 出入存放室需要刷门禁,留下电子出入记录。打开封条和保险箱则要相互监督留下纸面记录。

顺便一提,这个加密模组可不是随便做做就完事的。美国联邦政府甚至专门为加密模组制定了一份69页的技术标准FIPS 140-2,详细划分了四个不同的安全等级和相应要求,重要设施采用的加密模组一般Level 2起步。

三:私钥生成室与证书签发室

一般来讲,私钥生成与证书签发可以直接在私钥存放点进行。但是如果有特殊情况的话,也可以在另一间同等安全性的房间里完成。

在加密模组的存取或激活过程中,需要保证最少两名操作员时刻关注着设备的情况。

第三层防护:员工管理机制

既然CA物理上讲这么难以渗透的话,可不可以混入或者收买内部的工作人员呢?可以,但是很难。

DigiCert的CA工作人员大致可以分为三类:

  • CA管理员(CA Administrator)
  • 操作员(Operator),包括RA Officer、System Engineer等
  • 内部审查员(Internal Auditor)

任何一项操作,都必须要由一名CA管理员和一名相应的操作员共同完成。内部审查员无权做出任何操作,但是会在事后对操作记录进行审查。也就是说,CA进行任何一项操作,都要牵扯到最少三名工作人员,要收买就必须一口气买齐。

除此之外,DigiCert的工作人员每十年就要遭受一次严苛的背景调查,调查他们过去三年的居住经历,以及过去五年的工作经历、教育经历、犯罪记录等等。而且,最关键的几个工作岗位必须交给美国公民。(咳,看出来DigiCert的屁股坐哪边了吧?)

至于DigiCert员工需要定期接受安全培训这点,我个人怀疑其实没什么用。毕竟大公司的安全培训一般翻来覆去就那么一段,员工多做几次之后闭着眼睛都能过考试,实际操作中反而未必会按照培训来。

第四层防护:日志审计

哪怕你最后成功骗取几位DigiCert员工为你卖命,把设备偷了出来/签发了假证书,你以为你就万事大吉了吗?没有。

DigiCert的所有操作都是有日志记录的,而且日志设备只可追加不可修改,你根本没法抹消自己的操作日志。每两个月,DigiCert都会遣专人审计日志。每条操作日志都会离线保存至少七年,以便在有人东窗事发之后进行追查。

更变态的是,如果攻击者通过某种手段,强行让日志系统瘫痪的话,那么整个RA、CA系统就会全部停机。换句话说,如果你的操作留不下记录,那么你就别想做任何操作。

有了这层保险之后,任何人,哪怕收了天价的贿赂,做事前也必须掂量掂量。除非那个贿赂者真的手眼通天,通天到了整个DigiCert都不得不老老实实听话的地步,才有可能破坏这套安全体系。


好了,知道了这四层防护体系,是不是已经对攻击证书颁发机构感到跃跃欲试了?请请请,五年起步上不封顶。

另外,对信息安全感兴趣的话,欢迎阅读我写的其他信息安全科普类文章:

[转帖] CA如何保护自己的私钥的更多相关文章

  1. 自建CA证书搭建https服务器

    由于CA收费,所以可以自建CA,通过将CA导入浏览器实现https的效果,曾经12306购票就需要自行导入网站证书. 关于https 2015年阿里巴巴将旗下淘宝.天猫(包括移动客户端)全站启用HTT ...

  2. 加密类型、数据加密解密过程以及CA创建

    对称加密算法 对称加密:加密和解密使用同一个密钥 DES:Data Encryption Standard,56bits 3DES: AES:Advanced (, , 256bits) Blowfi ...

  3. [转帖]PKI系统深入介绍

    PKI系统深入介绍 https://blog.csdn.net/liuhuiyi/article/details/7776825 2012年07月23日 20:17:01 liuhuiyi 阅读数 4 ...

  4. 自建 CA 中心并签发 CA 证书

    目录 文章目录 目录 CA 认证原理浅析 基本概念 PKI CA 认证中心(证书签发) X.509 标准 证书 证书的签发过程 自建 CA 签发证书并认证 HTTPS 网站的过程 使用 OpenSSL ...

  5. 邮件服务TLS/SSL,CA证书

     邮件服务TLS/SSL,CA证书 案例1:OpenSSL及证书服务 案例2:邮件TLS/SSL加密通信 1 案例1:OpenSSL及证书服务 1.1 问题 本案例要求熟悉OpenSSL工具的基本使用 ...

  6. PKI/CA与证书服务

    目录 PKI CA RA LDAP目录服务 CRL证书作废系统 数字证书 证书验证 证书撤销 证书更新 PKI系统的构成 PKI PKI(Public Key Infrastructure)公钥基础设 ...

  7. Https 公钥、私钥、证书

    .https的握手协议: http://blog.csdn.net/clh604/article/details/221799072.证书的概念:http://blog.csdn.net/sealya ...

  8. SSH配置私钥登陆服务器

    前言 本文基于实际Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的各种问题, ...

  9. 实现CA证书创建及客户端申请证书

    author:JevonWei 版权声明:原创作品 CA证书的相关文件路径 openssl配置文件/etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf C ...

随机推荐

  1. ionic获取表单input的值的两种方法

    1.参数传递法 直接在input处使用 #定义参数的name值,注意在ts中参数的类型 html页面: <ion-input type="text" placeholder= ...

  2. C#基础第六天

    数组 方法  实现代码的重用  参数  返回值  注释  return 语法:[public] static 返回值类型 方法名([参数列表]){ 方法体;}public:访问修饰符,公开的,公共的s ...

  3. js动态创建元素之一--document.write

    以我曾经写过的例子举例 如上图,乡镇街道的名字和数目是根据数据库的数据获取的,有几个乡镇,就会显示出来几个,这就要求动态获取乡镇名称和数目,以下代码中用到了document.write创建动态页面,在 ...

  4. Linux内存描述之高端内存--Linux内存管理(五)

    1. 内核空间和用户空间 过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间, ...

  5. Linux/Unix环境下的make命令详解

    https://blog.csdn.net/wxqian25/article/details/21226711

  6. SSH鞋贸商城的设计与实现

    目录 应用技术 需求分析 总体设计 项目UI展示 一.应用技术 ①SSH SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架.区别于 S ...

  7. Task.Wait and “Inlining”

    “What does Task.Wait do?” Simple question, right? At a high-level, yes, the method achieves what its ...

  8. php去掉字符串的最后一个字符

    php去掉字符串的最后一个字符 //例如 $str = "12,34,56,"; $newstr = substr($str,0,strlen($str)-1); //从第一位开始 ...

  9. SQLServer之创建主XML索引

    创建主XML索引注意事项 若要创建主 XML 索引,请使用 CREATE INDEX (Transact-SQL) Transact-SQL DDL 语句. XML 索引不完全支持可用于非 XML 索 ...

  10. 【模块04-大数据技术入门】02节-HDFS核心知识

    分布式存储 (1) 5PB甚至更大的数据集怎么存储 ? 所有数据分块,每个数据块冗余存储在多台机器上(冗余可提高数据块高可用性).另外一台机器上启动一个管理所有节点.以及存储在各节点上面数据块的服务. ...