Я пишу систему, которая использует общедоступный веб-сервис. Я потребляю веб-сервис, используя VS2008 и классическую технологию веб-сервисов .NET Framework 2.0. Моя проблема не поглощает веб-службу и не вызывает ее.WSE3003: Цепочка доверия сертификата не может быть проверена
Проблема заключается в том, что когда я получаю ответ от операции, которую он подписывает и за кадром, сгенерированный прокси начинает проверку подписи. И в то время я получаю ошибку WSE3003. Я (думаю я) загрузили сертификат службы в моем LocalComputer хранилище сертификатов/TrustedPeople и когда я смотрю на это путь к сертификату я могу видеть, что все в порядке:
VeriSign Class 3 Public Primary CA
www.verisign.com/CPS Incorp.by Ref. ОТВЕТСТВЕННОСТЬ LTD (с) 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();
Я уверен, надеюсь, что мой код является неправильным, потому Я могу понять, что это намного лучше, чем хранилище сертификатов и цепочки доверия. Любая помощь будет большой. Спасибо за ваши усилия.