signtool не может выполнить двойную подпись SHA2 и SHA1 с отметками времени
Нам нужно дважды подписать наши двоичные файлы с помощью SHA1 и SHA2 с помощью signtool.exe, наш сертификат поддерживает 256-битный SHA2.
Использование Windows 8 SDK signtool:
например:
signtool.exe sign / as / fd sha256 / t http://timestamp.verisign.com/scripts/timstamp.dll / f "certificate.pfx" / p XXXXXXX "file.dll"
(где XXXXXXX - наш пароль для сертификата)
терпит неудачу с загадочной ошибкой:
Ошибка SignTool: SignedCode:: Ошибка возврата знака: 0x80070057 Параметр неверен. Ошибка SignTool: при попытке подписать произошла ошибка: file.dll
Подпись без метки времени работает, индивидуальная подпись как SHA1 или SHA256 работает, но нам нужно двойную подпись, и представьте, что нет метки времени - нет, нет.
Я пробовал 32- и 64-битные версии signtool.exe, пробовал на машинах с Win7 и Win8 и пытался поиграть с параметрами командной строки, но безрезультатно. Кто-нибудь сталкивался с этой проблемой раньше?
7 ответов
Я знаю, что он немного староват, но я попал в эту ветку, и, возможно, кто-то еще тоже.
Это будет работать, если вы подпишете сначала с SHA1, а затем с SHA256:
signtool.exe sign /f cert_file.pfx /t http://timestamp.comodoca.com/authenticode /p cert_password
signtool.exe sign /f cert_file.pfx /as /fd sha256 /tr http://timestamp.comodoca.com/rfc3161 /td sha256 /p cert_password
Он работал с использованием одного и того же сертификата в обеих подписях. Я использовал signtool из Windows 10 SDK, не знаю, будет ли он работать с предыдущими версиями.
Я пытался сделать именно эту вещь, и обнаружил, что следующие сделали свое дело. Этот подход основан на использовании двух сертификатов Authenticode, одного для SHA-1 и другого для SHA-256, чтобы гарантировать, что файлы принимаются как действительные в Windows Vista и Windows Server 2008, которые не поддерживают подпись сертификатом SHA-256. даже если используется алгоритм SHA-1:
signtool.exe sign /sha1 SHA1_Thumprint /v /d "FileDescription" /du "CompanyURL" /fd sha1 /tr http://timestamp.comodoca.com/rfc3161 /td sha1 "FileName.dll"
signtool.exe sign /sha1 SHA256_Thumprint /as /v /d "FileDescription" /du "CompanyURL" /fd sha256 /tr http://timestamp.comodoca.com/rfc3161 /td sha256 "FileName.dll"
Обратите внимание, что отпечатки SHA-1 явно указаны для каждого шага подписи с использованием /sha1
переключатель и что /as
используется для добавления подписи SHA-256. В противном случае подпись SHA-256 переопределит подпись SHA-1.
Другой недостаток, который я обнаружил в этом процессе, заключался в том, что только DLL и EXE поддерживают двойные подписи. Установщики MSI этого не делают.
Обновлено 29.12.15:
Формат отпечатка SHA-1/SHA-256 - это шестнадцатеричная строка в верхнем регистре из 40 символов без пробелов. Например:
signtool.exe sign /sha1 0123456789ABCDEF0123456789ABCDEF01234567 /as /v /d "FileDescription" /du "CompanyURL" /fd sha256 /tr http://timestamp.comodoca.com/rfc3161 /td sha256 "FileName.dll"
Обновлено 30.12.2015
Чтобы подписать файл MSI с помощью сертификата SHA-256, но с помощью хэша SHA-1, используйте команду, аналогичную приведенной ниже:
signtool.exe sign /sha1 SHA256_Thumprint /v /d "FileDescription" /du "CompanyURL" /t http://timestamp.comodoca.com/authenticode "FileName.msi"
Проблема на самом деле намного проще.
Проблема с сервером отметок времени.
Вместо использования signtool.exe с этим
/t http://timestamp.comodoca.com
Вы должны использовать это так для SHA1
/tr http://timestamp.comodoca.com /td sha1
И для SHA256
/tr http://timestamp.comodoca.com/?td=sha256 /td sha256
Попробуйте использовать
signtool.exe sign /as /fd sha256 /tr http://timestamp.geotrust.com /td sha256 /f certificate.pfx /p XXXXXX file.dll
/tr - это временная метка RFC3161, а /td, очевидно, для использования хэша.
Если добавить ответ к martin_costello, XP и Vista не поддерживают временную метку RFC. Вам необходимо использовать параметр /t для подписей sha1.
signtool.exe sign /sha1 SHA1_Thumprint /v /d "FileDescription" /du "CompanyURL" /fd sha1 /t http://timestamp.verisign.com/scripts/timestamp.dll "FileName.dll"
signtool.exe sign /sha1 SHA256_Thumprint /as /v /d "FileDescription" /du "CompanyURL" /fd sha256 /tr http://timestamp.comodoca.com/rfc3161 /td sha256 "FileName.dll"
Я также получаю вышеуказанную ошибку, однако она работает с утилитой osslsigncode при использовании опции '-nest':
osslsigncode sign -pkcs12 cert1.pfx -h sha1 -t http://timestamp.verisign.com/scripts/timestamp.dll -in original.exe -out intermediate.exe
osslsigncode sign -pkcs12 cert2.pfx -nest -h sha1 -t http://timestamp.verisign.com/scripts/timestamp.dll -in intermediate.exe -out final.exe
Официальный проект для Unix, однако я собрал свой собственный Windows форк.
Я думаю, что эта ссылка имеет несколько хороших указателей. Некоторые из них упомянуты в ответе martin_costello, но в этой статье приводятся некоторые подробности. Особенно:
- "Двойная подпись и включение дайджеста файла SHA1" возможна, если вы сначала подпишете SHA1 и используете / как для SHA256. Он работает только с signtool v6.3 из Windows 8.1 SDK (или более поздней версии).
- Двойная подпись с подписью FULL SHA1, необходимая для версии Windows до XP sp3, требует 2 разных сертификата.
(Я сам не проверял все это.)