04.05.2007 9:13:24При работе WebServic'а не находится сертификат Ответов: 8
Александр
Есть библиотека на С#, которая инкапсулирует в себе работу с CryptoPro.
Данную библиотеку задействовал из WebService развернутый из под IIS 6.0 (ос Windows 2003 Server).
Создал новую учетную запись ААА.
Сервис запускаю от имени пользователя ААА.
Установил сертификат в личное хранилище пользователя ААА.
Возникла следующая проблема. После перезагрузки системы, при обращении к WebService'у получаю ошибку "Не найден сертификат", но после входа в систему от имени пользователя ААА, сертификат находится и все работает.
Если выйти из системы пользователем AAA, проблема повторится спустя некоторое время.

Как можно решить проблему?

Заранее спасибо.
 
Ответы:
04.05.2007 15:23:56Василий
Обычно, если делается веб-сервис, он работает с сертификатом (и ключевым контейнером) LOCAL MACHINE, а не пользовательскими.
04.05.2007 15:40:00Александр
Если я не ошибаюсь в этом случае необходимо учетной записи, от которой запускается сервис давать админские права. Иначе сервис не сможет обратится к локальному хранилищу. Чего делать не хочется.
04.05.2007 17:06:52Василий
Вопрос. Запустите от имени этого аккаунта приложение (или сервис), в котором будет вызов csptest.exe (имеется в папке установки CSP 3.0, т.е. \Program Files\Crypto Pro\CSP) с параметрами:

csptest -keyset -check -container имя_контейнера

сможет он его прочитать?
06.05.2007 14:42:27Александр
День добрый.
Реализовал вызов из сервиса программы csptest. Вот выходная информация:

SP (Type:71) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
CSP (Type:75) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
CryptAcquireContext succeeded.HCRYPTPROV: 1354376
CryptGetProvParam succeeded.
Provider name: Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
A crypto context has been acquired and
The name on the key container is "test11"

No signature key is available.
An exchange key exists. HCRYPTKEY: 0x14eb68
Check key passed.
Everything is OK.
A an exchange key
exist in the "test11" key container.
Total: SYS: 0.070 sec USR: 0.130 sec UTC: 0.230 sec
[ErrorCode: 0x00000000]
07.05.2007 11:23:12Василий
Значит, с контейнером (и с правами доступа к нему) всё в порядке.
Вероятно, есть особенности при получении именно сертификата, а не контейнера.

Для теста сделайте сертификат с алгоритмом RSA (на Microsoft CSP) и посмотрите, как будет себя вести.
07.05.2007 12:03:19Александр
Добрый день.
Попробовал с другим сертификатом - ситуация не изменилась. Попрежнему не находит сертификат.

07.05.2007 13:58:47Александр
Кажется начал понимать откуда ноги растут.
Сделал следующее.
Написал консольное приложение, которое выполняет обращение обращение к библиотеке (билиотека инкапсулирует работу с CryptoPro). В приложениеи перед вызовом метода подписка осуществляю имерсонализацию на пользователя AAA (для пользователя ААА установлен сертификат в локальное хранилище). Если посмотреть в EventViewer.Security, то можно видеть как logon'интся пользователь AAA. Но библиотека возвращает ошибку - сертификат не найден.

Далее руками logon'имся пользователем AAA, запускаем консольное приложение - Все ок.

Далее запускаем консольное приложение, но не выполняем обратную смену пользователя после персонализации а преостанавливаем выполнение и осуществляет logoff пользователя AAA из системы.
Смотрим в EventLog и видим следующее предупреждение:

Windows cannot unload your classes registry file - it is still in use by other applications or services. The file will be unloaded when it is no longer in use.

Отсюда вывод:
Персонализация на пользователя AAA не осуществляет загрузку в реестр необходимых данных. Т.к сертификат установлен на считыватель 'Реестр' в локальное хранилище пользователя AAA. То он не доступен, т.к не загружен в реестр.
Раз при запуске Web-сервиса от имени локальной учетной записи происходит именно имперсонализация, то все вышесказонное относится и к исходной проблеме с доступом к сертификату из WebServic'а.

Немного сумбурно получилось.


08.05.2007 10:04:18Василий
Может, всё-таки проще использовать хранилище компьютера, а не пользователя?
Админом для этого быть не обязательно - дайте права (пользователю AAA) на чтение на раздел (и подразделы)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates
и на чтение-запись на раздел и подразделы
HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Settings\Keys (если ключевой контейнер будет в реестре)