为什么我不能通过存储名称和哈希找到证书?
本文关键字:哈希找 证书 不能 存储 为什么 | 更新日期: 2023-09-27 18:01:37
在我的代码中,我列举了所有本地IIS站点,并对每个站点尝试验证端口443的证书。
using( var sm = new ServerManager() ) {
foreach( var site in sm.Sites ) {
foreach( var binding in site.Bindings ) {
if( binding.EndPoint.Port == 443 ) {
var thumbprint = binding.CertificateHash;
var storeName = binding.CertificateStoreName;
//validation here...
}
}
}
}
这段代码产生storeName
为"MY"
, thumbprint
为我转换成十六进制表示的字节数组。
现在"验证"部分是这样工作的:
var store = new X509Store("MY");
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates;
//find and validate my cert
store.Close();
,这段代码产生一个空集合。但是如果我改变
var store = new X509Store("MY");
var store = new X509Store(StoreLocation.LocalMachine);
则代码生成一个包含两个证书的集合,其中一个具有正确的拇指指纹,我可以验证它。
为什么Binding
返回证书存储名称,但我在该名称的存储中找不到任何证书?
商店名称和商店位置是有区别的。
所有IIS证书都存储在本地机器位置,而不是特定用户帐户的证书。
这是X509Store
的构造函数,它只需要一个StoreLocation
,你的第二个例子是调用:
public X509Store(StoreLocation storeLocation) : this("MY", storeLocation)
{
}
调用构造函数,该构造函数接受存储名称和的位置。
你的第一个例子:
var store = new X509Store("MY");
为CurrentUser
打开MY
存储,而不是本地机器。所以你正在寻找错误的存储。切换到使用同时接受名称和位置的构造函数。
此方法将为您获取证书:
private X509Certificate2 GetServiceCertificate(String certificateSubjectName, StoreName storeName = StoreName.My, StoreLocation storeLocation = StoreLocation.CurrentUser)
{
X509Store certificateStore = new X509Store(storeName, storeLocation);
foreach (X509Certificate2 certificate in certificateStore.Certificates)
{
if (certificate.SubjectName.Name == certificateSubjectName)
{
return certificate;
}
}
return null;
}