2009-10-02 1 views
1

Я пишу систему, которая использует общедоступный веб-сервис. Я потребляю веб-сервис, используя 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(); 

Я уверен, надеюсь, что мой код является неправильным, потому Я могу понять, что это намного лучше, чем хранилище сертификатов и цепочки доверия. Любая помощь будет большой. Спасибо за ваши усилия.

ответ

2

Если проблема связана с цепью, то все остальные сертификаты должны быть также в хранилище сертификатов.

Итак, давайте начнем с верхней; запустите MMC и добавьте оснастку «Управление сертификатами» и укажите его на учетную запись локального компьютера.

Теперь в доверенном корневом центре имеется флажок «Открытый первичный CA VeriSign Class 3» и соответствует корневому ЦС в сертификате, который вы пытаетесь использовать. (он должен быть там, это стандартный).

Далее проверьте, что www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD. (C) 97 ... находится в магазине промежуточных сертификатов. На моей машине есть два из них, один из которых истек.

Если они оба там, вам нужно немного приблизиться к цепочке сертификатов. Загрузите веб-службу в свой браузер и посмотрите, какую ошибку сертификата вы получите в браузере. Если вы перейдете на сайт, вы сможете щелкнуть значок SSL и проложить путь вверх по цепочке. Нажмите на замок и выберите сертификаты вида. Затем выберите вкладку пути сертификации. Надеюсь, там вы увидите цепочку и выделены проблемы cert (я не могу найти проблемный веб-сайт прямо сейчас, поэтому не могу вспомнить, как это выглядит). Выберите самую низкую и посмотрите, что это за ошибка, выделив ее и нажав на сертификат вида. Вы можете обнаружить, что это просто сертификат с истекшим сроком действия или что-то в этом роде.