我正在编写一个使用公共Web服务的系统。我正在使用VS2008和经典的.NET Framework 2.0 Web服务技术来使用Web服务。我的问题是没有使用Web服务或调用它的操作。
问题是当我从签名的操作中得到响应时,生成的代理开始验证签名的幕后。那时我得到了WSE3003错误。我(我想)已经将服务证书加载到我的LocalComputer / TrustedPeople证书存储中,当我查看它的证书路径时,我可以看到一切正常:
VeriSign Class 3 Public Primary CA
www.verisign.com/CPS Incorp.by参考。责任有限公司(c)97 ...
servcert.there.com
但我一直得到以下例外:
Microsoft.Web.Services3.ResponseProcessingException: WSE910:在此期间发生了错误 处理响应消息,和 你可以在内心找到错误 例外。你也可以找到 响应中的响应消息 属性。 ---> Microsoft.Web.Services3.Security.SecurityFault: 安全令牌不可能 经过验证或授权---> System.Security.SecurityException: WSE3003:证书的信任链 无法验证。请检查 如果证书是正确的 安装在受信任的人 证书商店。或者你可能想要 设置allowTestRoot配置 如果这是一个测试,则为true 证书。
以下代码可能无法编译,我已经删除了一些敏感的东西,但这是我如何做我的部分背后的想法:
// Construct the wse proxy
MyServiceWse wsClient = new MyServiceWse();
// Assign the credentials
UsernameToken userToken = new UsernameToken("user", "pass", PasswordOption.SendPlainText);
wsClient.SetClientCredential(userToken);
wsClient.RequestSoapContext.IdentityToken = userToken;
// Find the client and service certificates
X509Certificate2 clientCert = MyCertificateManager.FindCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, "mycert.here.com");
X509Certificate2 serviceCert = MyCertificateManager.FindCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, "servicecert.there.com");
// Add the policy to the proxy
Policy policy = new Policy();
MySecurityClientAssertion assertion = new MySecurityClientAssertion();
assertion.SetServiceCertificate(serviceCert);
assertion.SetClientCertificate(clientCert);
policy.Assertions.Add(assertion);
wsClient.SetPolicy(policy);
// Assign the service URL and call an operation
wsClient.Url = "https://services.there.com/TheirService.asmx";
TheirOperationResponse r = wsClient.CallTheirOperation();
我当然希望我的代码是错误的,因为我能理解它比证书存储和信任链更好。任何帮助都会很棒。谢谢你的努力。
答案 0 :(得分:2)
如果链条存在问题,那么所有其他证书也必须在证书存储区中。
让我们从顶部开始;启动MMC并添加“证书管理”管理单元并将其指向本地计算机帐户。
现在,在受信任的根权限中,检查“VeriSign Class 3 Public Primary CA”,并匹配您尝试使用的证书中的根CA. (它应该在那里,那是标准的)。
接下来请查看www.verisign.com/CPS Incorp.by参考。责任有限公司(c)97 ......在中间证书当局商店。在我的机器上有两个,其中一个已过期。
如果他们都在那里,那么你需要更近一点地看一下证书链。在浏览器中加载Web服务,查看从浏览器获得的证书错误。如果您继续访问该网站,您将能够单击SSL图标并向上开始。单击挂锁并选择查看证书。然后选择证书路径选项卡。希望你会看到链条,问题证书突出显示(我现在找不到问题网站,所以我不记得它是什么样的)。选择最低的一个,然后突出显示错误并单击查看证书。您可能会发现它只是一个过期的证书或类似的东西。