【问题标题】:Idenitfy if certificate is a host, intermediate, or root cert确定证书是主机证书、中间证书还是根证书
【发布时间】:2020-07-21 13:50:23
【问题描述】:

我需要一种方法,在给定 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# x509certificate2 pki


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-06-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多