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 разных сертификата.

(Я сам не проверял все это.)

Другие вопросы по тегам