Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Info
iconfalse

Данная инструкция описывает сценарий автоматического подписания файлов с помощью SignTool и Рутокен ЭЦП. При настройке кэширования PIN кода, можно настроить автоматическое подписания без входа в сеанс пользователя Windows 10.
Проверка данного сценария проводилась на виртуальной машине Windows 10 с использованием Рутокен ЭЦП 3.0 3220. Проброс Рутокена на виртуальную машину не привёл к каким-либо ошибкам и трудностям.

Table of Contents

...

Импорт сертификата на Рутокен

...

Импорт сертификата на Рутокен

Для импорта сертификата на Рутокен необходимо выполнить следующие действия

...

Ниже приведён пример скрипта Power Shell для подписания файлов помещённых в заранее созданную папку через SignTool. 
Скрипт автоматически перемещает файл C:\test.exe  в папку C:\sign и подписывает его.
После чего, скрипт переходит в статус ожидания. Далее можно вручную переносить файлы с расширением ".exe" в папку sign, скрипт автоматически его подпишетв папку sign, скрипт автоматически их подпишет. Можно переносить и несколько файлов одновременно, скрипт подпишет их все по очереди. Главное, чтобы в названии файла не было пробелов.

Info

Обратите внимание, что путь к signtool может отличаться в зависимости от версии установленного Windows SDK (в примере ниже, этот путь - signtoolPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe").
Так же, в самой команде подписания sign, необходимо указывать отпечаток вашего сертификата (в примере ниже, это - sign /debug /sha1 f90be6d6ba25c388a384189ba5cd7975a3a04389 /v /fd SHA256 $filePath).
Более подробно о том, как узнать отпечаток сертификата, можно прочитать в статье "Подпись файлов в Windows с помощью сертификата на Рутокен".


# Path and filter settings
$path = "C:\sign"
$filter = "*.

exe

*"

# Ensure the path exists
if (!(Test-Path $path)) { 
    Write-Host "Path '$path' does not exist!" 
    return 
}

# The script block called when files are created
$action = {

 


    $signtoolPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.

19041

22621.0\x64\signtool.exe"
    $filePath = $Event.SourceEventArgs.FullPath
    #$arguments = "sign /sha1 9bc6207999c596a4bc198c0a6df92e8049d01e96 /fd SHA256 `"$filePath`""
    $arguments = "sign /debug /sha1

f90be6d6ba25c388a384189ba5cd7975a3a04389

9bc6207999c596a4bc198c0a6df92e8049d01e96 /v /

td

fd SHA256 $filePath"

    # Delay to ensure file copy has completed
    Start-Sleep -Seconds 10

    # Check if the file is still being copied by monitoring the size
    $previousSize = (Get-Item $filePath).length
    Start-Sleep -Seconds 2
    $newSize = (Get-Item $filePath).length

    while ($previousSize -ne $newSize) {
        Write-Host "File '$filePath' is still being copied..."
        Start-Sleep -Seconds 2
        $previousSize = $newSize
        $newSize = (Get-Item $filePath).length
    }

    Write-Host "Signing file '$filePath'"
    try {
        Start-Process -FilePath $signtoolPath -ArgumentList $arguments -Wait -NoNewWindow -PassThru
        Write-Host "File '$filePath' signed successfully."
    } catch {
        Write-Host "Failed to sign file '$filePath'. Error: $_"
    }
}

$sourceIdentifier = "FileCreated"

# Unregister the event if it is already registered
try {
    $existingEvent = Get-EventSubscriber -SourceIdentifier $sourceIdentifier -ErrorAction Stop
    if ($null -ne $existingEvent) {
        Unregister-Event -SourceIdentifier $sourceIdentifier
    }
}


catch {
    Write-Host "Event not found. Registering the event."
}

# Create the FileSystemWatcher
$fsw = New-Object IO.FileSystemWatcher $path, $filter
$fsw.EnableRaisingEvents = $true
$job = Register-ObjectEvent $fsw Created -SourceIdentifier $sourceIdentifier -Action $action

# Validate if the event is actually registered
if (Get-EventSubscriber | Where-Object { $_.SourceIdentifier -eq $sourceIdentifier })


{
    Write-Host "Event has been registered successfully."
}


else


{
    Write-Host "Failed to register event."
}

Write-Host "Script is now monitoring $path."

# Copy test.exe to the sign folder
$testExePath = "C:\test.exe"
if (Test-Path $testExePath) {
    Copy-Item $testExePath -Destination $path
    Write-Host "test.exe copied to $path."
} else {
    Write-Host "Could not find $testExePath."
}

# Prevent the console from closing immediately
do {
    Start-Sleep -Seconds 1
} while ($true)


Добавление Скрипта в Службы Windows

...

  1. Для установки NSSM, необходимо запустить PowerShell. Для этого, откроем поиск и наберём PowerShell ISE. Запустить его нужно от имени администратора.


  2. Создаём новый файл и запускаем команды для установки NSSM:

    Set-ExecutionPolicy Bypass -Scope Process -Force;

    `


    iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
    choco install nssm



  3. Создаём новый сценарий в PowerShell ISE, прописываем наш скрипт для подписания файлов (из раздела Создание скрипта для подписи документов) и сохраняем в удобном месте (в нашем примере, скрипт сохранён по пути C:\script.ps1)


  4. Далее, прописываем и запускаем команду для добавления нашего скрипта в службы Windows. В данном примере, служба будет называться "script".

    $NSSMPath = (Get-Command "C:\ProgramData\chocolatey\bin\nssm.exe").Source
    $NewServiceName = "script"
    $PoShPath= (Get-Command powershell).Source
    $PoShScriptPath = "C:\script.ps1"
    $args = '-ExecutionPolicy Bypass -NoProfile -File "{0}"' -f $PoShScriptPath
    & $NSSMPath install $NewServiceName $PoShPath $args
    & $NSSMPath status $NewServiceName


    Start-Service $NewServiceName
    Get-Service $NewServiceName

  5.  Если необходимо удалить службу, можно в командной строке использовать команду sc delete “Имя Службы”

Настройка службы

  1. Для начала, необходимо проверить, создалась ли наша служба. Для этого, в поиске прописываем и запускаем Службы.


  2. В списке служб, находим нашу (в данном примере, называется script). Кликаем по ней правой кнопкой мыши и переходим в Свойства.


  3. В свойствах переходим во вкладку Вход в систему и указываем имя и пароль пользователя, от имени которого будет запускаться служба. Применяем и перезагружаем компьютер.


  4. После настройки, службу необходимо перезапустить.

Подключение по SSH

Подписание файлов работает даже при переносе файлов в папку sign удалённо, через ssh.

Для подключения по ssh необходимо установить компонент OpenSSH Server на одну из клиентских машин (данный компонент доступен к установке при версии Windows 10 старше 1809).

  1. Переходим в меню Пуск - Настройки - Приложения.
    Image Added

  2. Зайти в раздел Дополнительные компоненты.
    Image Added

  3. Нажать Добавить компонент и ввести в поиске Сервер OpenSSH. Также убедитесь, что на обеих машинах установлен компонент Клиент OpenSSH.
    Image Added

  4. Для подключения к серверу OpenSSH, необходимо в командной строке ввести команду:

    ssh username@IPaddress

    Где username - это имя пользователя сервера, а IPaddress - это IP адрес сервера OpenSSH.

    Info

    Так как OpenSSH по умолчанию работает через порт 22, необходимо убедиться, что у клиента и у сервера есть разрешения на использование этого порта.

Итог

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