1

我正在编写一个使用公共 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();

我当然希望我的代码是错误的,因为我比证书存储和信任链的东西更能理解它。任何帮助都会很棒。谢谢你的努力。

4

1 回答 1

2

如果问题出在链上,那么所有其他证书也需要在证书存储中。

所以让我们从顶部开始;启动 MMC 并添加证书管理管理单元并将其指向本地计算机帐户。

现在在受信任的根授权中检查“VeriSign Class 3 Public Primary CA”是否存在,并且与您尝试使用的证书中的根 CA 匹配。(它应该在那里,这是一个标准的)。

接下来检查 www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97... 位于中间证书颁发机构存储中。在我的机器上有两个,其中一个已过期。

如果它们都在那里,那么您需要更仔细地查看证书链。在您的浏览器中加载 Web 服务并查看您从浏览器收到的证书错误。如果您继续访问该站点,您将能够单击 SSL 图标并沿着链向上工作。单击挂锁并选择查看证书。然后选择证书路径选项卡。希望在那里您会看到链,并突出显示问题证书(我现在找不到问题网站,所以我不记得它是什么样子了)。选择最低的一个并通过突出显示它并单击查看证书来查看错误是什么。您可能会发现它只是一个过期的证书或类似的东西。

于 2009-10-02T11:42:44.607 回答