X.509 证书无法通过“FindBySubjectName”找到
Posted
技术标签:
【中文标题】X.509 证书无法通过“FindBySubjectName”找到【英文标题】:X.509 certificate can't find with "FindBySubjectName" 【发布时间】:2012-10-26 06:55:17 【问题描述】:在与 WCF Security 进行了一场残酷的斗争之后,我想我现在已经到了最后阶段,可以看到曙光了。
我的服务器上安装了一个客户端证书,现在按照建议位于证书存储的 Trusted People 文件夹中。
但是,当我尝试阅读证书申请 -> 服务时,我收到此错误:
使用以下搜索条件找不到 X.509 证书:StoreName 'My'、StoreLocation 'CurrentUser'、FindType 'FindBySubjectName',FindValue 'Forename Surname'。
“姓氏”是我证书的“颁发给”部分。在我看过的所有教程中,这只是一个词;这是问题吗?我从我的 CA 收到了我的证书,其中包含这两个单词,并带有一个空格。
任何人都遇到过这种情况,是我公然做错了什么吗?
更新,证书可以在这里看到:
更新:
变得更奇怪了:
我在我的 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 时,我仍然会收到错误消息。
【问题讨论】:
您正在管理当前用户的证书。大概是somedomain\cdixon
。 Web 服务是否以 somedomain\cdixon
或其他方式运行,例如 NETWORK SERVICE
?
【参考方案1】:
我认为..您在 Trusted People 位置安装了证书,并在商店名称 my
处搜索var store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, certificateSubject, false);
还有两个搜索词FindBySubjectName
或FindBySubjectDistinguishedName
,后者与关键字更相关,第一个搜索关键字会找到任何东西。
所以基本上您需要查找主题,如果您使用上述代码,那么您的搜索字符串将是 .."CN=urs.microsoft.com, O=DO_NOT_TRUST, OU=Created by http://fiddler2.com"
【讨论】:
我已经尝试了这两个 - storeName "TrustedPeople" 和 "FindBySubjectDistinguishedName" 仍然没有返回任何结果,多么令人沮丧!我已经用我的证书图片更新了我的帖子,我应该肯定使用“CurrentUser”而不是“LocalMachine”吗?服务和客户端在同一个网络盒子上。 如果编辑不起作用,您能否像我一样发布主题的屏幕截图以及代码。 我有我的主题,但它比上面的截图要详细得多,它有地址、邮政编码、电子邮件等,当它们在一起时,它是一个很长的字符串。我需要所有这些吗? 我认为没关系..但你不必搜索所有关键字,只需使用上下文中唯一的关键字即可。 使用专有名称进行搜索的特殊之处在于它必须逐字格式化,因为它在 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 方法。【参考方案2】:
https://i.stack.imgur.com/QtYvV.png
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];
【讨论】:
以上是关于X.509 证书无法通过“FindBySubjectName”找到的主要内容,如果未能解决你的问题,请参考以下文章
基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good