В начале пандемии ’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.

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

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

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

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

Комментарии (27)


  1. aborouhin
    28.04.2022 02:30
    +4

    Надеюсь, Вы предупреждаете сотрудников о всех рисках установки корневого сертификата ЦА Минцифры на их домашние компьютеры, прежде чем рассылать описанный exe-шник...


    1. alexcccp Автор
      28.04.2022 02:38

      Обязательно!

      Все политики выдачи
      Все политики применения


      1. akhkmed
        28.04.2022 09:53

        Подскажите, в начале пандемии вы помимо VPN ставили сотрудникам DLP на домашний компьютер?


        1. alexcccp Автор
          28.04.2022 11:38

          Не было необходимости, в моем случае "домашний" это браузер поверх VPN


          1. akhkmed
            28.04.2022 15:59

            Тогда непонятно, зачем именно корневой сертификат. Ставилась цель расшифровать и заново зашифровать весь трафик через vpn?


    1. SlavaKorol
      28.04.2022 09:21
      +1

      А расскажите хотя бы коротко о подобных рисках или ткните носом, где можно почитать.


      1. alff31
        28.04.2022 09:36
        +5

        Риск в том что становится возможна атака man-in-the-middle от Минцифры. Вы идете на gmail с https, а какой-нибудь СОРМ у провайдера вам подменяет сертификат на свой и читает всю вашу переписку. У вас при этом будет зеленый замочек.

        Вообще сертификаты - штука основанная на доверии, вы должны доверять всем корневым организациям. Российские официальные органы не очень заслуживают доверие в целом.


        1. InChaos
          28.04.2022 09:48
          +6

          А не Российские официальные органы значит заслуживают?

          Для домашнего использования никогда не видел чтоб заморачивались, какому сертификату доверять или нет. А если домашний комп используется для работы, то обычно подключение через VPN с персональным ключом, тут MITM сразу мимо, но это уже другая история......


          1. aborouhin
            28.04.2022 12:22
            +3

            Доверять-то, конечно, нельзя никому, но есть нюансы:

            • для большинства пользователей шансы, что их деятельностью заинтересуется родное государство, на порядки выше, чем что ей заинтересуются какие бы то ни было структуры за его пределами;

            • в отношении коммерческого УЦ, который рискует многомиллиардным бизнесом, риски утечки ключа на порядки ниже, чем в отношении министерства;

            • в случае, если станет известно об утечке ключа доверенного корневого УЦ, можно рассчитывать на незамедлительный отзыв такого сертификата всеми браузерами; в случае, если станет известно об утечке ключа Минцифры, можно рассчитывать на очередное "это фейк и ничего у нас не утекало"...


        1. aborouhin
          28.04.2022 11:54
          +1

          Во-первых это, да. Во-вторых, в случае утечки приватного ключа этого сертификата (по раздолбайству или корысти ради) MitM атака может быть организована и в частном порядке, а не в рамках какой-то государственной политики. При оценке вероятности такой утечки тоже, увы, оснований для оптимизма мало.


  1. iAndrey
    28.04.2022 07:04
    +5

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

    ...

    …
    "%cd%\bin\Curl.exe" -O http://cert.sslkey.ru/CertCentre/PKI.zip
    # и дальше нет проверки аутентичности архива

    Воистину "Распространить сертификат в кратчайшие сроки среди станций Windows любой ценой", даже ценой установки чёрт знает чьих сертификатов в доверенные. За подобное руки отрывать надо.

    А инструкция в картинках "как в винраре sfx архив сделать" на айтишном ресурсе - это вообще за гранью. Оно точно для хабра писалось?


    1. aamonster
      28.04.2022 09:23
      +1

      "А если не будут брать – отключим газ" (c)

      Самое смешное, что весь этот цирк с конями нафиг не нужен. Просто ставится браузер с поддержкой сертификата минцифры, и всё. Гораздо безопаснее, чем внедрять какие-то сертификаты на уровне системы.


    1. alexcccp Автор
      28.04.2022 11:40

      Никого не ограничиваю.
      Вы можете допилить так как вам будет удобно.
      Если вдруг и будет желание поделитесь с сообществом. Я буду благодарен.


  1. yulchurin
    28.04.2022 09:21
    +2

    Переходите на светлую сторону. Используйте UNIX или Linux)


  1. sergeyns
    28.04.2022 10:52
    +2

    А вот интересно, что это у вас за огранизация в которой требуют поставить сертификаты минцифры на домашние компьютеры ...

    Ну и, собственно, зачем..


    1. alexcccp Автор
      28.04.2022 11:42

      Никого нечего не заставляют делать, домашний - личный. Но и говорить потом что кто то не смог заполнить какую то форму на протяжении 3 мес. по вене красного креста в браузере, более не получится.


    1. alexcccp Автор
      28.04.2022 11:45

      Также забыл указать что речь в теме идет не о сертификате Минцифры - это пример


  1. deelayka
    28.04.2022 11:43
    +2

    set dir=%~dp0
    %dir:~0,2%
    CD "%~dp0\CertSetup\"

    можно заменить на

    CD /D "%~dp0\CertSetup\"


    1. alexcccp Автор
      28.04.2022 11:43

      Спасибо, не знал.


  1. miga
    28.04.2022 12:01
    -1

    Батники в 2022, серьезно?

    Повершеллу уже сколько, лет 15, а вы до сих пор баники пишете


    1. alexcccp Автор
      28.04.2022 12:11

      Есть такая старинная поговорка - плохому танцору всегда что-то мешает
      В данной конкретной ситуации достаточно и баника.


      1. Nova_Logic
        28.04.2022 15:20

        В данной конкретной ситуации power shell без всяких certmgr.exe и curl может сертификаты и выкачать и поставить. Не очень красиво говорить про танцоров, когда powershell позволяет решить задачу существенно красивее


        1. PereslavlFoto
          28.04.2022 16:50

          Далеко не во всех windows присутствует powershell.


          1. drdead
            28.04.2022 17:36

            Ради интереса, а где его нет?


            1. PereslavlFoto
              28.04.2022 17:39

              Он только с windows 7 появился. Его нет на XP и на Server 2003.


              1. drdead
                28.04.2022 18:10

                Непонятно, а каким боком тут XP и 2003, если статья о клиентских машинах. Очень сомневаюсь, что сейчас много людей сидят на ESU, чтобы получать последние адпейты даже для 7ки, а под XP удалённых работников вообще пускать в окружение нужно запретить.


                1. PereslavlFoto
                  28.04.2022 18:15

                  под XP удалённых работников вообще пускать в окружение нужно запретить.

                  К сожалению, нет способа бесплатно избавиться от XP. И новые windows, и услуги по их установке стоят каких-то денег, в том числе и на замену оборудования.

                  Очень сомневаюсь, что сейчас много людей сидят на ESU, чтобы получать последние адпейты даже для 7ки

                  ESU — это хорошее решение!