c# - 识别证书是主机证书、中间证书还是根证书
问题描述
我需要一种方法,给定 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;
}
考虑到这种情况,这合理吗?我会用这种逻辑击中任何意想不到的陷阱吗?
是否有任何肯定的条件我可以检查主机证书,除了它不是其他两个中的任何一个?
解决方案
您的逻辑几乎是正确的;请注意,对于最终实体证书(在您的术语主机证书中),以下值是可能的;
- 没有 basicConstraint 标志
- basicConstraint:CA:False 存在
在上述两种情况下,它都可以解释为最终实体(主机)证书。请确保您的 HasBasicConstraintCA() 函数检查这两种情况。除了逻辑看起来简单而美妙。
推荐阅读
- java - 如何提高连接到 ActiveMQ HTTP 传输的速度
- razor - HiddenInput 在 ASP.NET Core 2.2 脚手架上不起作用
- ios - 在 LinkedIn iOS 应用程序中共享带有“#”字符的链接时出现问题
- javascript - 我有一个按钮可以切换我网站的主题,如果再次单击以更改回默认主题,如何制作相同的按钮?
- java - 在大型 OWL 文件中使用 Apache Jena 列出类
- gulp - Gulp:复制所有文件但排除一个扩展名
- visual-studio - 在 F# 项目中使用 ** 通配符会导致 Visual Studio 拒绝加载项目
- java - Apache POI:垃圾收集不会释放内存 [Java]
- react-native - 如何从 Play 商店下载链接获取参数
- django - 在共享开发环境中使用 Django、Gunicorn 和 Ngnix 提供静态内容