Как получить доступ к системным закрытым ключам из учетной записи виртуальной службы? - PullRequest
1 голос
/ 05 апреля 2019

Я работаю над службой NT, которая использует SChannel для поддержки клиентских соединений TLS.Сертификаты устанавливаются вручную через диспетчер сертификатов локального компьютера (certlm.msc) в пользовательское хранилище сертификатов, называемое «Public Hub Interface».Служба уже работает в течение нескольких месяцев и, помимо проблемы, описанной ниже, работает без сбоев.

Хотя в LocalSystem все работает нормально, для обеспечения максимальной безопасности я пытаюсь использовать учетную запись виртуальной службы, например "NT Service \ Public Hub Interface".Однако, поскольку учетная запись настолько сильно ограничена, служба больше не имеет доступа к закрытым ключам системы, что, следовательно, заставляет AcquireCredentialsHandle возвращать SEC_E_UNKNOWN_CREDENTIALS.Я пытался вручную и программно предоставить доступ к различным объектам файлов и реестра, как описано в следующих ссылках, но с частичным успехом - сертификаты CAPI работают, но не CNG.

https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/d2a477c4-c366-4a68-8014-83632651bc91/how-to-grant-an-account-access-to-the-certificate-in-a-service-store-programmatically?forum=windowssecurity

https://docs.microsoft.com/en-us/windows/desktop/seccng/key-storage-and-retrieval

https://docs.microsoft.com/en-us/windows/desktop/SecCrypto/modifying-key-container-access

https://www.codeguru.com/cpp/i-n/internet/security/article.php/c6211/Security-Certificates-Treatment-with-CryptoAPI.htm

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

Я бы не хотел переключаться с поставщика хранилища на локальной машине на службу (т. е. провайдер магазина текущего пользователя, тем более что я очень близок к выпуску и у меня нет времени модифицировать / повторно тестировать уже работающий код, не говоря уже о повторном импорте сертификатов, а также переобучении операторов новой процедуры.Поэтому я надеюсь, что существует простой и надежный способ предоставления службе того же доступа к системным закрытым ключам, что и для учетной записи LocalSystem.

Обратите внимание, что служба устанавливается через пакет MSI, который используетнеуправляемая библиотека пользовательских действий C ++ для выполнения сложных операций, таких как настройка параметров восстановления службы и создание хранилища сертификатов;Я планирую использовать эту же DLL для установки необходимого доступа во время установки.Тем не менее, я бы предпочел программное решение, которое использует внешнюю программу (например, WinHttpCertCfg.exe или CertUtil.exe), которая может даже не работать на целевой системе, или должна быть включена в пакет, если онаеще не существует.

Большое спасибо за любую помощь.

...