我正在编写一个使用公共 Web 服务的系统。我正在使用 VS2008 和经典的 .NET Framework 2.0 Web 服务技术使用 Web 服务。我的问题不在于使用 Web 服务或调用它的操作。
问题是当我从操作中得到响应时,它已被签名,并且在幕后生成的代理开始验证签名。那时我收到 WSE3003 错误。我(想我)已经将服务证书加载到我的 LocalComputer/TrustedPeople 证书存储中,当我查看它的证书路径时,我可以看到一切正常:
VeriSign 3 类公共主要 CA
www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97...
servcert.there.com
但我不断收到以下异常:
Microsoft.Web.Services3.ResponseProcessingException: WSE910: 响应消息处理过程中发生错误,您可以在内部异常中找到错误。您还可以在 Response 属性中找到响应消息。---> 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();
我当然希望我的代码是错误的,因为我比证书存储和信任链的东西更能理解它。任何帮助都会很棒。谢谢你的努力。