x509 证书如何知道链接到私钥?

How is a x509 certificate aware of being linked to a private key?

我不明白证书如何知道链接到私钥。例如,在 windows 下,当您单击来自智能卡的证书时,它显示 "You have a private key that corresponds to this certificate"。证书如何知道这一点?我一直在阅读 RFC5280,但是我没有看到 X509 证书中的任何字段指定证书是否连接到私钥。我错过了什么?

这取决于操作系统 and/or 使用加密库。在 Windows 的情况下,证书存储在 Certificate Store 中。证书存储支持存储附加属性,其中可以提供 CSP 和密钥容器信息。当您在商店中打开证书时,MMC 会读取附加的证书属性并确定是否存在关联的私钥。

一般来说,任何public密钥都包含在其私钥中。无论操作系统、存储机制或库如何,只要给定一个 X.509 证书和一个私钥,就可以从私钥中提取 public 键值并与 public 中的键值进行比较证书。如果它们匹配,则私钥属于证书。

例如,一个RSA私钥由

组成
  1. 公共指数
  2. 模数
  3. Prime1
  4. Prime2
  5. 指数 1 [可选]
  6. 指数 2 [可选]
  7. 系数[可选]
  8. PrivateExponent [可选]

前两个 PublicExponent 和 Modulus 构成 public 密钥并存储在 X.509 证书中。 (以上可选字段可以从前4个开始计算,但通常包含在私钥中,因为计算它们需要很多CPU的权力)

对于您的特定示例,MMC 证书管理单元查询 Crypto API (CAPI) 以获取已安装的证书。 CAPI 使用加密服务提供程序 (CSP) 模块,除其他外,它可以提供证书存储。作为 CSP 证书存储规范的一部分,该存储为每个存储的证书提供了一个属性 "PP_Container"。此属性告诉 CAPI 保存匹配私钥(如果有)的 CSP 容器的名称。 "separation" 允许将私钥存储在智能卡或硬件安全模块上,而证书存储在 Windows 系统本身。