Я хочу подписать EV Code с помощью закрытого ключа на Yubico Yubikey 5, используя signtool.exe. Однако каждый раз, когда я подписываю файл, он запрашивает пароль. Я бы хотел, чтобы ввод этого ключа был автоматизирован как часть конвейера сборки, запускаемого на защищенной машине.
Ранее я использовал токен Safenet и смог сделать это с помощью решений от
этот вопрос, однако я понимаю, что эта функциональность была конкретной реализацией для eToken Cryptographic Security Provider, используемого Safenet.
Я экспортировал публичный сертификат из Yubikey и использовал certutil для сброса информации о контейнере ключей (который похож на GUID на 0bababab-0000-aaaa-baba-cdcdcdcdcdcd) и CSP на Microsoft Smart Card Key Storage Provider, но когда я использую эту информацию, я получаю следующую проблему:
signtool sign /f <cert file>.crt /csp "Microsoft Smart Card Key Storage Provider" /v /kc <container_id>
Error information: "CryptExportPublicKeyInfoEx failed" (-2146893819/0x80090005)
SignTool Error: An unexpected internal error has occurred.





Помимо поддержки Microsoft Smart Card, Yubikey также поддерживает PKCS11. Этот интерфейс не поддерживается изначально signtool.exe, но поддерживается сторонними инструментами, такими как osslsigncode, которые позволяют передавать ключевой пароль через CLI.
Вот как у меня это заработало:
OpenSSL т.е. из здесь
Важно: обязательно установите его на C:\OpenSSL-Win64 вместо C\Program Files\OpenSSL-Win64 по умолчанию.yubico-piv-tool, то есть из здесь, и запишите местоположение файла libykcs11.dll, который должен находиться по адресу C:\Program Files\Yubico\Yubico PIV Tool\bin.
Важно: добавьте этот путь в переменную PATH, иначе osslsigncode не будет работать.libp11 с помощью nmake, более подробная инструкция здесь. Примечание. Текущая версия файла make зависит от установки OpenSSL в каталог на шаге 1.pkcs11.dll, полученного на шаге 4, это будет наш pkcs11engine для osslsigncode.osslsigncode то есть из здесь и добавьте его местоположение в свою PATH переменную..crt и запишите его местоположение.osslsigncode sign -pkcs11module <location_of_libykcs11.dll> -pkcs11engine <location_of_pkcs11.dll> -pass <yubikey_passcode> -ts <timestamp_server_url> -key "pkcs11:id=%01" -certs <path_to_public_cert.crt> -in "input_file.exe" -out "output_file.exe"Дополнительные ресурсы:
pkcs11-tool, был чрезвычайно полезен при запуске этого проекта.