Ранее уже приходилось сталкиваться с проблемой невозможности корректного развёртывания ПО из-за того, что на целевых компьютерах с OC Windows не обновляется хранилище сертификатов доверенных корневых центров сертификации (далее для краткости будем называет это хранилище TrustedRootCA). На тот момент вопрос был снят с помощью развёртывания пакета rootsupd.exe, доступного в статье KB931125, которая относилась к ОС Windows XP. Теперь же эта ОС полностью снята с поддержки Microsoft, и возможно, поэтому данная KB-статья более недоступна на сайте Microsoft. Ко всему этому можно добавить то, что уже даже на тот момент времени решение с развёртыванием уже устаревшего в ту пору пакета сертификатов было не самым оптимальным, так как тогда в ходу были системы с ОС Windows Vista и Windows 7, в которых уже присутствовал новый механизм автоматического обновления хранилища сертификатов TrustedRootCA. Вот одна из старых статей о Windows Vista, описывающих некоторые аспекты работы такого механизма - Certificate Support and Resulting Internet Communication in Windows Vista. Недавно я снова столкнулся с исходной проблемой необходимости обновления хранилища сертификатов TrustedRootCA на некоторой массе клиентских компьютеров и серверов на базе Windows. Все эти компьютеры не имеют прямого доступа в Интернет и поэтому механизм автоматического обновления сертификатов не выполняет свою задачу так, как хотелось бы. Вариант с открытием всем компьютерам прямого доступа в Интернет, пускай даже на определённые адреса, изначально рассматривался как крайний, а поиски более приемлемого решения привел меня к статье Configure Trusted Roots and Disallowed Certificates (RU), которая сразу дала ответы на все мои вопросы. Ну и, в общем то, по мотивам этой статьи, в данной заметке я кратко изложу на конкретном примере то, каким образом можно централизованно перенастроить на компьютерах Windows Vista и выше этот самый механизм авто-обновления хранилища сертификатов TrustedRootCA, чтобы он использовал в качестве источника обновлений файловый ресурс или веб-сайт в локальной корпоративной сети.
Для начала, на что нужно обратить внимание, это на то, что в групповых политиках, применяемых к компьютерам, не должен быть задействован параметр блокирующий работу механизма авто-обновления. Это параметр Turn off Automatic Root Certificates Update в разделе Computer Configuration > Administrative Templates > System > Internet Communication Management > Internet Communication settings. Нам потребуется, чтобы этот параметр был Выключен, либо просто Не настроен.
Если взглянуть на хранилище сертификатов TrustedRootCA в разделе Локальный компьютер, то на системах, не имеющих прямого доступа в Интернет, набор сертификатов будет прямо так скажем небольшой:
В статье KB2677070 - Доступно автоматическое обновление отозванных сертификатов для систем Windows Vista, Windows Server 2008, Windows 7 и Windows Server 2008 R2 можно найти актуальные на данный момент ссылки на файлы, прямой доступ к которым (минуя прокси с требованием аутентификации) может потребоваться для функций авто-обновления:
- http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/disallowedcertstl.cab
- http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab
Но вариант прямого доступа в рамках данной заметки мы больше упоминать не станем и рассмотрим пример локализации процесса обновления в соответствии с ранее упомянутой статьёй.
Первое, что нам нужно сделать, это рассмотреть варианты получения актуальных файлов набора корневых сертификатов для их дальнейшего распространения внутри локальной сети.
Попробуем на компьютере имеющем прямое подключение к Интернету выполнить команду генерации SST файла, который будет в себе содержать актуальный набор файлов корневых сертификатов. В данном случае на компьютере с Windows 10 выполняется команда, вызывающая входящую в базовый состав ОС утилиту Certutil, которая в свою очередь обращается к веб-узлу Microsoft и создаёт по указанному нами пути SST файл:
Certutil -generateSSTFromWU C:\Temp\WURoots.sst
Полученный в результате выполнения команды SST-файл по сути является контейнером, который содержит в себе все сертификаты для нужного нам обновления системы. Этот контейнер легко открывается в Проводнике Windows загружая ассоциированную с расширением файла оснастку управления сертификатами.
Этот файл удобно использовать, например, когда из всего подмножества доступных сертификатов нужно выбрать лишь некоторый набор и выгрузить их в отдельный SST файл для дальнейшей загрузки, например, с помощью консоли управления локальными сертификатами или с помощью консоли управления групповыми политиками (для импорта в какую-либо доменную политику через параметр Computer Configuration > Policies > Windows Settings > Security Settings > Public Key Policies > Trusted Root Certification Authorities).
Однако для интересующего нас способа распространения корневых сертификатов, с помощью модификации работы механизма авто-обновления на конечных клиентских компьютерах, нам потребуется несколько иное представление множества актуальных корневых сертификатов. Получить его можно с помощью всё той же утилиты Certutil, но уже с другим набором ключей.
В нашем примере в качестве локального источника распространения будет использована общая сетевая папка на файловом сервере. И здесь важно обратить внимание на то, что при подготовке такой папки обязательно нужно ограничивать доступ на запись, чтобы не получилось так, что любой желающий сможет модифицировать набор корневых сертификатов, которые потом будут "разливаться" по множеству компьютеров.
Certutil -syncWithWU -f -f \\FILE-SERVER\SHARE\RootCAupd\GPO-Deployment\
Ключи -f -f используются для форсированного обновления всех файлов в каталоге назначения.
В результате выполнения команды в указанной нами сетевой папке появится множество файлов общим объемом примерно в пол мегабайта:
Согласно ранее упомянутой статьи, назначение файлов следующее:
- Файл authrootstl.cab содержит сторонние списки доверия сертификатов;
- Файл disallowedcertstl.cab содержит список доверия сертификатов с недоверенными сертификатами;
- Файл disallowedcert.sst содержит хранилище сериализованных сертификатов, включая недоверенные сертификаты;
- Файлы с именами типа thumbprint.crt содержат сторонние корневые сертификаты.
Итак, файлы необходимые для работы механизма авто-обновления получены, и мы теперь переходим к реализации изменения схемы работы этого самого механизма. Для этого, как всегда, нам на помощь приходят доменные групповые политики Active Directory (GPO), хотя можно использовать и другие инструменты централизованного управления, весь всё, что нам нужно сделать на всех компьютерах - это изменить, вернее добавить, всего один параметр реестра RootDirURL в ветке HKLM\Software\Microsoft\SystemCertificates\AuthRoot\AutoUpdate, который и определит путь к нашему сетевому каталогу, в котором мы ранее разместили набор файлов корневых сертификатов.
Говоря о настройке GPO, для реализации поставленной задачи, опять же, можно использовать разные варианты. Например, есть "олд-скульный" вариант с созданием собственного шаблона групповой политики, так как это описано в уже знакомой нам статье. Для этого создадим файл в формате административного шаблона GPO (ADM), например, с именем RootCAUpdateLocalPath.adm и содержимым:
CLASS MACHINE CATEGORY !!SystemCertificates KEYNAME "Software\Microsoft\SystemCertificates\AuthRoot\AutoUpdate" POLICY !!RootDirURL EXPLAIN !!RootDirURL_help PART !!RootDirURL EDITTEXT VALUENAME "RootDirURL" END PART END POLICY END CATEGORY [strings] RootDirURL="URL address to be used instead of default ctldl.windowsupdate.com" RootDirURL_help="Enter a FILE or HTTP URL to use as the download location of the CTL files." SystemCertificates="Windows AutoUpdate Settings"
Скопируем этот файл на контроллер домена в каталог %SystemRoot%\inf (как правило, это каталог C:\Windows\inf). После этого перейдём в редактор доменных групповых политик и создадим отдельную новую политику, открыв затем её на редактирование. В разделе Computer Configuration > Administrative Templates… откроем контекстное меню и выберем пункт подключения нового шаблона политик Add/Remove Templates
В открывшееся окне с помощью кнопки обзора выберем ранее добавленный файл %SystemRoot%\inf\RootCAUpdateLocalPath.adm, и после того, как шаблон появится в списке, нажмём Close.
После проделанного действия в разделе Configuration > Administrative Templates > Classic Administrative Templates (ADM) появится группа Windows AutoUpdate Settings, в которой будет доступен единственный параметр URL address to be used instead of default ctldl.windowsupdate.com
Откроем этот параметр и введём путь к локальному ресурсу, на котором мы расположили загруженные ранее файлы обновления, в формате http://server1/folder или file://\\server1\folder,
например file://\\FILE-SERVER\SHARE\RootCAupd\GPO-Deployment
Сохраним проделанные изменения и применим созданную политику к доменному контейнеру, в котором расположены целевые компьютеры. Однако рассмотренный метод настройки GPO имеет ряд недостатков и именно поэтому я назвал его "олд-скульным".
Другой, более современный и более продвинутый метод настройки реестра клиентов - это использование Group Policy Preferences (GPP). При таком варианте мы можем создать соответствующий объект GPP в разделе групповой политики Computer Configuration > Preferences > Registry с обновлением параметра (Action: Update) реестра RootDirURL (тип значения REG_SZ)
При необходимости можем для созданного параметра GPP включить гибкий механизм нацеливания (Закладка Common > Опция Item-level targeting) на конкретный компьютер или группу компьютеров для предварительного тестирования того, что у нас в конечном итоге получиться после применения групповых политик.
Разумеется, нужно выбрать какой-то один вариант, либо с подключением собственного ADM-шаблона, либо с использованием GPP.
После настройки групповых политик на любом подопытном клиентском компьютере выполним обновление командой gpupdate /force c последующей перезагрузкой. После загрузки системы проверим в реестре наличие созданного ключа и попробуем проверить наличие факта обновления хранилища корневых сертификатов. Для проверки воспользуемся простым но действенным примером описанным в заметке Trusted Roots and Disallowed Certificates.
Для примера посмотрим, есть ли в хранилище сертификатов компьютера корневой сертификат, использованный для выпуска сертификата, который установлен на сайте с именем buypass.no (но на сам сайт пока не переходим :)).
Сделать это удобнее всего с помощью средств PowerShell:
Get-ChildItem cert:\localmachine\root | Where {$_.friendlyname -like "*Buypass*"}
С большой долей вероятности у нас не окажется такого корневого сертификата. Если так, то откроем Internet Explorer и обратимся к URL https://buypass.no. И если настроенный нами механизм автоматического обновления корневых сертификатов работает успешно, то в event-логе Windows Application при это появится событие c источником (Source) CAPI2, свидетельствующее об успешной загрузке нового корневого сертификата :
Имя журнала: Application Источник: Microsoft-Windows-CAPI2 Дата: 04.08.2016 18:20:45 Код события: 4097 Категория задачи:Отсутствует Уровень: Сведения Ключевые слова:Классический Пользователь: Н/Д Компьютер: KOM-WS306.holding.com Описание: Успешное автоматическое обновление стороннего корневого сертификата:: субъект: < CN=Buypass Class 3 Root CA, O=Buypass AS-983163327, C=NO > ; отпечаток SHA1: < DAFAF7FA6684EC068F1450BDC7C281A5BCA96457 > .
После этого мы можем снова выполнить указанную ранее команду запроса к хранилищу корневых сертификатов и увидим, что теперь в нём действительно появился новый корневой сертификат, именно тот который фигурировал в событии event-лога Windows:
Как видим, механизм авто-обновления работает и теперь всё, что остаётся, это организовать поддержку в актуальном состоянии файлов в сетевой папке, запланировав, например на ночное время, ежесуточное выполнение задания обновления ранее упомянутой командой:
Certutil -syncWithWU -f -f \\FILE-SERVER\SHARE\RootCAupd\GPO-Deployment\
На этом всё.
Дополнительные источники информации:
Отличная статья, спасибо огромное, очень помогла в своё время. А вот такой вопрос, почему на windows 10 эти сертификаты не распространяются через WSUS? А для машин на 7-ке подключенных так же к этому WSUS всё прекрасно работает. Пакеты обновления на WSUS включены идентичные что для 10-ки что для 7-ки
Здравствуйте Роман. Потому что Microsoft делает всё, чтобы вытащить корпоративных клиентов из офлайн режима в онлайн, и преследует далеко идущие планы, нацеленные на подсаживание на облачную иглу. Эта тенденция прослеживается во множестве их продуктов. Но мы им так просто не сдадимся :)
Здравствуйте, Алексей. Похоже всё таки проблема в другом, обнаружил в одной из групповых политик параметр "Выключить автоматическое обновление корневых сертификатов" в состоянии Включено (инфраструктура досталась от предыдущего админа, всего пока не разобрал), как у Вас написано в самом начале. Так что проблема обновления сертификатов скорее всего в 10-ке так же как и в 7-ке. А можно ли как то через wsus обновлять сертификаты корневых ЦА не прибегая к механизму создания нового параметра ГП или ещё как то? Разве они обновляются на обычных домашних машинах не через windows update?
Можно и по другому, так как хочет этого Microsoft - откройте прямой доступ машинам к узлам Microsoft.
То есть на домашних машинах сертификаты тоже обновляются через отдельный механизм а не windows update? Получается данный процесс нельзя контролировать, что Microsoft мне прислал тому я должен безоговорочно верить. Не есть хорошо конечно, но смысл я понял, либо вручную описанным Вами способом, либо никак при отсутствии доступа в инет. Спасибо за ответ.
Добрый день.
Вопрос не совсем по вашей статье, но имеет косвенное отношение. Что-то я запутался. Очевидно, что, если импортировать содержимое файла "disallowedcert.stl", то командой "CertUtil.exe -f -addstore "Disallowed" "disallowedcert.stl". А вот при импорте содержимого "authroot.stl" использовать логическое хранилище "Root" ("Доверенные корневые центры сертификации") или "AuthRoot" ("Сторонние корневые центры сертификации")? Или это не важно? И тот же вопрос по фйлу SST полученному командой "CertUtil.exe -generateSSTFromWU".