行业洞察

揭开远程认证的神秘面纱 —— 初探 DCAP 证书链

By Gavin - 2022-06-15

远程认证

远程认证可以使验证者辨别被验证的可信执行环境上的软件逻辑,代码内容是否有变更,被篡改。通常,远程认证的被验证方通过可信硬件生成一个证书,这个证书包含一个报告。这个报告描述了当前运行在可信执行环境中的软件代码度量。验证者通过验证这个证书的合法性来验证可信硬件上的软件进程是否被修改过。

什么是 DCAP?

Intel® SGX DCAP (Data Center Attestation Primitives) 通过使用椭圆曲线数字签名算法(ECDSA)为数据中心、云服务提供商和企业提供 SGX 远程认证支持,可用于密钥保护、加密模块隔离、机密计算等。例如:验证密钥在可信环境中生成,防止密钥泄露;平台服务的授权部署,验证其运行的服务内容合法有效。Safeheron 的可信策略引擎便是通过使用 DCAP 确保每一条策略执行在可信环境中且无法被篡改。

DCAP 最大的优势在于它允许数据中心拥有自己的认证基础设施,使得生成和验证引用所需的认证担保数据( TCB 信息、证书吊销列表、QE/QVE (Quote Enclave/ Quote Verification Enclave) ID 信息)可完全自主选择获得,消除了运行时对外部服务的依赖,使信任决策可在平台内部做出。实现这种优势的根本原因是有一条完整的证书链,它从头到尾连接着整个认证体系,确认数据拥有者的身份,保障数据不被篡改。

什么是证书链?

证书链的出现是为了解决所有用户证书均由根证书颁发的泄露风险。若根证书私钥出现泄露问题则会影响该根证书颁发的所有用户证书,导致非常严重的安全风险。为了避免根证书的安全风险,证书机构会采用根证书颁发中间证书。中间证书用来颁发用户证书,这样即使中间证书出现问题,也可以选择废弃出现问题的中间证书,从而保护根证书的安全性,同时受关联的用户证书范围也从全部缩减到部分。简而言之,证书链是由根证书、中间证书、用户证书组成。只有当整个证书信任链上的各个证书都有效时,相关服务才会认定当前颁发给用户的证书是有效且受信任的。

DCAP 中证书链结构

Certificate Chain Structure in DCAP

上图中有几个具有代表性的元素:

  1. Root CA Certificate:根证书,用于颁发 Intel SGX 相关的证书
  2. PCK Platform CA Certificate:中间证书,用于为多重包装平台 (multi-package platforms) 颁发 Intel SGX PCK 证书和对应吊销列表
  3. PCK Processor CA Certificate:中间证书,用于为单一包装平台 (single-package platforms) 颁发Intel SGX PCK 证书和对应吊销列表
  4. PCK Certificate:用户证书,用于为 Intel 平台 (多重包装和单一包装均可) 的 Intel SGX TCB 数据签名

我们能清晰看出证书链中证书之间的关系:
Root CA ——> PCK platform/Processor CA(Intermediate)——> PCK Certificate
根证书颁发中间证书,中间证书颁发用户证书

下面是一些测试例子, 是 Intel 用于测试的数据:

根证书:Intel SGX Root CA 吊销列表
$ openssl crl -inform PEM -text -noout -in rootCaCrl.pem
Root Certificate_ Intel SGX Root CA Certificate Revocation List (CRL)

中间证书:PCK Processor CA 吊销列表
$ openssl crl -inform PEM -text -noout -in intermediateCaCrl.pem
Intermediate Certificate_ PCK Processor CA Certificate Revocation List (CRL)

用户证书:由 Intel SGX Processor CA 签发的 PCK 证书
$ openssl x509 -in pckCert.pem -text -noout

中间证书:PCK Processor CA 证书
$ openssl x509 -in pckSignChain.pem -text -noout
User Certificate_ PCK Certificate signed by Intel® SGX Processor CA

DCAP 中的 Intel® SGX 根证书

根证书是证书信任链的起始点,它是由 Intel® 生成的自签名证书。换而言之,证书信任链所有数据最终都是依靠根证书背书。倘若在溯源认证可信的过程中发现错误,那么就说明数据当前是不受信任的,相反地,如果未发现错误则说明数据当前可信。

查看证书信息
$ openssl x509 -in IntelSGXRootCA.crt -text -noout
如下图
View certificate Info

首先我们需要了解一些概念:

  • Issuer: 证书颁发机构
  • Subject: 证书拥有者
  • Subject Public Key Info: 证书拥有者的公钥
  • X509v3 Authority Key Identifier:该证书颁发私钥对应公钥的唯一标识
  • X509v3 Subject Key Identifier:当前证书中公钥的唯一标识

在上面的图中有四个地方需要关注:

Issuer 和 Subject 相同
Issuer: CN = Intel SGX Root CA, O = Intel Corporation, L = Santa Clara, ST = CA, C = US Subject: CN = Intel SGX Root CA, O = Intel Corporation, L = Santa Clara, ST = CA, C = US 说明证书的颁发机构与证书拥有者是同一个实体,换而言之该证书是由 Intel® 生成的自签名证书, 是根证书,所以对此证书可以无条件的信任。

根证书中的 Authority Key Identifier 与 Subject Key Identifier 相同
X509v3 Authority Key Identifier:
22:65:0C:D6:5A:9D:34:89:F3:83:B4:95:52:BF:50:1B:39:27:06:AC
X509v3 Subject Key Identifier:
22:65:0C:D6:5A:9D:34:89:F3:83:B4:95:52:BF:50:1B:39:27:06:AC

两个密钥 ID 标识相同呼应上方 Issuer 和 Subject 相同,再次印证根证书是 Intel® 自签名证书。

吊销列表与根证书的关系
查看 CRL文件(吊销列表)
$ openssl crl -inform PEM -text -noout -in IntelSGXRootCA.crl

X509v3 Authority Key Identifier:
22:65:0C:D6:5A:9D:34:89:F3:83:B4:95:52:BF:50:1B:39:27:06:AC

发现 IntelSGXRootCA.crl 和 IntelSGXRootCA.crt 中 Authority Key Identifier 是一致的。 所以,两个证书都是 Intel® 发布且互相印证存在的。

根证书私钥对应的公钥

由上方根证书的图中所得:

Subject Public Key Info:
        Public Key Algorithm: id-ecPublicKey
            Public-Key: (256 bit)
            pub:
                04:4f:fa:0f:fd:56:1c:da:d6:c0:f9:8d:30:8c:81:
                28:c5:b9:27:a2:73:32:c8:e8:eb:13:f6:be:42:b5:
                71:d6:46:6f:53:c6:44:ff:c2:ff:c1:02:82:20:e4:
                9a:49:66:cf:02:f3:2e:2f:b4:d3:49:bb:2c:ba:ed:
                28:90:37:a0:2d
            ASN1 OID: prime256v1
            NIST CURVE: P-256

与此同时,我们在 Intel® SGX 官方开源代码中可以看到以下的代码:
Public Key for the Private Key of Root certificate

该 QVE 飞地是 Intel® 验签使用。根据比对,两把公钥是一致的, 到现在我们能知道 root sgx 根证书确实是 Intel® 用于 DCAP。

如何下载 DCAP 证书链

我们可以从 Intel® SGX Provisioning Certification Service (PCS) 或 Intel® SGX Provisioning Certificate Caching Service (PCCS)的 API 可以获取相应的证书
Intel® SGX Provisioning Certificate Caching Service (PCCS) API
PCCS 和 PCS 本质来说是一回事,二者都是储存证书和硬件相关信息, 只不过 PCCS 可以在云上, 本地或者局域网搭建, 这样对于用户更加便利。

如何验证 DCAP 证书链

Intel® SGX Provisioning Certificate Caching Service (PCCS) API
如图展示了证书间的验证逻辑及关系。下级证书中拥有其上级证书的 DN(Distinguished Name),在身份验证时,每一级都会通过 DN 索引上级证书,并使用上级证书的 Public Key来验证下级证书的签名是否正确。如果中间存在多个中间证书,则会自下而上实现溯源验证。由于自签名根证书已经内置在操作系统中,属于系统信任的根证书,则到达根证书时就可验证完毕,形成了一条完整信任链。
下图展示了 Intel® 官方开源代码中的部分
Check out parts of Intel® SGX open source code

过程可以分为:

  1. 从报告中释放出 PCKCert 证书链
  2. 从证书链中获取根证书
  3. 验证根证书公钥
  4. 根据 DN 等信息自下而上,由近到远地进行层层认证

参考文献