Распространить сертификат в кратчайшие сроки среди станций Windows любой ценой

от автора

В начале пандемии ’20 появилась задача — распространить корневой сертификат среди домашних персональных компьютеров, так как большое количество сотрудников стали работать по домам.

Сейчас прилетела задача распространить сертификат Минцифры.

В домене все понятно, добавил сертификат в политики GPO и поехали. А как быть с локальными (домашними) станциями Windows?

\\ Продолжаем тему PKI   https://habr.com/ru/post/549252/

Распространять среди сотрудников пошаговую инструкцию с картинками добавления сертификата в локальные политики безопасности!!? 

— это не работает!    Хоть в картинках хоть текстом, добавить сертификат туда, куда нужно, как выяснилось, иногда непосильная задача даже программисту!

Извечный вопрос – «Что с этим делать???»

На самом деле, все придумано давно, нужно просто уметь этим воспользоваться.

У Microsoft есть средство диспетчера сертификатов, которое позволяет выполнить задачу.

Более подробно тут

 Итак, у нас есть средство Certmgr.exe, можно считать, что задача в кармане!

— отчасти да, но нет!   Средство нужно запустить от имени администратора с требуемыми параметрами.  Возвращаемся в пункт один инструкция в картинках (

 

Решение

Что ж, сделаем все ровно и без вопросов.  Напишем небольшой код (батник), который решит вопрос.

@echo off set dir=%~dp0 %dir:~0,2% CD "%~dp0\CertSetup\" md "%CD%\log\" del /f /q "%cd%\log\*.*" echo %cd%  CLS Echo . Echo "Внимание!!! - Приложение должно быть запущено от имени Администратора!" Echo . Echo .  REM download REM download  REM Root for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\ROOT\*"') do "%cd%\bin\certmgr.exe" -add -c "%CD%\CertCentre\ROOT\%%a" -s -r localMachine root  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\ROOT\*"') do echo %%a >> "%cd%\log\CRTroot.log"  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\ROOT\CRL\*"') do "%cd%\bin\certmgr.exe" -add "%CD%\CertCentre\ROOT\CRL\%%a" -s -r localMachine root  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\ROOT\CRL\*"') do echo %%a >> "%cd%\log\CRLroot.log"  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\ROOT\DelSHA1\*"') do "%cd%\bin\certmgr.exe" -del -c -sha1 "%%a" -s -r localMachine root  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\ROOT\DelSHA1\*"') do echo %%a >> "%cd%\log\DELroot.log"  REM CA for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\CA\*"') do "%cd%\bin\certmgr.exe" -add -c "%CD%\CertCentre\CA\%%a" -s -r localMachine CA  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\CA\*"') do echo %%a >> "%cd%\log\CRTca.log"  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\CA\CRL\*"') do "%cd%\bin\certmgr.exe" -add "%CD%\CertCentre\CA\CRL\%%a" -s -r localMachine CA  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\CA\CRL\*"') do echo %%a >> "%cd%\log\CRLca.log"  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\CA\DelSHA1\*"') do "%cd%\bin\certmgr.exe" -del -c -sha1 "%%a" -s -r localMachine CA  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\CA\DelSHA1\*"') do echo %%a >> "%cd%\log\DELca.log"  REM Disallowed for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\Disallowed\*"') do "%cd%\bin\certmgr.exe" -add -c "%CD%\CertCentre\Disallowed\%%a" -s -r localMachine Disallowed  for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\Disallowed\*"') do echo %%a >> "%cd%\log\CRTDisallowed.log"  Rem ADMIN openfiles If %Errorlevel% == 1 Goto :notadmin  REM FindErrorRoot for /f "delims=" %%a in ('dir /b /a-d "%CD%\CertCentre\ROOT\*"') do "%cd%\bin\certmgr.exe" "%CD%\CertCentre\ROOT\%%a" >> "%cd%\log\FindErrorROOT.log" find "Failed" "%cd%\log\FindErrorROOT.log" if "%ERRORLEVEL%" == "0" Goto :notsetup  CLS mode con:cols=70 lines=70 Echo . ECHO Установлены следующие сертификаты if exist "%cd%\log\CRTroot.log" Echo -----------------------------------------------ROOT: if exist "%cd%\log\CRTroot.log" TYPE "%cd%\log\CRTroot.log" if exist "%cd%\log\CRTca.log" Echo -----------------------------------------------CA: if exist "%cd%\log\CRTca.log" TYPE "%cd%\log\CRTca.log" Echo .  ECHO Установлены списки отзывов if exist "%cd%\log\CRLroot.log" Echo -----------------------------------------------ROOT: if exist "%cd%\log\CRLroot.log" TYPE "%cd%\log\CRLroot.log" if exist "%cd%\log\CRLca.log" Echo -----------------------------------------------CA: if exist "%cd%\log\CRLca.log" TYPE "%cd%\log\CRLca.log" Echo .  if exist "%cd%\log\CRTDisallowed.log" ECHO Отозваны следующие сертификаты: if exist "%cd%\log\CRTDisallowed.log" Echo ----------------------------------------------- if exist "%cd%\log\CRTDisallowed.log" TYPE "%cd%\log\CRTDisallowed.log" Echo .  Echo . ECHO Удалены сертификаты с отпечатками SHA1: if exist "%cd%\log\DELroot.log" Echo -----------------------------------------------ROOT: if exist "%cd%\log\DELroot.log" TYPE "%cd%\log\DELroot.log" if exist "%cd%\log\DELca.log" Echo -----------------------------------------------CA: if exist "%cd%\log\DELca.log" TYPE "%cd%\log\DELca.log" Echo . Echo . Echo                           -= All OK =-  ping 127.0.0.1 -n 20 > null exit  :notsetup CLS Echo . Echo "Внимание!!! - Приложение должно быть запущено от имени Администратора!" Echo . Echo -> Один или несколько, корневых сертификатов не установлены !!! pause exit  :notadmin CLS Echo . Echo "Внимание!!! - Приложение должно быть запущено от имени Администратора!" Echo . pause exit

Разберем, что делает данный батник

батник перебирает ряд каталогов и выполняет регистрацию сертификатов, которые расположены в этих каталогах:

Более детально

\CertCentre\ROOT\    

Здесь разместим наши сертификаты CER (можно несколько) 

Данные сертификаты попадут в “Доверительные корневые центры сертификации”.

Для данных сертификатов выполнится функция:  

certmgr.exe -add -c "*cert" -s -r localMachine root

\CertCentre\ROOT\CRL\

Директория CRL содержит списки отзыва (если необходимо)

Функция:   certmgr.exe  -add "*crl"  -s -r localMachine root 

\CertCentre\ROOT\DelSHA1\

В данной директории мы можем разместить

файлы с именем отпечатка сертификата, для его отзыва

Функция:   certmgr.exe" -del -c -sha1 "****sha1" -s -r localMachine root

Где взять отпечаток?

\CertCentre\CA\

Все аналогично ROOT, только сертификаты будут попадать в “Промежуточные центры сертификации”.

аналогично ROOT \CertCentre\CA\CRL\ \CertCentre\CA\DelSHA1\

\CertCentre\Disallowed\

Все аналогично ROOT, только сертификаты будут попадать в “Сертификаты, к которым нет доверия”.

Загрузка “свежих” сертификатов из сети

Код можно улучшить, добавив в секцию —  “REM download”    следующий код.

Код даст возможность загрузки обновленных версий сертификатов с подконтрольного сервера. Загружаемый архив должен иметь формат ZIP и содержать структуру каталога \CertCentre\ для её замены на загружаемую из сети.

Choice /D Y /T 30 /M "Загрузить последние цепочки сертификатов из сети Интернет?  ->" If %Errorlevel% == 1 Goto Yes If %Errorlevel% == 2 Goto No  :Yes "%cd%\bin\Curl.exe" -O http://cert.sslkey.ru/CertCentre/PKI.zip find "CertCentre" "%cd%\PKI.zip" if "%ERRORLEVEL%" NEQ "0" del /f /q "%cd%\PKI.zip" if exist "%cd%\PKI.zip" RENAME "%cd%\CertCentre\" "CertCentreOLD-%Date%" if exist "%cd%\PKI.zip" "%cd%\bin\7z.exe" x "%cd%\PKI.zip" -y -o"%CD%\" -r CLS if not exist "%cd%\PKI.zip"  ECHO Не удалось загрузить последние цепочки сертификатов! if not exist "%cd%\PKI.zip"  ping 127.0.0.1 > null :No

Исполнительные файлы

Исполнительные файлы располагаются в каталоге \BIN 

Основной файл, который решает нашу задачу — certmgr.exe

CertMgr доступен в составе Windows SDK

LOG

Каталог \LOG  содержит лог выполнения программы.  Лог формальный и не может использоваться для отладки.

Итак, у нас есть батник, который необходимо запустить от админа для выполнения необходимых функций (батник умеет проверять, есть ли у него достаточные права).

Пример выполнения BAT

Делаем EXE

Сделаем EXE, я буду использовать WinRAR

Пакуем в SFX

SFX
SFX
Path=%APPDATA%\crtROOT
Path=%APPDATA%\crtROOT
Setup=%APPDATA%\crtROOT\setup.bat
Setup=%APPDATA%\crtROOT\setup.bat
С правами Админа
С правами Админа
Перезаписать
Перезаписать

Все, у нас есть EXE, который при запуске запросит права Администратора для установки сертификата.

Готовый пример

Прикладываю готовый пример на примере корневого сертификата Минцифры

https://disk.yandex.ru/d/mxw3TFZFzGFXNw


ссылка на оригинал статьи https://habr.com/ru/post/663340/