【问题标题】:signtool failing to dual sign SHA2 and SHA1 with timestampssigntool 无法使用时间戳对 SHA2 和 SHA1 进行双重签名
【发布时间】:2013-08-30 22:09:09
【问题描述】:

我们需要使用 signtool.exe 使用 SHA1 和 SHA2 对我们的二进制文件进行双重签名,我们的证书支持 256 位 SHA2。

使用 Windows 8 SDK 的签名工具:

例如:

signtool.exe 签名 /as /fd sha256 /t http://timestamp.verisign.com/scripts/timstamp.dll /f "certificate.pfx" /p XXXXXXX "file.dll"

(其中 XXXXXXX 是我们的证书密码)

因神秘错误而失败:

SignTool 错误:SignedCode::Sign 返回错误:0x80070057 参数不正确。 SignTool 错误:尝试签名时出错:file.dll

没有时间戳的签名有效,单独签名为 SHA1 或 SHA256 有效,但我们需要双重签名,想象没有时间戳是不行的。

我尝试过 32 位和 64 位版本的 signtool.exe,在 Win7 和 Win8 机器上尝试过,并尝试使用命令行选项但无济于事。以前有人遇到过这个问题吗?

【问题讨论】:

    标签: windows sha256 authenticode signtool verisign


    【解决方案1】:

    我知道它有点老了,但我登陆了这个帖子,也许其他人也会。

    如果你先用 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 
    

    它在两个签名中使用相同的证书。我使用的是 Windows 10 SDK 中的 signtool,不知道它是否适用于以前的版本。

    【讨论】:

    • 谢谢,这有帮助!只要我按此顺序执行,它就可以使用 signtool Windows 8.1 SDK 和 MIS 对我有用。 MSI 在 Windows 2008 上显示受信任。
    • This 说“请注意,您确实需要 6.3 版本的 Signtool 才能执行此操作。它带有 Windows 8.1 SDK”。
    【解决方案2】:

    我一直在尝试做这件事,并发现以下方法可以解决问题。此方法依赖于使用两个 Authenticode 证书,一个用于 SHA-1,另一个用于 SHA-256,以确保文件被不支持由 SHA-256 证书签名的 Windows Vista 和 Windows Server 2008 接受为有效即使使用 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"
    

    2015 年 12 月 30 日更新

    要使用 SHA-256 证书但使用 SHA-1 哈希对 MSI 文件进行签名,请使用类似于以下的命令:

    signtool.exe sign /sha1 SHA256_Thumprint /v /d "FileDescription" /du "CompanyURL" /t http://timestamp.comodoca.com/authenticode "FileName.msi"
    

    【讨论】:

    • 这是否意味着需要购买两个不同的证书?还是复制和重命名就足够了?
    • 是的,不幸的是(除非有人知道得更好)。我无法获得用于生成 SHA-1 签名以在 Windows Server 2008 上被接受为有效的 SHA-256 证书。
    • 您是否有机会使用指纹的格式 进行更新?简单地从 certmgr.msc 复制字符串是行不通的。
    • 我会更新对此的评论。从记忆中,它都是大写的,没有空格。
    【解决方案3】:

    问题实际上要简单得多。

    问题出在时间戳服务器上。

    而不是使用 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
    

    【讨论】:

      【解决方案4】:

      尝试使用

      signtool.exe sign /as /fd sha256 /tr http://timestamp.geotrust.com /td sha256 /f certificate.pfx /p XXXXXX file.dll
      

      /tr 用于 RFC3161 时间戳,/td 显然用于哈希。

      【讨论】:

        【解决方案5】:

        添加到 martin_costello 的答案中,XP 和 Vista 不支持 RFC 时间戳。您需要为 sha1 签名使用 /t 选项。

        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"
        

        【讨论】:

          【解决方案6】:

          我也收到上述错误,但是在使用“-nest”选项时,它可以与 osslsigncode 实用程序一起使用:

          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 fork

          【讨论】:

            【解决方案7】:

            我认为this link 有一些不错的建议。 martin_costello 的回答中提到了其中一些,但本文提供了更多详细信息。特别是:

            • 如果您先签署 SHA1,则可以使用“双重签名并包含 SHA1 文件摘要”,然后将 /as 用于 SHA256。不过,它仅适用于 Windows 8.1 SDK(或更高版本)中的 signtool v6.3。
            • XP sp3 之前的 Windows 版本需要使用“完整 SHA1 签名”进行双重签名,需要 2 个不同的证书。

            (虽然我自己没有测试过所有这些。)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-01-03
              • 2015-08-20
              • 2019-01-03
              • 2017-12-24
              • 2013-07-26
              • 1970-01-01
              相关资源
              最近更新 更多