2009-07-15 6 views
2

Хорошо, я видел несколько вопросов, связанных с этой проблемой, и я пробовал много идей, представленных в них, без успеха. Вот моя ситуация:WCF - Не удается найти сертификат x.509, используя следующие критерии поиска

Я пользуюсь веб-службой через интранет моей компании. Я использовал 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, и соответствуют их значениям на серт без успеха. Что-то не так с моим кодом? Есть ли другой способ я могу запросить хранилище сертификатов для проверки значений, которые я передаю?

Машина dev, в которой я запускаю Visual Studio, импортировала сертификат.

+0

Имеет ли ваш сервис права на доступ к хранилищу корневых хранилищ LocalMachine. Вы не должны использовать SubjectName как FindType, чтобы перейти в ваш certstore и скопировать thumprint. Используйте это. – albertjan

ответ

3

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

  • вы уверены ваш certificiate установлен на всех?
  • Это сертификация специально для этой промежуточной машины?

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

Марк

+0

Ударьте меня на 20 секунд.:) – Randolpho

+0

- Я знаю это чувство - у меня был страшный апельсин. «Еще один ответ был опубликован». Баннер всплывает у меня бесчисленное количество раз :-) –

+0

Я думаю, что он установлен. Мне показалось, что я проверяю это, проверив диалоговое окно «Сертификаты». Когда я это сделаю, я могу увидеть сертификат на вкладке «Доверенные корневые центры сертификации». Нужно ли проверять что-нибудь еще, чтобы проверить? Сертификат не относится к машине. Он используется во всей сети для наших веб-сервисов. –

1

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

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

2

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

+0

Как импортировать сертификат в локальный магазин? – knagode