Хорошо, я видел несколько вопросов, связанных с этой проблемой, и я пробовал много идей, представленных в них, без успеха. Вот моя ситуация: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, импортировала сертификат.
Имеет ли ваш сервис права на доступ к хранилищу корневых хранилищ LocalMachine. Вы не должны использовать SubjectName как FindType, чтобы перейти в ваш certstore и скопировать thumprint. Используйте это. – albertjan