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

Импорт сертификата на Рутокен
Для импорта сертификата на Рутокен необходимо выполнить следующие действия
- Нажмите кнопку Пуск и введите Командная строка и выберите пункт Запуск от имени администратора.

- Если необходимо введите имя и пароль администратора компьютера.
- Подключите Рутокен к компьютеру.
- В командной строке наберите следующую команду: certutil -csp "Microsoft Base Smart Card Crypto Provider" -importpfx C:\sign_code.pfx и нажмите Enter.
- Введите пароль PFX и нажмите Enter.

- Введите PIN-код от Рутокена и нажмите ОК.

- Дождитесь сообщения что команда успешно выполнена.

Изменение Криптопровайдера
Для корректной работы SignTool при закешированном PIN коде от Рутокена, необходимо изменить параметры криптопровайдера.
- Зайти в Панель Управления Рутокен и перейти в раздел Настройки.
- В разделе Настройки криптопровайдера необходимо нажать на "Настроить криптопровайдер".
- В пункте "Семейство Рутокен ЭЦП", необходимо выбрать Aktiv ruToken CSP v1.0.
- После этого потребуется отключить токен, перезагрузить компьютер и подключить его обратно для применения настроек.

Регистрация сертификатов
Для корректной работы SignTool, необходимо зарегистрировать сертификат.
Для этого в Панеле Управления Рутокен, в разделе Сертификаты необходимо поставить галочку напротив нужного сертификата для подписи.
Так же, необходимо проверить, что на нужном вами сертификате указан криптопровайдер Aktiv ruToken CSP v1.0.

Подробнее с работой в Панели Управления Рутокен можно ознакомиться в статье Начало работы с устройствами Рутокен.
Настройка кеширования PIN кода
Для включения кеширования пин-кода необходимо обратиться в службу нашей технической поддержки.
Создание скрипта для подписания документов
Ниже приведён пример скрипта Power Shell для подписания файлов помещённых в заранее созданную папку через SignTool.
Скрипт автоматически перемещает файл C:\test.exe в папку C:\sign и подписывает его.
После чего, скрипт переходит в статус ожидания. Далее можно вручную переносить файлы в папку sign, скрипт автоматически их подпишет. Можно переносить и несколько файлов одновременно, скрипт подпишет их все по очереди. Главное, чтобы в названии файла не было пробелов.
Обратите внимание, что путь к 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 = "*.*" # 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.22621.0\x64\signtool.exe" $filePath = $Event.SourceEventArgs.FullPath #$arguments = "sign /sha1 9bc6207999c596a4bc198c0a6df92e8049d01e96 /fd SHA256 `"$filePath`"" $arguments = "sign /debug /sha1 9bc6207999c596a4bc198c0a6df92e8049d01e96 /v /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
Для того, чтобы скрипт работал при старте ОС и подписывал файл до входа в учётную запись пользователя, необходимо запустить скрипт как службу Windows.
Для этого используем NSSM (Non-Sucking Service Manager) — это утилита, позволяющая устанавливать исполняемые файлы приложений в качестве служб в ОС семейства Microsoft Windows.
- Для установки NSSM, необходимо запустить PowerShell. Для этого, откроем поиск и наберём PowerShell ISE. Запустить его нужно от имени администратора.

- Создаём новый файл и запускаем команды для установки NSSM:
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) choco install nssm
|

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

- Далее, прописываем и запускаем команду для добавления нашего скрипта в службы 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 |
- Если необходимо удалить службу, можно в командной строке использовать команду sc delete “Имя Службы”
Настройка службы
- Для начала, необходимо проверить, создалась ли наша служба. Для этого, в поиске прописываем и запускаем Службы.

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

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

- После настройки, службу необходимо перезапустить.
Подключение по SSH
Подписание файлов работает даже при переносе файлов в папку sign удалённо, через ssh.
Для подключения по ssh необходимо установить компонент OpenSSH Server на одну из клиентских машин (данный компонент доступен к установке при версии Windows 10 старше 1809).
- Переходим в меню Пуск - Настройки - Приложения.

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

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

- Для подключения к серверу OpenSSH, необходимо в командной строке ввести команду:
Где username - это имя пользователя сервера, а IPaddress - это IP адрес сервера OpenSSH.
Так как OpenSSH по умолчанию работает через порт 22, необходимо убедиться, что у клиента и у сервера есть разрешения на использование этого порта. |
Итог
Если вы настроили кеширование PIN-кода и создали службу как указано в инструкции, то при подключенном Рутокене к машине, у вас будет подписываться указанный вами в скрипте файл до логина в учётную запись пользователя. Далее, служба будет ожидать следующие файлы для подписи в папке sign.