好的,我已经看到了与这个问题有关的几个问题,并且我尝试了很多他们没有成功提出的想法。这是我的情况: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的开发机器已经导入了证书。
您的服务是否有足够权限访问LocalMachine根证书存储区。您不应该使用SubjectName作为FindType进入您的certstore并复制thumprint。使用它。 – albertjan 2009-07-16 09:14:53