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);

还有两个搜索词FindBySubjectNameFindBySubjectDistinguishedName,后者与关键字更相关,第一个搜索关键字会找到任何东西。

所以基本上您需要查找主题,如果您使用上述代码,那么您的搜索字符串将是 .."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

尝试在 PHP 中使用 x.509 证书对 SOAP 调用进行数字签名

使用以下搜索条件找不到 X.509 证书----

x509证书格式

C#,无法将 .p7b 证书导入 Windows 商店