【问题标题】:WCF: Cannot find certificate by common name but by serial numberWCF:无法按通用名称但按序列号找到证书
【发布时间】:2014-06-07 21:57:54
【问题描述】:

我正在尝试加载证书以保护我的 WCF 服务。使用证书的序列号可以很好地工作。这意味着该证书可供 IIS 进程访问并且可以使用。

但在最终解决方案中,我需要使用通用名称来查找证书。这就是问题出现的地方。找不到证书。每次我从序列号更改为通用名称时,我都会收到一个 InvalidOperationException,它表示搜索条件无法找到证书。

<serviceCredentials>            
        <serviceCertificate findValue="‎CN=*.mycompany.net, O=MyCompany Inc, L=MyCity, S=Nordrhein-Westfalen, C=DE" x509FindType="FindBySubjectDistinguishedName" storeLocation="LocalMachine" storeName="My" />
</serviceCredentials>

与序列号版本相比,我唯一改变的是 findValue 和 x509FindType。我检查了两次。所以通用名应该是正确的。

我错过了什么吗?

提前致谢。

【问题讨论】:

  • 根据我的经验,您必须从证书的详细信息中剪切并粘贴到您的搜索条件中。搜索非常敏感,甚至对空格也是如此。
  • 我检查了一遍又一遍。里面不应该有错别字。我什至尝试输入字符串以防止其中包含不可见的字符,但没有影响。
  • 你是如何解决这个问题的,我也面临同样的问题。有什么想法吗?

标签: .net wcf security certificate


【解决方案1】:

尝试将 findValue 设置为 *.mycompany.net

请注意,当您将另一个同名证书添加到存储区时(在第一个证书过期后),使用 DN 作为查找值可能会出现问题。然后它会找到两个,不知道用什么证书。

即使使用序列号也不能保证证书的唯一性,因为另一个 CA 可能会颁发具有相同序列号的证书。只有发行者的 DN 和序列号的组合应该是唯一的,但在这个世界上谁能保证:)

安全的方法是使用指纹。我知道即使在 SHA1 中也可能会发生冲突,但机会非常低。但是使用指纹对用户/管理员不是很友好,因为您从一开始并不知道正在使用什么证书。

【讨论】:

  • 感谢您的回答。但实际上将查找值设置为 #.mycompany.net 并没有解决问题。我尝试使用以下代码从证书存储中加载证书,该代码运行良好:codeX509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly); var cert = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, "CN=*.mycompany.net, O=MyCompany Inc, L=MyCity, S=Nordrhein-Westfalen, C=DE" x509FindType="FindBySubjectDistinguishedName" storeLocation="LocalMachine ", 真);
  • 好吧,我的错。尝试将 X509FindType 更改为 FindBySubjectName 并将 findValue 保留为 *.mycompany.net
  • 嗯,它可以使用序列号吗?我没有任何意义:)
  • 这正是我的问题:)
  • 在第一条评论中您说#.mycompany.net 不起作用。那么你试过#.mycompany.net*.mycompany.net 吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多