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