不久前,我从 DigiCert 购买了代码签名 EV 证书。我已经拥有一个 USB eToken,因此我选择了一种交付方式,即从他们的网站下载。订单要求我附加一个 CSR,这是我通过他们的 Windows 证书实用程序生成的。在任何时候都没有使用现有的硬件 eToken 进行任何交互,甚至没有插入,所以我知道私钥一定存储在生成 CSR 的 Windows 计算机上,而不是 USB eToken 上。
当他们向我发送下载链接时,我只需将其导入他们的 DigiCert 证书实用程序即可。这意味着证书和私钥现在都位于我的电脑上,而不是我的 USB eToken 上。
似乎我甚至不需要 eToken 设备来签署代码,这让我很疑惑,对于这种特定的交付方式,eToken 的意义何在?我是否应该导出私钥和证书并将其导入 USB eToken,然后将其从我的机器中删除?假设 eToken 的唯一作用是存储无法轻松导出的私钥,为什么甚至有通过下载链接交付 EV 证书的选项,为什么我能够在不连接 USB eToken 的情况下使用实用程序生成 CSR?
证书不是私钥。它是公钥的签名版本。因此,证书的交付方式与私钥的存储位置或存储方式无关。
CSR 中没有任何内容表明私钥的生成位置。(而且 DigiCert 应用程序是一种通用工具;它并不仅限于 eToken 使用。)
一些硬件令牌支持“密钥认证”,即设备本身生成带有自己签名的 CSR,以证明私钥确实是在设备上生成的,一些 CA 也需要这样的认证。例如,如果我没记错的话,Sectigo 仅支持使用非常特定的令牌(主要是 Yubikey)基于 CSR 颁发 EV 证书,因为只有这些令牌才支持密钥认证。
但其他 CA(例如 DigiCert)可能只是将确保安全地生成密钥的责任留给用户。
CA/B 论坛规则对此有如下规定:
因此,虽然 Sectigo 将自己限制为选项 a) 或 b),但“(但不限于)”可能为 DigiCert 提供了足够的自由来接受任何 CSR 并说“客户签署了要求他们安全存储它的合同,所以这不再是我们的问题了”。
这可能是设置 eToken 的一种可能方法,但不一定是最佳方法。
当为 eToken 生成 CSR 时,出于最大安全性的考虑,最好使用支持 eToken 的工具,并将令牌插入。这样就可以在令牌内部生成 CSR,因此私钥也在令牌内创建,并且在证书的整个生命周期内永远不会离开令牌。
然而,最大程度的安全性可能需要在可用性方面做出妥协:如果令牌损坏,并且私钥被锁定在令牌内,则无法备份私钥,因此需要创建新的证书。
通过允许创建与 eToken 兼容的证书而无需实际令牌,CA 使您可以将相同的私钥导入两个或多个 eToken,以便在单个 eToken 发生故障时轻松替换。另一方面,您必须确保密钥生成和 eToken 设置过程的安全性。建议的方式是在隔离系统上执行此操作,一旦 eToken 经过测试并发现良好,就可以完全擦除。
CSR 和生成的证书都无需保密:事实上,您的客户需要一份证书副本才能验证您使用私钥生成的代码签名。这就是为什么通过下载链接提供证书不是问题的原因。
由于 CA 永远不会收到您的私钥,因此您可以肯定 CA 不可能将其泄露给任何人。