2012-05-03 87 views
3

我正在开发一个库,它生成XML数据并签名生成的XML。我已经安装了一个pkcs12证书(通过pem文件使用OpenSSL生成)到Windows证书存储中。清楚地识别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标识符是:我的女士prename +姓。证书来自第三方。所以我认为我对标识符没有影响。

在这里,问题来了:

有没有办法准确地识别从C#此证书。将来有可能,多个证书具有相同的X509参数(CN等)。

预先感谢您。

回答

3

是的,这可能是CN包含相同的标识(例如,当证书用于商业实体发行的)。

证书通常由下列组合之一区分: 1)发行人名称(不CN,但RDN,完整名称记录具有多个字段)+证书序列号(这是一个CA内唯一) 2)发行人名称+证书哈希

如果你不知道搜索的证书之前,发行人名称,可以发现目前证书的用户列表,一旦他选择证书,以供将来参考存储证书哈希之一。

在更小的系统(最终用户的计算机)在我的商店证书的数量通常很小,哈希冲突的可能性很小。在大型系统中,机会更高,这就是为什么使用Issuer名称的原因。

+0

谢谢IssuerName +证书序列号正是我所期待的。 IETF表示:序列号必须是由CA分配给每个证书的正整数。对于由给定CA发布的每个证书(即,发行者名称和序列号标识唯一证书),它必须是唯一的。 CA必须强制serialNumber是一个非负整数。但你对RDN意味着什么? – csteinmueller

+0

我认为RDN是X500DistinguishedName类型的Issuername – csteinmueller

+0

@csteinmueller RDN代表RelativeDistinguishedName。这是具有多个字段的类型结构。注:序列号是一个整数,但该整数的长度未定义,并且长度为20个字节的序列号并不少见。 –

3

扩展在尤金的答案...

Certificates property of X509StoreX509CertificateCollection

你可能有兴趣在其Find method and the X509FindType。它提供了许多方法来搜索证书。严格地说,the subject DN and the subject alternative names都应该重要,以识别与证书关联的实体。但是,从呈现的角度来看,很少有工具可以做到这一点(例如,这可能会在表格中变得非常混乱)。

由于GregS和尤金指出的那样,certificate thumbprint (also known as fingerprint/hash in other tools)唯一标识无关其发行人特定的证书。它can be used with X509FindType

拇指指模是在Windows/.NET/SSL世界多个地方使用。特别是,it's the way to pick a given certificate to install on an HTTPS port

相关问题