2017-01-12 16 views
1

私は今一週間Authenticode certificatesの周りに自分の心を包み込みしようとしています。私はComodoからCSCを購入しました。私は、SmartScreenフィルターの警告が消えるように署名したいClickOnceアプリケーションを持っています。AfterCompileターゲットでClickOnceアプリケーションに署名する

私のアプリケーションアセンブリには厳密な名前が付けられており、「プロジェクトプロパティ」の「アセンブリに署名する」というボックスにチェックが入っています。また、同じプロジェクトプロパティで "ClickOnceマニフェストに署名する"というチェックボックスをオンにしました。そして最後に、私はSHA1とSHA256の両方で実行可能ファイルをデュアルサインために、私のプロジェクトファイルにAfterCompile目標として設定し、次の実行を持っている:

<Target Name="AfterCompile"> 
    <Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /t http://timestamp.comodoca.com /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" /> 
    <Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" /> 
</Target> 

それから私は、プロジェクトを発行するためのコマンド以下の実行します:

"C:\プログラムファイル(x86の)\ MSBuildの14.0 \ビン\からMSBuild.exe \" /対象:パブリッシュ/ P:設定=リリース/ P:プラットフォーム= AnyCPU MyCoolApplication.csproj

私が気づいたのは、このコマンドが最終的に3つのMyCoolApplication.exeの別々のバージョン:

  • それはそれはそれは、最終的なコピーを作成します
  • デュアル署名されているOBJ \リリースで別のコピーを作成します
  • 署名されている、ビン\リリースで一つのコピーを作成します一度だけ署名とタイムスタンプに

を利用できないようです残念ながら、それを動作させる必要のあるビン\リリース\のapp.publishでコピーだが、いくつかの理由で、このバージョンされているbin \リリース\のapp.publish、中二重署名を削除しています。間違っている可能性のある私の理解は、obj \ Releaseに物を構築し、bin \ Release \ app.publishにコピーしてからマニフェストに署名したことです。しかし、最終的な実行可能ファイルのデジタル署名が明確に変更されているので、明らかに何かが起こっています。ここでは、これら二つのファイルのプロパティですサイド・バイ・サイド:

dual-signedsingle-signed, no timestamp

に問題が最終的に単一署名/タイムスタンプのバージョンが欠落することで、アプリケーションがまだ全体のレンダリング、SmartScreenフィルターが付けられてしまうことです無意味なプロセス。これをどうすれば解決できますか?

UPDATE:this guideを読んだ後、私が適切なものに署名しても、私はまだ自分のアプリケーションのための十分な「評判」を持っていないのおかげで、SmartScreenフィルターにぶつかることと思われます。しかし、私は最初に正しく物事にサインし、煙を追いかけていないことを確認したいと思います。 (これはビルドプロセスの崩壊の指標である場合、または、私はそれを修正したい!)

EDIT:

:ここは@CodeFullerが要求したからMSBuild.exe出力の終わりです

AfterCompile:

"ときSignTool.exe" 記号/ F "certificate.pfx"/Pがmypassword /トンhttp://timestamp.comodoca.com/V「MyCoolApplication \ OBJ \リリース\ MyCoolApplication。exeファイル」

次の証明書が選択されました:MyCoolApplication \ OBJ \リリース\ MyCoolApplication.exe

ファイル数:

...追加のストア

に成功署名

を追加

を完了します正常に署名されました:1

警告の数:0

エラー数:0

"ときSignTool.exe" 記号/ "MyCoolApp licationの\のcertificate.pfx" F/Pがmypassword/FDのSHA256は/ TR http://timestamp.comodoca.com/?td=sha256/TD SHA256 /として/ V「MyCoolApplication \ OBJ \リリース\ MyCoolApplication.exeは」

次の証明書が選択されました:

...

完了は追加のストア

大成功を追加しますsfully署名:MyCoolApplication \ OBJ \リリース\ MyCoolApplication.exe

に成功署名されたファイルの数:警告の1つの

数:エラーの0

数:0

_DeploymentComputeClickOnceManifestInfo:

ディレクトリ "bin \ Release \ app.publish"を作成します。

"obj \ Release \ MyCoolApplication.exe"から "bin \ Release \ app.publish \ MyCoolApplication.exe"にファイルをコピーしています。

_CopyAppConfigFile: "ビン\リリース\ MyCoolApplication.exe.config" を "App.configファイル" から

コピーファイル。

_CopyManifestFiles: "ビン\リリース\ MyCoolApplication.exe.manifest" を "OBJ \リリース\ MyCoolApplication.exe.manifest" から

コピーファイル。

MyCoolApplication - > C:\ユーザーはプロジェクト\ MyCoolApplication \ MyCoolApplication \ binに\リリース\ MyCoolApplication.exe.manifest \ Visual Studioの2015 \「OBJ \リリース\ MyCoolApplication.applicationから

コピーファイルをゴードン\ドキュメント\します"を" bin \ Release \ MyCoolApplication.application "に変更します。

MyCoolApplication - > C:\ Users \ Gordon \ Documents \ Visual Studio 2015 \ Projects \ MyCoolApplication \ MyCoolApplication \ bin \ Release \ MyCoolApplication。アプリケーション

CopyFilesToOutputDirectory: "OBJ \リリース\ MyCoolApplication.exe" への "bin \リリース\ MyCoolApplication.exe" から

コピーファイル。

MyCoolApplication - > C:\ユーザーはに "OBJ \リリース\ MyCoolApplication.pdb" からプロジェクト\ MyCoolApplication \ MyCoolApplication \ binに\リリース\ MyCoolApplication.exe

コピーファイル\ Visual Studioの2015 \ゴードン\ドキュメント\します"bin \ Release \ MyCoolApplication.pdb"をクリックします。

_CopyFilesToPublishFolder:

作成ディレクトリ "のbin \リリース\ app.publish \アプリケーションファイル\ MyCoolApplication_1_0_0_0"。

"bin \ Release \ MyCoolApplication.exe.manifest"から "bin \ Release \ app.publish \ Application Files \ MyCoolApplication_1_0_0_0 \ MyCoolApplication.exe.manifest"にファイルをコピーします。 "bin \ Release \ app.publish \ MyCoolApplication.exe"から "bin \ Release \ app.publish \ Application Files \ MyCoolApplication_1_0_0_0 \ MyCoolApplication.exe.deploy"にファイルをコピーします。 "App.config"から "bin \ Release \ app.publish \ Application Files \ MyCoolApplication_1_0_0_0 \ MyCoolApplication.exe.config.deploy"にファイルをコピーしています。 "triforce.ico"から "bin \ Release \ app.publish \ Application Files \ MyCoolApplication_1_0_0_0 \ triforce.ico.deploy"にファイルをコピーしています。 ビルドプロジェクト "C:¥Users¥Gordon¥Documents¥Visual Studio 2015¥Projects¥MyCoolApplication¥MyCoolApplication¥MyCoolApplication.csproj"(ターゲットの公開)。

ビルドに成功しました。 0警告(秒) 0エラー(S)

経過時間00:00:06.53

+1

を私の経験はあなたですSmartScreen(より高価な...)を渡すためにExtended Validation(EV)コード署名証明書が必要です。私たちは、そのような証明書で署名し、それがうまく動作するclick once appを持っています(signtoolでカスタムステップを実行していないので、通常のVSプロジェクトのClickOnceプロパティを使用して署名します)。欠点はpfxとパスワードで自動化できないことです:http://stackoverflow.com/questions/17927895/automate-extended-validation-ev-code-signing –

+1

@SimonMourier私は、 EV証明書。しかし、マイクロソフトのウェブサイトからは、標準の(非EV)CSCが瞬時完璧な評判の恩恵を受けていないにもかかわらず、まだ署名されていないコードよりも評判が高く、評判はあなたの出版社名(署名されていないコードと同じように)個々のアプリ。 EVよりはあまり理想的ではありませんが、EVにはコストだけでなく他の欠点もあります。ハードウェアドングルを添付する必要があるため、ビルドサーバーを仮想化できません。 – SoaperGEM

+1

まだ、私の質問は、MSBuildの中の何かが、「AfterCompile」ターゲットの後にサイレントに変更/再署名しているようですが、署名の仕上げをするように設定しています。それ。私が疑うところでは、プロセス中の何かが予期せずにファイルを変更している場合、CSCにEVが含まれているかどうかにかかわらず、問題に悩まされると思います。 – SoaperGEM

答えて

2

あなたはバイナリがobj\Releaseに建てられ、その後bin\Release\app.publishにコピーされているあなたの期待に正しいです。 AfterCompileの同じカスタムステップを使用した私のテストプロジェクトでは、すべてが期待通りに動作します。したがって、ビルド中に何かが間違っている可能性が最も高いです。さらに調査するには、MSBuild.exeの出力で質問を更新してください。ここで

は私のビルド配列である:

AfterCompile: "MyKey.pfx"/Pがmypassword /トンhttp://timestamp.comodoca.com/V 「MyCoolApplication \ OBJ \リリース\ MyCoolApplication F
"ときSignTool.exe" 記号/ .EXE」
...

は成功しました署名: MyCoolApplication \ OBJ \リリース\ MyCoolApplication.exe

に成功署名されたファイルの数:1 警告の
数:0
エラーの
数:0

"ときSignTool.exe" サイン/ F "MyKey.pfx"/Pがmypassword/FDのSHA256/TR http://timestamp.comodoca.com/?td=sha256/TDのSHA256/AS/V " MyCoolApplication \ obj \ Release \ MyCoolApplication.exe "
...
に成功署名
: はMyCoolApplication \ OBJ \リリース\ MyCoolApplication.exe

に成功署名されたファイルの数:1

警告の数:エラーの0

数:0

CleanPublishFolder:
の取り外しディレクトリ "bin \ Release \ app.publish \"。
_DeploymentComputeClickOnceManifestInfo:
ディレクトリ "bin \ Release \ app.publish"を作成しています。
"obj \ Release \ MyCoolApplication.exe"から "bin \ Release \ app.publish \ MyCoolApplication.exe"にファイルをコピーしています。
...
ビルドに成功しました。
0警告(秒)
0エラー(S)

enter image description here

だから私は、次の質問を続行したい:

  • をあなたのMSBuildの出力は、同一の配列を含んでいますかそれは違いますか?
  • 出力に何らかのエラーが含まれていますか?
  • ビルド後、obj\Release\MyCoolApplication.exeRelease\app.publish\MyCoolApplication.exeファイルのタイムスタンプは同じですか?
  • これらのファイルの内容は同じですか、または異なるのですか?

UPDATE:

すべてのビットをクリアし、ビルド出力の診断冗長性を有効にした後。

プロジェクト設定の[署名]タブの[ClickOnceマニフェストに署名する]を有効にすると、SignTool.exebin\Release\app.publish\MyCoolApplication.exeとなります。デフォルトでは、SignToolは既存の署名を上書きします。そのため、AfterCompileターゲットのSignToolの2番目の呼び出しは、/as key(署名を追加するオプション)で行われます。

カスタム署名コマンドを保持する場合は、「ClickOnceマニフェストに署名する」オプションを無効にし、マニフェストに署名するカスタムコマンドを追加する必要があります。この次のファイルを完了するために、 は、手順を構築し、以下に署名する必要があります。

_DeploymentComputeClickOnceManifestInfo対象後: bin\Release\app.publish\MyCoolApplication.exe。ファイル名のマクロは"$(PublishDir)$(TargetFileName)"

_DeploymentSignClickOnceDeployment

ターゲット後れる: bin\Release\app.publish\Application Files\MyCoolApplication_1_0_0_3\MyCoolApplication.exe.manifestから"$(_DeploymentApplicationDir)$(_DeploymentTargetApplicationManifestFileName)" bin\Release\app.publish\MyCoolApplication.applicationから"$(PublishDir)$(TargetDeployManifestFileName)" bin\Release\app.publish\setup.exeから$(PublishDir)\setup.exe

マニフェストはmage.exeツールを使用して署名されなければなりません。SignFileのMSBuildを経由して(「アセンブリに署名」とプロジェクトのプロパティで、最終的にsigntool.exeの実行につながる「ClickOnceのマニフェストにはサイン」チェック

<Target Name="AfterCompile"> 
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /t http://timestamp.comodoca.com /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" /> 
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" /> 
</Target> 

<Target Name="SignAssembly" AfterTargets="_DeploymentComputeClickOnceManifestInfo"> 
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /t http://timestamp.comodoca.com /v &quot;$(PublishDir)$(TargetFileName)&quot;" /> 
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v &quot;$(PublishDir)$(TargetFileName)&quot;" /> 
</Target> 

<Target Name="SignManifest" AfterTargets="_DeploymentSignClickOnceDeployment"> 
<Exec Command="&quot;c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\mage.exe&quot; -Sign &quot;$(_DeploymentApplicationDir)$(_DeploymentTargetApplicationManifestFileName)&quot; -CertFile &quot;$(ProjectDir)certificate.pfx&quot; -Password mypassword -TimeStampUri http://timestamp.comodoca.com" /> 
<Exec Command="&quot;c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\mage.exe&quot; -Sign &quot;$(PublishDir)$(TargetDeployManifestFileName)&quot; -CertFile &quot;$(ProjectDir)certificate.pfx&quot; -Password mypassword -TimeStampUri http://timestamp.comodoca.com" /> 
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /t http://timestamp.comodoca.com /v &quot;$(PublishDir)\setup.exe&quot;" /> 
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v &quot;$(PublishDir)\setup.exe&quot;" /> 
</Target> 
+1

(1)を確認してください。私のビルドの出力は、あなたが投稿したものと事実上同じです。 (2)エラーはありません。 (3)2つのEXEのファイル変更時間はまったく同じです。しかし、私がそのプロパティの "Digital Signatures"タブを見れば、私がタイムスタンプ付きの2つのシグネチャを持ち、もう1つがタイムスタンプのない1つのシグネチャを持っている、上記の写真と同じです。 (4.)それらのファイルサイズは約7KB異なります。 – SoaperGEM

1

はここにあなたが必要なものを達成したプロジェクトファイルを更新していますタスク)は、あなたのExecタスクと矛盾する可能性があります。これは、冗長性やバージョンの違いによってsigntool.exeの2つの経路が実行されるためです。次の変更を一度に1つずつ試してください(すでに試したものはすべてスキップしてください)。

  • [プロジェクトのプロパティ]で[アセンブリに署名する]と[ClickOnceマニフェストに署名する]のチェックを外します。
  • 「ClickOnceマニフェストに署名する」にチェックをしてください。
  • 「アセンブリに署名する」にチェックをしてください。
  • AfterCompileターゲットをコメントアウトし、「ClickOnceマニフェストに署名する」にチェックを入れてください。
  • AfterCompileターゲットをコメントアウトし、「アセンブリに署名する」にチェックを入れてください。
  • コメントアウトあなたAfterCompileターゲットと「アセンブリの署名」と
  • は以下にあなたのコマンドを変更し、上記の順列でそれを試してみてください
  • 「ClickOnceのマニフェストサイン」の両方のチェック:"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /target:Publish /p:Configuration=Release /p:Platform=AnyCPU /p:TargetFrameworkSDKToolsDirectory="C:\Program Files (x86)\Windows Kits\8.1\bin\x64\" MyCoolApplication.csproj
関連する問題