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のマシンで試し、コマンドラインオプションをいじってみましたが、うまくいきませんでした。誰かが以前にこの問題にぶつかったことがありますか?
私はこれとまったく同じことをしようとしてきましたが、次のことがうまくいくことがわかりました。このアプローチは、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
スイッチを使用して各署名ステップに明示的に指定され、/as
はappend 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"
私はそれが少し古いのを知っています、しかし私はこのスレッドに上陸しました、そしておそらく他の誰かもそうするでしょう。
最初に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.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タイムスタンプをサポートしません。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"
上記のエラーも発生しますが、「-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 を使用しています。
このリンク にはいくつかの素晴らしいポインタがあると思います。一部はmartin_costelloの回答で言及されていますが、この記事ではさらに詳細を説明します。特に:
(私はこれすべてを自分でテストしていません。)