Нашел решение проблемы с подписанием .dig-файлов без необходимости ручного ввода пин-кода:
https://forum.rutoken.ru/post/23493/#p23493
https://forum.rutoken.ru/post/22671/#p22671
https://forum.rutoken.ru/post/22673/#p22673
Вместо signtool используйте osslsigncode на линуксе (https://github.com/mtrojnar/osslsigncode).
На примере Debian 10, первым делом устанавливаем все нужные либы для рутокена, указанные в документации, проверяем, что токен подцепился, и запоминаем его серийный номер (понадобится дальше).
Также надо установить libengine-pkcs11-openssl, opensc, opensc-pkcs11.
Скачиваем SDK рутокена, в нём нужно найти либу <rutoken sdk>/pkcs11/lib/linux_glibc-x86_64/librtpkcs11ecp.so, для удобства сохраним этот путь в переменную:
export RUTOKEN_PKCS11_MODULE="<абсолютный путь к librtpkcs11ecp.so>"
Нужно получить ID сертификата, которым собираемся подписывать:
pkcs11-tool --module "$RUTOKEN_PKCS11_MODULE" -O -l
Будет запрошен пин-код, после чего выведен список всех ключей и сертификатов на токене. Находим нужный сертификат, запоминаем его ID, проверяем, что в списке ключей есть Private Key Object с таким же ID.
Теперь нам понадобится сама утилита osslsigncode — на новых дистрибутивах она может быть доступна в репозиториях, но на Debian 10 слишком старая версия, так что пришлось скомпилировать самостоятельно.
Первым делом проверяем, что osslsigncode вообще может подписать файл напрямую:
export PKCS11_CERT='pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;serial=<серийный номер токена>;id=<id сертификата>?pin-value=<пин-код>'
osslsigncode sign -pkcs11module "$RUTOKEN_PKCS11_MODULE" -pkcs11cert "$PKCS11_CERT" -in input.exe -out input.signed.exe
Где:
Если всё получилось и на винде подпись бинарника отображается и валидна, можем пробовать подписать аналогично signtool /dg:
Генерируем файл с запросом на подпись на машине без токена (это может быть даже винда, т.к. osslsigncode доступен в MSYS2):
osslsigncode extract-data -h sha256 -in input.exe -out input.exe.p7s
Переносим файл input.exe.p7s на машину с токеном, и на ней вызываем:
osslsigncode sign -pkcs11module "$RUTOKEN_PKCS11_MODULE" -pkcs11cert "$PKCS11_CERT" -in input.exe.p7s -out input.exe.signature.p7b
В случае успеха будет сгенерирован файл подписи input.exe.signature.p7b, который переносим обратно на первую машину, после чего аттачим подпись к исходному бинарнику:
osslsigncode attach-signature -sigin input.exe.signature.p7b -CAfile globalsign.pem -h sha256 -in input.exe -out input.signed.exe
Обязательно нужно указывать файл с сертификатами CA, начиная от корневого и включая все промежуточные для вашего сертификата (их можно экспортировать из винды, сконвертировать каждый в PEM с помощью openssl, объединить их в один файл тупой конкатенацией в порядке от корневого к последнему из промежуточных). Для globalsign у меня в этом файле оказалось два сертификата — 1 корневой и 1 промежуточный.
Дальше можем добавить таймстамп с помощью osslsigncode, либо через signtool — как вам удобнее. У первого есть преимущество — поддерживает прокси, а вот signtool этого не умеет.