作者: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. jstat命令查看jvm的GC情况 (以Linux为例)

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]  注意!!!:使用的jdk版本是jdk8. ...

  2. 基于C#&.net2.0的windows服务创建与安装

    起因:一台服务器中部署的程序,停电后未按照计划任务正常启动. 一.创建并配置Windows服务程序 开发工具VS2015 Framework版本2.0 1.新建Windows服务 2.在Service ...

  3. c#调用com组件,程序 发生意外<hr=0x80020009>

    引用dll,确认dll没有问题,版本正确,可是一直报发生意外,没有任何其他提示. 解决方案: 看dll引用选项配置 复制到本地:设为true,我的就是false; 嵌入互操作类型:false,如果是t ...

  4. C#/VB.NET 给Word文档添加/撤销书签

    在现代办公环境中,阅读或者编辑较长篇幅的Word文档时,想要在文档中某一处或者几处留下标记,方便日后查找.修改时,需要在相对应的文档位置插入书签.那对于开发者而言,在C#或者VB.NET语言环境中,如 ...

  5. vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”

    0.设置自己的host文件,将127.0.0.1指向自己想要访问的域名 127.0.0.1 www.yours.com 1.MAC设置应用在127.0.0.1:80端口访问: config/index ...

  6. vivo如何录制手机视频 分享简单的操作方法

    智能手机功能不断的发展更新,手机已经普及到每一个人,在日常的生活或者工作中都离不开手机,手机中的功能例如一些小视频软件都是非常有趣的,vivo如何录制手机视频?下面我们一起来看看吧! 使用工具:手机 ...

  7. Android为TV端助力 关于4.0之后不能直接获取SD卡外部存储路径的问题

    Environment.getExternalStorageDirectory()是Android 2.x时代的产物,那时Android主流设备只有很小的内置存储器,然后都会外置一张sd卡,那时这个方 ...

  8. springboot运行时该注意的地方

    1.SpringBoot的入口类一定要放在所有类的上一层,也就是要包含所有子包中的类 springBoot在启动时才会加载所有子包中的所有组件 否则会出现启动成功但是访问不到的情况: This app ...

  9. 【记录】使用在线KMS激活Office系列

    摘要 (有能力的请支持正版office) 网上一些激活工具可能捆绑了木马.病毒.使用激活工具有风险.使用在线KMS来激活则没有这个风险. 找到你的office安装目录 已管理员身份运行cmd输入:cd ...

  10. Python爬虫实战之Requests+正则表达式爬取猫眼电影Top100

    import requests from requests.exceptions import RequestException import re import json # from multip ...