web-dev-qa-db-ja.com

タイムスタンプ付きのSHA2とSHA1のデュアルサインに失敗したsigntool

Signtool.exeを使用してSHA1およびSHA2でバイナリにデュアル署名する必要があります。証明書は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 :: Signがエラーを返しました:0x80070057パラメーターが正しくありません。 SignToolエラー:署名の試行中にエラーが発生しました:file.dll

タイムスタンプなしの署名は機能し、SHA1またはSHA256が機能するように個別に署名しますが、二重署名する必要があり、タイムスタンプがないことはノーノーだと想像してください。

私はsigntool.exeの32ビット版と64ビット版を試し、Win7とWin8のマシンで試し、コマンドラインオプションをいじってみましたが、うまくいきませんでした。誰かが以前にこの問題にぶつかったことがありますか?

24
JosephA

私はこれとまったく同じことをしようとしてきましたが、次のことがうまくいくことがわかりました。このアプローチは、SHA-256証明書による署名がサポートされていないWindows VistaおよびWindows Server 2008でファイルが有効として受け入れられるようにするために、SHA-1用とSHA-256用の2つのAuthenticode証明書の使用に依存しています。 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スイッチを使用して各署名ステップに明示的に指定され、/asappend SHA-256署名に使用されることに注意してください。それ以外の場合、SHA-256署名はSHA-1署名を上書きします。

プロセスで見つけたもう1つの問題は、DLLとEXEのみがデュアルシグネチャをサポートすることです。 MSIインストーラにはありません。

更新日29/12/15

SHA-1/SHA-256サムプリントの形式は、スペースを含まない40文字の16進大文字ストリングです。例えば:

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"
16
Martin Costello

私はそれが少し古いのを知っています、しかし私はこのスレッドに上陸しました、そしておそらく他の誰かもそうするでしょう。

最初に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を使用しましたが、以前のバージョンで動作するかどうかはわかりません。

14
Ricardo Busato

問題は実際にははるかに簡単です。

問題はタイムスタンプサーバーにあります。

これで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
6
Daniel Georgiev

使ってみてください

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

/ trはRFC3161のタイムスタンプ用、/ tdは明らかにハッシュを使用するためのものです。

2
izar

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"
2
Marius Greuel

上記のエラーも発生しますが、「-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 を使用しています。

1
Keeely

このリンク にはいくつかの素晴らしいポインタがあると思います。一部はmartin_costelloの回答で言及されていますが、この記事ではさらに詳細を説明します。特に:

  • 最初にSHA1に署名し、SHA256に/ asを使用すると、「デュアル署名とSHA1ファイルダイジェストを含める」ことが可能です。ただし、Windows 8.1 SDK(以降)のsigntool v6.3でのみ機能します。
  • XP sp3より前のWindowsバージョンに必要な「フルSHA1署名」を使用した二重署名には、2つの異なる証明書が必要です。

(私はこれすべてを自分でテストしていません。)

0
Legolas