2012-05-31 8 views
0

Я выдаю себя за учетную запись пользователя службы, чтобы подключиться к веб-сервису, требующему подключения к сертификату. Я установил клиентский сертификат в учетной записи службы на компьютере, на котором запущен код, однако я получаю сообщение об ошибке System.Security.Cryptography.CryptographicException: система не может найти указанный файл.Доступ к хранилищу ключей для олицетворенных пользователей

using (var ctx = new ImpersonationContext("svcAcctUserName", "domain", "password")) 
{ 
    var clientCert = new X509Certificate2("filePath", "certPassword"); 
} 

Код олицетворение работает, для краткости я оставил его, но я проверить, чтобы убедиться, что мой контекст переключается пользователем svcAcctUserName, регистрируя Environment.UserName, который показывает, что я бегу, как svcAcctUserName. FilePath верен, и я оставил его, но я открываю и закрываю файл перед тем, как создать объект X509Certificate2, чтобы убедиться, что у меня есть как доступ к файлу, так и правильный путь.

Ошибка запутанна, так как я предоставляю путь в качестве параметра, и я знаю, что пользователь имеет доступ к коду.

EDIT:

также пытались сделать это: How to call a Web service by using a client certificate for authentication in an ASP.NET Web application

Хотя я не использую приложение ASP.NET, я дал ему попробовать в любом случае. Я добавил надстройку сертификатов в mmc, добавил сертификаты «локального компьютера», а затем импортировал сертификат в личный хранилище локального компьютера.

Я побежал:

WinHttpCertCfg.exe -g -c LOCAL_MACHINE\My -s issuedToName -a domain\svcAcctUserName 

попытался запустить операцию снова, по-прежнему та же проблема.

Что мне не хватает?

+0

Как вы работаете на веб-сервисе? Установлен ли сертификат в хранилище ключей или находится только в файловой системе? – Brian

+0

Он находится в хранилище личных ключей выданной учетной записи службы и в хранилище ключей local_machines с разрешением, предоставленным для доступа к ней через олицетворенного пользователя. См. Ниже, что я пробовал. – Bitfiddler

+0

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

ответ

1

Итак, как заметил Алекс, я не понимаю базовую архитектуру системы сертификатов в окнах. Однако после выполнения вышеуказанных шагов и изменения моего кода для использования X509Store у меня есть работа. Надеемся, это поможет кому-то:

using (var ctx = new ImpersonationContext("svcAcctUserName", "domain", "password")) 
{ 
    var store = new X509Store(StoreLocation.LocalMachine); 
    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 
    var clientCert = store.Certificates.Find(X509FindType.FindByIssuerName, "IssuerNameHere", false); 
    var clientCert2 = new X509Certificate2(clientCert[0]); 
} 
+0

+1 для публикации решения (не стесняйтесь принять его - хорошо, чтобы это сделать). Примечания: есть очень смягченные ограничения по размеру вашего исходного вопроса (а не комментарии), так что поставьте там вопросы. Вы можете свободно редактировать свой вопрос даже с 1 репутацией. Ввод кода в комментариях был бы намного хуже ... Когда вы «ответили» на свой вопрос своим предыдущим комментарием, вы, по сути, сделали много людей, чтобы пропустить «ответ» на вопрос, таким образом снижая шансы получить ответ. –

+0

Я не могу принять свой собственный ответ еще на 2 дня, к сожалению. Однако я нахожу, что, когда люди постоянно редактируют свой оригинальный вопрос в ответ на комментарии, это затрудняет отслеживание для людей, которые позже пытаются следовать потоку решения.Я, например, предпочитаю знать, как люди пришли к решению, путешествие во много раз было столь же поучительным, как и ответ, но когда у вас есть вопрос, который был отредактирован 5 раз в ответ на комментарии, его сложно перестроить порядок того, что произошло. – Bitfiddler

+0

Кроме того, я не обращаю внимания на точечную систему, поэтому я не особо обеспокоен тем, что кто-то не помечает мой ответ правильно. Если мое решение будет прочитано, и это поможет кому-то ... отлично. Независимо от того, получаю ли я кредит (хотя кредит приветствуется). – Bitfiddler