У нас есть устаревший рабочий процесс Windows, который использует SignerSign
для применения цифровой подписи к EXE. Мы отходим от рабочего процесса Windows, поэтому я подготовил инструмент в контексте нашего нового процесса для выполнения той же операции подписи. Я скопировал/вставил код подписи кода из действия рабочего процесса в класс нового проекта, но при попытке запустить его возникает ошибка.
Грубый план того, что делает код:
CertOpenStore
используется для открытия файла PFX, содержащего закрытый ключ и сертификат.- Контекст сертификата получается путем вызова
CertEnumCertificatesInStore
для результирующего дескриптора хранилища сертификатов. SignerSign
вызывается сSIGNER_SUBJECT_INFO
, указывающим на целевой EXE-файл,SIGNER_CERT
, указывающим на контекст сертификата из предыдущего шага, иSIGNATURE_SIGNER_INFO
, указывающим, что следует использовать алгоритм SHA-1. (Я попытался изменить алгоритм на SHA-2 512 без каких-либо изменений в результате.) ПараметрpProviderInfo
равенNULL
.- Выполняется отдельный вызов
SignerTimeStamp
для применения метки времени к подписи. Комментарий в коде указывает, что если используется параметрpwszHttpTimeStamp
дляSignerSign
, он возвращает HRESULT 0x80070020 ("Файл используется"?)
Когда я пытаюсь запустить этот код в 64-разрядной версии Windows 10 из 32-разрядного или 64-разрядного процесса, я получаю сообщение об ошибке HRESULT 0x80092006 «Для хранилища или объекта не указан поставщик». Я попытался предоставить pProviderInfo
с именем провайдера, установленным на «Microsoft Strong Cryptographic Provider» (видно в выводе трассировки API Monitor, когда SignTool.exe подписывает исполняемый файл — это работает), но это не повлияло на результат.
Кто-нибудь знает, что именно означает эта ошибка и как ее исправить?