【问题标题】:WCF - Cannot Find the x.509 Certificate Using the Following Search CriteriaWCF - 无法使用以下搜索条件找到 x.509 证书
【发布时间】:2009-07-15 21:00:36
【问题描述】:

好的,我已经看到了几个与这个问题相关的问题,并且我尝试了很多其中提出的想法,但都没有成功。这是我的情况:

我正在通过我公司的 Intranet 访问 Web 服务。我使用 svcutil.exe 为 WCF 生成客户端类。当服务正在开发中并且不需要身份验证凭据时,我能够毫无问题地运行 Web 服务调用,因此我知道代码有效。当时,代码在 SSL 上运行。我将所需的证书导入到受信任的根证书颁发机构存储中,一切都很好。

我们刚刚转移到舞台环境,并且服务已升级为需要凭据才能连接。我将连接切换到新端点,并添加了验证代码。这是我第一次使用 wcf,所以请耐心等待任何明显的错误。我的问题是我无法通过代码找到证书以传递给服务进行身份验证。我基于我找到的一些在线代码示例。

这是我的 svcutil 生成的配置示例:

<system.serviceModel>
  <bindings>
   <basicHttpBinding>
    <binding 
        name="xxxSOAPBinding" 
        .... (irrelevant config settings)....
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <security mode="Transport">
      <transport clientCredentialType="Certificate" />
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>
  <client>
   <endpoint address="https://xxxServices_1_0_0"
    binding="basicHttpBinding" bindingConfiguration="xxxSOAPBinding" 
    contract="xxxService" name="xxxService" />
  </client>
 </system.serviceModel>

这是我用来尝试连接的代码。一旦我尝试找到证书,就会抛出异常:

using (var svc = new xxxServiceClient())
{
    svc.ClientCredentials.UserName.UserName = "XXX";
    svc.ClientCredentials.UserName.Password = "XXX";

    svc.ClientCredentials.ClientCertificate
     .SetCertificate(StoreLocation.LocalMachine, StoreName.Root, 
                     X509FindType.FindBySubjectName, "xxx");
...
}

我尝试了几种不同的 X509FindType,并将它们与证书上的值进行匹配,但均未成功。我的代码有问题吗?还有其他方法可以查询证书存储以验证我传递的值吗?

我运行 Visual Studio 的开发机器已导入证书。

【问题讨论】:

  • 您的服务是否有足够的权限访问 LocalMachine 根证书存储。您不应该使用 SubjectName 作为 FindType 进入您的 certstore 并复制指纹。使用它。

标签: wcf wcf-security wcf-client


【解决方案1】:

两个愚蠢的问题:

  • 确定您的证书已安装吗?
  • 这是专门针对此登台机器的证书吗?

此外,您首先设置用户名/密码,然后还设置凭据,这似乎有点奇怪。你能注释掉用户名/密码部分吗?这有什么不同吗?

马克

【讨论】:

  • - 我知道这种感觉 - 我已经无数次看到可怕的橙色“另一个答案已发布”横幅向我弹出 :-)
  • 我认为它已安装。我以为我正在通过检查“证书”对话框来验证这一点。当我这样做时,我可以在 Trusted Root Certification Authorities 选项卡下看到证书。我需要检查其他任何东西来验证吗?证书不是特定于机器的。它在整个网络中用于我们的网络服务。
  • @Mark:“受信任的根证书颁发机构”是您信任的证书的 ISSUERS(证书颁发机构)的存储。您需要将您的实际证书放在其他地方,通常在“个人证书”下(甚至在计算机帐户上)。
  • 将证书导入个人存储并将 StoreLocation 更改为 CurrentUser,将 StoreName 更改为 My,并将 X509FindType 更改为 FindByThumbprint 就可以了。谢谢!
【解决方案2】:

您确定证书已导入本地机器存储,它可能在 CurrentUser 存储中。

【讨论】:

  • 如何将证书导入本地机器存储?
【解决方案3】:

这听起来可能很愚蠢,但您确定暂存服务的新证书已安装到您的证书存储中吗?这很可能是你的问题。

此外,由于您没有提及引发什么异常,因此问题可能是您在设置 clientcertificate 凭据之前设置了用户名/密码凭据,而您的绑定未指示使用用户名/密码。那里可能有问题;它们是相互排斥的,IIRC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2018-12-12
    • 2011-07-03
    • 2012-10-26
    • 2011-05-26
    • 2012-07-14
    • 2020-03-04
    相关资源
    最近更新 更多