gpt4 book ai didi

c# - 如何在 C# 中验证来自特定根 CA 的证书链

转载 作者:行者123 更新时间:2023-12-02 02:39:50 25 4
gpt4 key购买 nike

我有一个如下所示的证书链:根 CA -> 中间 CA -> 客户端证书。如何验证收到的证书是否是由“根 CA”显式创建的?

验证整个链不是问题。这可以这样完成:

X509Certificate2 rootCert = new X509Certificate2(rootCertFile);
X509Certificate2 intermediateCert = new X509Certificate2(intermediateCertFile);
X509Certificate2 clientCert = new X509Certificate2(clientCertFile);

chain.ChainPolicy.ExtraStore.Add(rootCert);
chain.ChainPolicy.ExtraStore.Add(intermediateCert);

if(chain.Build(clientCert))
{
// ... chain is valid
}

这里的问题是证书是针对 (Windows) 证书存储区进行验证的,但我只想针对特定的根 CA 对其进行验证。

我还认为可以检查chain.ChainElements是否包含我期望的根CA。但是,如果有人从不同的根 CA 向我发送一条有效链并仅添加我期望的根 CA,该怎么办?

最佳答案

证书链 API 检查每个元素是否签署了前一个元素,因此有人无法将您的根 CA 添加到末尾(前提是您没有使用带有 MD5 签名的 384 位 RSA key 之类的东西,在这种情况下,他们可以伪造您的签名)。

您可以对任何您喜欢的额外检查进行编码,例如您知道您的链不会超过长度 3(尽管您可以在根 CA 的 X509 基本约束扩展中对其进行编码)。

if (!chain.Build(cert))
{
return false;
}

if (chain.ChainElements.Length > 3)
{
return false;
}

X509Certificate2 chainRoot = chain.ChainElements[chain.ChainElements.Length - 1].Certificate;

return chainRoot.Equals(root);

如果您喜欢最后一行,可以是return root.RawData.SequenceEquals(chainRoot.RawData);(确保它们具有相同的字节)。

一些值得注意的事情:

  • 当您调用 X509Chain.Build() 时,它通过 X509ChainElement 返回的每个 X509Certificate2 对象都是一个新对象。您可能希望处置任何未归还的元素(可能是全部)。
  • 即使 chain.Build 返回 false,它也会填充 ChainElements 数组,以便您可以检查原因。
  • X509Chain 对象本身是一次性的,您可能想要处置它(您可能已经在代码片段之外执行此操作)。
  • 处置链不会处置任何创建的证书,因为您可能已经持有对象引用。

关于c# - 如何在 C# 中验证来自特定根 CA 的证书链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com