如何在不暴露私钥的情况下分发客户端证书?

信息安全 tls 验证 证书 公钥基础设施
2021-09-04 15:35:10

我正在设计一个基于 WCF 的 B2B Web 服务。由于客户端数量相对较少且安全性是优先事项,因此我选择使用 X509 客户端证书进行客户端身份验证。

我正在使用我自己的自签名 CA 签署客户端证书(这当然是安全的)。我还验证了该设置正在一组本地计算机上运行。

一个问题一直困扰着我。只要证书可以“物理”移交,我就没有问题。但是,我似乎找不到将客户端证书安全地传输到实际客户端的解决方案。这些是我到目前为止提出的选项:

1) 使用 PFX 格式的对称加密对证书进行加密。然后我将通过电子邮件发送证书并使用旧的蜗牛邮件(即物理信件)发送解密证书的密钥

2) 建立一个简单的网站,让客户使用临时 URL(发送到电子邮件地址的凭据)登录,然后下载证书。该站点将使用 HTTPS 进行保护。然后,安全性完全依赖于客户电子邮件的安全性,并且没有人从电子邮件中获取 URL

我倾向于选择选项 1)作为唯一的安全漏洞,因为有人实际上会从物理信件中窃取密钥。然而,使用物理字母似乎有点乏味。

是否有任何事实上的标准来解决我忽略的这个问题,提供合理的安全性?

3个回答

进行证书的“正常”方式是私钥永远不会离开客户端系统。事情是这样的:

  • 私钥/公钥对在客户端系统上生成。
  • 公钥作为证书请求的一部分发送到 CA (通常为 PKCS#10 格式)。
  • CA 构建并签署证书,然后将其发送回客户端。

现在,关键部分变成了确保 CA 在发布时与正确的客户交谈;但是,至少只传输公共数据,这使事情变得更简单。

我建议您通过邮件向潜在客户发送一次性密码——不是电子邮件,而是更传统的纸质邮件。然后他们使用它在您的 CA 上注册(当然是在 HTTPS 内)。让您的生活更轻松:使用已包含必要软件和流程的 CA 产品。

您可以让客户端生成证书签名请求,并将其发送给您以由您的 CA 签名。在客户端生成 CSR 将创建公钥/私钥对,并且 CSR 将仅包含公钥和身份信息。这样,私钥永​​远不会通过网络传输。

有些产品可以做到这一点,并集成了多因素身份验证。您将不得不寻找它们。

如果你想编写上面的代码,MS 系统使用 ActiveX,而 html5 有一个 keygen 函数,可以完成我上面描述的操作。

您对问题的分析似乎涉及无限时间窗口的想法。

考虑通过 HTTPS 传输证书并让您的后端只允许传输一次证书。除非传输连接本身是 MITM'd,否则您的客户将拥有其他人没有的证书,或者他们会知道它已被其他人检索。当客户要求重新签发时,由于客户未能保存等,您最终会撤销一些不可忽略的金额证书,但您会知道只有一个人接受了该证书,或者它应该失效。