Вопрос на самом деле содержит правильную процедуру - выполните подпись с использованием файла PFX, который содержит корневой сертификат, промежуточный сертификат, сертификат разработчика и закрытый ключ. Кроме того, используйте сервер отметок времени. Моя проблема заключалась в том, что в мой PFX был включен неверный корневой сертификат, поэтому сертификат, используемый для подписи, не мог вернуться к корню.
По запросу вот информация о том, как создать файл PFX. Cert2spc и pvk2pfx, которые я использую ниже, также находятся в SDK платформы.
cert2spc certpath1.cer certpath2.cer certpath3.cer codesign.spc
Если список файлов .cer включает в себя корневые, промежуточные сертификаты и сертификаты подписи кода, а codesign.spc - выходной файл. Тогда:
pvk2pfx -pvk privkey.pvk -spc codesign.spc
При запуске pvk2pfx таким способом запускается мастер, который запрашивает пароль-пароль и местоположение выходного файла, а также пароль-пароль для выходного файла.
Наконец, signtool выполняет фактическую подпись кода:
signtool sign /f my_certificates.pfx /p my_passphrase /t http://timestamp.verisign.com/scripts/timstamp.dll my_activex_control.ocx
Оглядываясь назад, я мог бы сэкономить время, используя signcode.exe или мастер подписи кода (который я считаю частью SDK .NET), который напрямую использует файлы .spc и .pvk.