В начале пандемии ’20 появилась задача - распространить корневой сертификат среди домашних персональных компьютеров, так как большое количество сотрудников стали работать по домам.
Сейчас прилетела задача распространить сертификат Минцифры.
В домене все понятно, добавил сертификат в политики GPO и поехали. А как быть с локальными (домашними) станциями Windows?
Продолжаем тему PKI.
Распространять среди сотрудников пошаговую инструкцию с картинками добавления сертификата в локальные политики безопасности!?
Это не работает! Хоть в картинках хоть текстом, добавить сертификат туда, куда нужно, как выяснилось, иногда непосильная задача даже программисту!
Извечный вопрос – «Что с этим делать?»
На самом деле, все придумано давно, нужно просто уметь этим воспользоваться.
У 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.
Все, у нас есть EXE, который при запуске запросит права Администратора для установки сертификата.
Готовый пример
Прикладываю готовый пример на примере корневого сертификата Минцифры: ссылка на Yandex.Disk.