Статус: Новичок
Группы: Участники
Зарегистрирован: 07.06.2023(UTC) Сообщений: 5
|
Доброе время суток. Пишу службу, которой нужно смотреть в пользовательские сертификаты, в том числе персональные сертификаты пользователей, а не компьютера. Когда из-под учётки пользователя выполняю код Код:CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, IntPtr.Zero, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_READONLY_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, "My");
хранилище открывается, сертификат с помощью CertFindCertificateInStore находится. Но служба запускается из-под LOCAL_SYSTEM, это другой пользователь, через CURRENT_USER тот сертификат не видно. Пробую: Код:HCERTSTORE hSysStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, IntPtr.Zero, CERT_SYSTEM_STORE_USERS | CERT_STORE_READONLY_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, "sid пользователя\My");
хранилище открывается, но сертификат не находится. Как решить? Просить каждого пользователя переносить сертификаты в другое место не хочу, запускать службу то от одного пользователя, то от другого - тоже кривой вариант. И ещё: в HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates пользователя пусто, редактор реестра говорит, что сертификат лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates (certutil это подтверждает: certutil -store My сертификат есть, certutil -user -store My пусто). Почему тогда сертификат находится через CERT_SYSTEM_STORE_CURRENT_USER, а не CERT_SYSTEM_STORE_LOCAL_MACHINE? Отредактировано пользователем 7 июня 2023 г. 4:32:27(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 07.06.2023(UTC) Сообщений: 5
|
Стало чуть понятнее, где что хранится. В случае сертификатов компа: Сертификат - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\My\Certificates Ссылка на ключ - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\My\Keys Сам ключ (если хранится в реестре) - HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Keys Сам ключ (если хранится в директории) - C:\Users\All Users\Crypto Pro\Crypto
Для сертификатов пользователя: Сертификат - C:\Users\имя_пользователя\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates Ссылка на ключ - C:\Users\имя_пользователя\AppData\Roaming\Microsoft\SystemCertificates\My\Keys Сам ключ (если хранится в реестре) - HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Users\sid_пользователя\Keys Сам ключ (если хранится в директории) - C:\Users\имя_пользователя\AppData\Local\Crypto Pro
Т.е. сертификаты/ключи пользователя лежат вообще не в реестре. При этом CertOpenStore CERT_SYSTEM_STORE_CURRENT_USER каким-то чудом их подгружает, а CertOpenStore CERT_SYSTEM_STORE_USERS - нет.
Вопрос, как нормальным путём админу получить сертификаты всех пользователей, остался открытым...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,297 Сказал «Спасибо»: 549 раз Поблагодарили: 2201 раз в 1717 постах
|
Здравствуйте.
А доменные политики, запуск при входе не рассматривается? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 07.06.2023(UTC) Сообщений: 5
|
Хотелось бы, чтоб решение работало независимо от того, залогинился отдельно взятый пользователь или нет.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.11.2010(UTC) Сообщений: 1,093
Сказал(а) «Спасибо»: 7 раз Поблагодарили: 150 раз в 135 постах
|
Теоретически, некоторые учётные записи имеют право "перевоплощения" (Impersonation). Код, конечно, не подскажу, даже примерно, но я бы копал в эту сторону.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 07.06.2023(UTC) Сообщений: 5
|
Автор: basid Теоретически, некоторые учётные записи имеют право "перевоплощения" (Impersonation). Код, конечно, не подскажу, даже примерно, но я бы копал в эту сторону. Итог нескольких дней ковыряний. Нормальное использование олицетворения, например, через функцию CreateToken подразумевает, что вы знаете пароль учётной записи. Я закопался в руткитоподобное использование недокументированной NtCreateToken (благодаря nuget пакету NtApiDotNet это было чуть проще): тырим токен у процесса lsass.exe - используя его, вызываем NtCreateToken для создания токена нужной учётки (без использования пароля) - используя его, обращаемся к хранилищу сертификатов и... ничего не поменялось, сертификат пользователя не находится.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 07.06.2023(UTC) Сообщений: 5
|
В общем, решил задачу временным копированием сертификатов всех пользователей в LocalSystem. Странно, конечно, что для таких случаев нет нормального API.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close