如果证书是主机证书、中间证书或根证书,则标识



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

我在AWS的docker容器中运行了一个TCP服务。我已经建立了一个秘密管理系统和外部供应系统,为TLS提供该服务的证书。然而,证书是PEM,这在c#中是臭名昭著的痛苦。在过去的8年里,我花了大约5次时间,甚至在涉及私钥的情况下加载PEM证书,我终于用dotnet核心中提供的一些新语法干净地解决了这个问题。是啊。

现在,我的应用程序拥有带有私钥和链的证书,但由于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;
}

考虑到目前的情况,这合理吗?用这个逻辑,我会遇到任何意想不到的陷阱吗?

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

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

  1. 不存在basicConstraint标志
  2. basicConstraint:CA:存在False

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

最新更新