首页 > 解决方案 > 识别证书是主机证书、中间证书还是根证书

问题描述

我需要一种方法,给定 X509Certificate2 对象的列表,将每个对象分类为根证书、中间证书或主机证书。

我在 AWS 的 docker 容器中运行了一个 TCP 服务。我已经建立了一个秘密管理系统和外部供应系统,为 TLS 服务提供证书。但是,证书是 PEM,这在 c# 中是臭名昭著的痛苦。在过去 8 年中挣扎了大约 5 次以在涉及私钥时甚至加载 PEM 证书之后,我终于用 dotnet core 中提供的一些新语法彻底解决了这个问题。所以耶。

现在我的应用程序拥有带有私钥和链的证书,但由于 AuthenticateAsServer 方法接口不允许您提供链,因此仍然无法使用它们。相反,您提供一个证书,然后如果可以的话,它会从证书存储中挖出一条链,然后您必须查看另一端以查看该链是否出现。(我会花一个小时长篇大论地谈论我对这种模式的感受)由于我无法提供链,我唯一的选择是在调用 AuthenticateAsServer 之前安装链,这样超级不透明的黑匣子就会找到并发送它们。

这是问题所在。我的链是一个大字符串,你可以通过将相关的 OpenSSL 创建的证书文件组合在一起来获得。我已经编写了一些代码来将该文本拆分为证书块,然后初始化一组 X509Certificate2 对象,我可以遍历这些对象并将每个对象安装到存储中。但是哪家店?我需要一种方法来检查每一个并知道它应该进入哪个商店。

这是我在伪代码中的工作想法

bool isSelfSigned = cert.Issuer == cert.Subject;
bool isCa = HasBasicConstraintCA();

if (isCa)
{
   if (isSelfSigned) root=true;
   else intermediate=true;
}
else if(some hopefully affirmative condition)
{
   host=true;
}

考虑到这种情况,这合理吗?我会用这种逻辑击中任何意想不到的陷阱吗?

是否有任何肯定的条件我可以检查主机证书,除了它不是其他两个中的任何一个?

标签: c#x509certificate2pki

解决方案


您的逻辑几乎是正确的;请注意,对于最终实体证书(在您的术语主机证书中),以下值是可能的;

  1. 没有 basicConstraint 标志
  2. basicConstraint:CA:False 存在

在上述两种情况下,它都可以解释为最终实体(主机)证书。请确保您的 HasBasicConstraintCA() 函数检查这两种情况。除了逻辑看起来简单而美妙。


推荐阅读