在Windows证书存储中清晰识别证书

4
我正在开发一个生成XML数据并对其进行签名的库。我已经将使用OpenSSL从pem文件生成的pkcs12证书安装到Windows证书存储中。
我正在使用C#代码从证书中加载数据。
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = null;

foreach (var item in store.Certificates)
{
    if (item.SubjectName.Name.Contains("CN=IDENTIFIER"))
    {
        cert = item;
        break;
    }
}
store.Close();

在我的情况下,CN标识符是:我的名字+姓氏。证书来自第三方。因此我认为我无法影响这些标识符。
现在问题来了:
有没有办法从C#中精确定位这个证书?将来可能会出现多个证书具有相同的X509参数(如CN等等)。
提前感谢您的回答。
2个回答

4
是的,CN可能包含相同的标识符(例如,当证书是为商业实体颁发时)。
证书通常由以下组合区分: 1)颁发者名称(不是CN,而是RDN,具有多个字段的完整名称记录)+证书序列号(在一个CA内是唯一的) 2)颁发者名称+证书哈希值
如果您在搜索证书之前不知道颁发者名称,则可以向用户呈现找到的证书列表,并一旦他选择了其中一个证书,就为将来的参考存储证书哈希值。
在较小的系统(终端用户的计算机)中,MY存储库中的证书数量通常很少,哈希冲突的几率很小。在大型系统上,几率更高,这就是为什么还要使用颁发者名称的原因。

我认为RDN是类型为X500DistinguishedName的Issuername。 - csteinmueller
@csteinmueller RDN代表相对专有名称。这是一种具有多个字段的类型结构。注意:序列号是一个整数,但该整数的长度未定义,并且长度为20字节的序列号并不罕见。 - Eugene Mayevski 'Callback
不要忘记指纹。这可能是识别证书最简单的方法。 - President James K. Polk
我也会将替代名称添加到其中。@GregS,关于指纹的好点子,但像序列号一样,这取决于是识别特定证书还是识别身份(证书可以为相同名称续订)。指纹往往是识别特定证书的方法(事实上,像netsh这样的工具用于配置特定服务器证书就是这样做的)。 - Bruno
1
SHA-1摘要算法在整个证书上发生碰撞的概率应该与tbsCertificate部分的碰撞概率相当。如果在tbsCertificate上发生碰撞,这意味着证书可以被篡改并保持相同的签名。这将是一个相当大的问题,但希望这种情况不太可能发生,肯定比具有相同DN的两个证书更不可能。 - Bruno
显示剩余3条评论

4

对于 Eugene 的回答进行补充...

X509StoreCertificates 属性 是一个 X509CertificateCollection

你可能会对它的 Find 方法和 X509FindType 感兴趣。它提供了许多搜索证书的方法。严格来说,主题 DN 和主题备用名称 都应该用于识别与证书相关联的实体。然而,从展示的角度来看,很少有工具这样做(例如在表格中可能会变得非常混乱)。

正如GregS和Eugene所指出的那样,证书指纹(在其他工具中也称为指纹/哈希)可以唯一地标识特定的证书,而不考虑其发行者。它可与X509FindType一起使用

在Windows/.Net/SSL世界中,指纹在多个地方使用。特别是,这是选择在HTTPS端口上安装给定证书的方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接