2009-07-15 105 views
2

好的,我已经看到了与这个问题有关的几个问题,并且我尝试了很多他们没有成功提出的想法。这是我的情况:WCF - 使用以下搜索标准找不到x​​.509证书

我在我公司的内部网上打了一个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"); 
... 
} 

我尝试了好几种不同的X509FindTypes,并把它们匹配的价值观上没有成功的证书。我的代码有问题吗?有没有另外一种方法可以查询证书商店来验证我传递的值?

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

+0

您的服务是否有足够权限访问LocalMachine根证书存储区。您不应该使用SubjectName作为FindType进入您的certstore并复制thumprint。使用它。 – albertjan 2009-07-16 09:14:53

回答

3

两个傻问题:

  • 确保您certificiate安装呢?
  • 这是一个专门为这台升级机认证吗?

另外,它似乎有点奇怪,你首先设置用户名/密码,然后还设置凭据。你可以注释掉用户名/密码部分吗?这有什么区别吗?

马克

+0

击败我20秒。:) – Randolpho 2009-07-15 21:07:39

+0

- 我知道这种感觉 - 我有可怕的橙色“另一个答案已张贴”旗帜在我身上无数次弹出:-) – 2009-07-15 21:08:43

1

这听起来很蠢,但你一定对分期服务的新证书已经安装到您的证书存储?这很可能是你的问题。

另外,由于您没有提及引发了什么异常,因此可能问题在于,在设置clientcertificate凭证之前,您的绑定未指示使用用户名/密码时,您已经设置了用户名/密码凭证。这可能是一个问题;他们是互相排斥的,IIRC。

2

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