我想通过指纹在StoreLocation.LocalMachine中找到证书,但是,我发现如果我不指定StoreName
,我什么也得不到:
certStore = new X509Store(StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint, thumbprint, false);
// always find nothing, no matter runs as Administrator or not.
但是如果我在初始化 X509Store 时指定StoreName
,我可以找到证书。
certStore = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint, thumbprint, false);
MSDN 没有说明X509Store
构造函数之间的区别,如果未指定StoreName
,是否意味着它会在所有存储名称中进行搜索?对我来说似乎不是这样。
我研究了 .NET 源代码,当调用者未指定StoreName
时,X509Store
使用StoreName.My
。MSDN 对此行为只字未提。
如果您查看源代码,如果您不指定商店位置,就像下面的代码一样:
certStore = new X509Store(StoreLocation.LocalMachine);
然后构造函数将使用Store.My
public X509Store (StoreLocation storeLocation) : this ("MY", storeLocation) {}