WCF - Не удается найти сертификат x.509, используя следующие критерии поиска
-
16-09-2019 - |
Вопрос
Хорошо, я видел несколько вопросов, связанных с этой проблемой, и я перепробовал множество идей, представленных в них, но безуспешно.Вот моя ситуация:
Я подключаюсь к веб-сервису через внутреннюю сеть моей компании.Я использовал svcutil.exe для создания клиентского класса для WCF.Я смог без проблем запустить вызов веб-службы, когда служба находилась в разработке и не требовала учетных данных для аутентификации, поэтому я знаю, что код работает.В то время код работал по протоколу SSL.Я импортировал необходимый сертификат в хранилище доверенных корневых центров сертификации, и все было в порядке.
Мы только что перешли в среду stage, и служба была обновлена, чтобы требовать учетные данные для подключения.Я переключил свое соединение на новую конечную точку и добавил код для аутентификации.Это мой первый раз, когда я работаю с 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, был импортирован сертификат.
Решение
Два глупых вопроса:
- это ты конечно ваш сертификат вообще установлен?
- является ли это сертификатом специально для этой промежуточной машины?
Кроме того, кажется немного странным, что вы сначала устанавливаете имя пользователя / пароль, а затем также устанавливаете учетные данные.Можете ли вы прокомментировать часть имени пользователя / пароля?Имеет ли это какое-то значение?
Марк
Другие советы
Вы уверены, что сертификат был импортирован в хранилище локального компьютера, он может находиться в хранилище текущего пользователя.
Это может показаться глупым, но вы уверены, что новый сертификат для промежуточной службы был установлен в вашем хранилище сертификатов?Скорее всего, это ваша проблема.
Кроме того, поскольку вы не упомянули, какое генерируется исключение, возможно, проблема в том, что вы установили учетные данные имени пользователя / пароля перед установкой учетных данных clientcertificate , когда ваша привязка не указывает на использование имени пользователя / пароля.Там может быть проблема;они взаимоисключающие, IIRC.