WCF - не удается найти сертификат x.509, используя следующие критерии поиска - PullRequest
2 голосов
/ 16 июля 2009

Хорошо, я видел несколько вопросов, связанных с этой проблемой, и я попробовал много идей, представленных в них, но безуспешно. Вот моя ситуация:

Я подключаюсь к веб-сервису через интранет моей компании. Я использовал svcutil.exe для генерации клиентского класса для WCF. Мне удалось без проблем запустить вызов веб-службы, когда служба находилась в разработке и не требовала учетных данных для аутентификации, поэтому я знаю, что код работает. В то время код работал по SSL. Я импортировал требуемый сертификат в хранилище доверенных корневых центров сертификации, и все было в порядке.

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

Вот пример моей конфигурации, сгенерированной svcutil:

<system.serviceModel>
  <bindings>
   <basicHttpBinding>
    <binding 
        name="xxxSOAPBinding" 
        .... (irrelevant config settings)....
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <security mode="Transport">
      <transport clientCredentialType="Certificate" />
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>
  <client>
   <endpoint address="https://xxxServices_1_0_0"
    binding="basicHttpBinding" bindingConfiguration="xxxSOAPBinding" 
    contract="xxxService" name="xxxService" />
  </client>
 </system.serviceModel>

А вот код, который я использую для подключения. Исключение выдается, как только я пытаюсь найти сертификат:

using (var svc = new xxxServiceClient())
{
    svc.ClientCredentials.UserName.UserName = "XXX";
    svc.ClientCredentials.UserName.Password = "XXX";

    svc.ClientCredentials.ClientCertificate
     .SetCertificate(StoreLocation.LocalMachine, StoreName.Root, 
                     X509FindType.FindBySubjectName, "xxx");
...
}

Я попробовал несколько различных типов X509FindTypes и сопоставил их со значениями в сертификате, но безуспешно. Что-то не так с моим кодом? Есть ли другой способ запросить хранилище сертификатов для проверки значений, которые я передаю?

На компьютере разработчика, на котором я работаю, Visual Studio импортировал сертификат.

Ответы [ 3 ]

3 голосов
/ 16 июля 2009

Два глупых вопроса:

  • Вы уверены Ваш сертификат установлен вообще?
  • это сертификат специально для этой постановочной машины?

Кроме того, кажется немного странным, что вы сначала устанавливаете имя пользователя / пароль, а затем также устанавливаете учетные данные. Можете ли вы закомментировать часть имени пользователя / пароля? Имеет ли это какое-то значение?

Марк

2 голосов
/ 16 июля 2009

Вы уверены, что сертификат был импортирован в локальное хранилище компьютеров, это может быть в хранилище CurrentUser.

1 голос
/ 16 июля 2009

Это может звучать глупо, но вы уверены, что новый сертификат для промежуточной службы установлен в вашем хранилище сертификатов? Это, скорее всего, ваша проблема.

Кроме того, поскольку вы не упомянули, какое исключение выдается, возможно, проблема в том, что вы установили учетные данные имени пользователя / пароля перед установкой учетных данных clientcertificate, когда ваша привязка не указывает на использование имени пользователя / пароля. Может быть проблема там; они взаимоисключающие, IIRC.

...