无法使用“FindBySubjectName”找到X.509证书。

16

在与WCF安全机制的激烈斗争后,我现在认为我已经处于最后阶段,可以看到曙光。

我在服务器上安装了客户端证书,并且如建议的那样,在证书存储的Trusted People文件夹中。

然而,当我尝试读取应用程序 -> 服务的证书时,我遇到了这个错误:

Cannot find the X.509 certificate using the following search criteria: StoreName 'My', StoreLocation 'CurrentUser', FindType 'FindBySubjectName', FindValue 'Forename Surname'.

"Forename Surname"是我的证书的"Issued to"部分。在我看过的所有教程中,这只是一个单词;这是问题吗?我从我的CA获得了带有这两个单词和一个空格的证书。

有人遇到过这种情况吗?我是否做错了什么?

更新,证书可在此处查看:

enter image description here

更新:

更奇怪的是:

我在我的Web服务器上安装了Visual Studio,并使用以下代码通过Thumbprint获取证书:

var store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindByThumbprint, "71995159BFF803D25BFB691DEF7AF625D4EE6DFB", false);

这实际上会返回一个有效的结果。然而,当我将此信息放入我的服务/客户端的web.config中时,仍然出现错误。


1
您正在管理当前用户的证书。假设是somedomain\cdixon。Web服务是否以somedomain\cdixon或其他身份运行,例如NETWORK SERVICE - ta.speot.is
2个回答

16

我认为...您已将证书安装在受信任的人员位置,并在存储名称my中搜索。

var store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, certificateSubject, false);

还有两个搜索项FindBySubjectNameFindBySubjectDistinguishedName,后者与关键字更相关,而第一个将找到任何具有搜索关键字的内容。

因此,基本上您需要查找主题,如果使用上面的代码,那么您的搜索字符串将是.."CN=urs.microsoft.com,O = DO_NOT_TRUST,OU = Created by http://fiddler2.com"

证书属性


1
我已经尝试了这两个 - storeName "TrustedPeople" 和 "FindBySubjectDistinguishedName",但仍然没有结果,真是令人沮丧!我已经更新了我的帖子,并附上了我的证书图片,我应该绝对使用 "CurrentUser" 而不是 "LocalMachine" 吗?服务和客户端都在同一台 Web 服务器上。 - Chris Dixon
如果编辑无效,您能像我一样发布主题的屏幕截图以及代码。 - indiPy
我已经有了我的主题,但它比上面的截图详细得多,包括地址、邮编、电子邮件等等,当全部放在一起时是一个非常长的字符串。我需要全部吗? - Chris Dixon
我认为这并不重要,但你不必使用所有关键词进行搜索,只需使用在上下文中唯一的关键词即可。 - indiPy
5
使用“Distinguished Name”进行搜索的一个奇特之处在于,它必须按照ASN.1数据内部编码的原样格式化,例如,“CN=Name, O=Company”是有效的,而“CN=Name,O=Company”和“CN = Name, O = Company”是无效的。我建议您首先使用此代码进行格式化:new X500DistinguishedName("CN=Name,O=Company", X500DistinguishedNameFlags.None).Format(false),然后将返回值传递给Find方法。 - George Chakhidze

1

https://istack.dev59.com/QtYvV.webp

private X509Certificate2 GetCertificateFromStore()
        {
            var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);
            var certCollection = store.Certificates;
            var currentCerts = certCollection.Find(X509FindType.FindBySubjectDistinguishedName, "CN=sf.sandbox.mapshc.com", false);
                return currentCerts.Count == 0 ? null : currentCerts[0];
        }

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