none
MsBuild実行時の証明書ファイルのへ取込方法 RRS feed

  • 質問

  • お世話になっております

    証明書にを含んだプロジェクト不アイルの方法について、ご教示願います。


    msbuid.exeの用いた実行コンパイルのツールを作成しています
    デプロイする環境は2種あり、全てコンパイルを実行しており、
    各環境(テスト環境と本番環境)に自動配置をしています
    (クライアントへは、CkickOnceにてダウンロードしています)

    今回、各機能をコンパイルする際に、それぞれの環境に証明書を取り込んでいます

    msbuildを用いて、「SignFileの」のみで、プロジェクトに用意した証明書を
    取り込める事が可能でしょうか?


    和田

    2015年9月3日 2:13

回答

  • 「証明書ストアではなくファイル(*.pfx)として証明書が複数用意されていて、ClickOnceの発行場所毎に証明書を切り替えたいので、MsBuildでビルドするときに、SignFileタスクの指定だけで証明書の切り替えが可能か?」

    ということでしょうか?
    その場合は、

    1. ソリューションの構成マネージャーで新しいソリューション構成を作る。
    2. プロジェクトのプロパテの署名ページで証明書ファイルやタイムスタンプを指定した状態にして保存する。
    3. *.csprojをVisualStudioのXMLエディタやメモ帳で開く。
    4. 新しくPropertyGroupタグを作り、Condition属性で発行場所に対応する条件を設定する。
    5. ManifestKeyFile,ManifestCertificateThumbprint,ManifestTimestampUrlを上記PropertyGroupタグ内に移動させる。
    6. VisualStudioでプロジェクトを読み直す。
    7. 発行場所の数だけ繰り返す。

    で行けると思う。

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <!-- 省略 -->  
    
      <PropertyGroup>
        <SignManifests>true</SignManifests>
      </PropertyGroup>
      
      <PropertyGroup Condition="'$(Configuration)'==Debug">
        <ManifestKeyFile>TemporaryKey.pfx</ManifestKeyFile>
        <ManifestCertificateThumbprint>0123456789ABCDEF0123456789ABCDEF01234567</ManifestCertificateThumbprint>
        <ManifestTimestampUrl>http://timestamp.hoge-fuga.com/timestamp.dll</ManifestTimestampUrl>
      </PropertyGroup>
    
      <PropertyGroup Condition="'$(Configuration)'==Release">
        <ManifestKeyFile>ReleaseKey.pfx</ManifestKeyFile>
        <ManifestCertificateThumbprint>00112233445566778899AABBCCDDEEFF00112233</ManifestCertificateThumbprint>
        <ManifestTimestampUrl>http://timestamp.hoge-fuga.com/timestamp.dll</ManifestTimestampUrl>
      </PropertyGroup>
    
      <ItemGroup>
        <FileToSign Include="$(TargetPath)" />
      </ItemGroup>
      
      <Target Name="Sign">
        <SignFile CertificateThumbprint="$(ManifestCertificateThumbprint)" 
                  SigningTarget="@(FileToSign)" 
                  TargetFrameworkVersion="v4.5" />
      </Target>
    </Project>

    あとは

    msbuild.exe solution.sln /property:Configuration=Debug /target:Publish
    msbuild.exe solution.sln /property:Configuration=Release /target:Publish
    などのようにmsbuildの引数でプロパティを指定してやればConditionに対応した証明書で署名されると思います。

    #意図が違うのであっても、Conditionで切り替えれば大抵の切り替えは行えます。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2015年9月3日 10:23
    • 回答の候補に設定 星 睦美 2015年9月16日 2:57
    • 回答としてマーク 星 睦美 2015年10月8日 8:17
    2015年9月3日 10:23
  • 単に、msbuildの引数だけでダメでしたっけ?
    --------------------------------
    例:
     A 環境用
      msbuild.exe solution.sln /t:Clean;Publish /p:ManifestKeyFile="<A環境用の証明書のパス>" /p:ManifestCertificateThumbprint="<A環境用の証明書の拇印>"
     B 環境用
      msbuild.exe solution.sln /t:Clean;Publish /p:ManifestKeyFile="<B環境用の証明書のパス>" /p:ManifestCertificateThumbprint="<B環境用の証明書の拇印>"
    --------------------------------
    みたいな感じで。
    • 回答の候補に設定 星 睦美 2015年9月16日 2:57
    • 回答としてマーク 星 睦美 2015年10月8日 8:17
    2015年9月7日 4:44

すべての返信

  • 「証明書ストアではなくファイル(*.pfx)として証明書が複数用意されていて、ClickOnceの発行場所毎に証明書を切り替えたいので、MsBuildでビルドするときに、SignFileタスクの指定だけで証明書の切り替えが可能か?」

    ということでしょうか?
    その場合は、

    1. ソリューションの構成マネージャーで新しいソリューション構成を作る。
    2. プロジェクトのプロパテの署名ページで証明書ファイルやタイムスタンプを指定した状態にして保存する。
    3. *.csprojをVisualStudioのXMLエディタやメモ帳で開く。
    4. 新しくPropertyGroupタグを作り、Condition属性で発行場所に対応する条件を設定する。
    5. ManifestKeyFile,ManifestCertificateThumbprint,ManifestTimestampUrlを上記PropertyGroupタグ内に移動させる。
    6. VisualStudioでプロジェクトを読み直す。
    7. 発行場所の数だけ繰り返す。

    で行けると思う。

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <!-- 省略 -->  
    
      <PropertyGroup>
        <SignManifests>true</SignManifests>
      </PropertyGroup>
      
      <PropertyGroup Condition="'$(Configuration)'==Debug">
        <ManifestKeyFile>TemporaryKey.pfx</ManifestKeyFile>
        <ManifestCertificateThumbprint>0123456789ABCDEF0123456789ABCDEF01234567</ManifestCertificateThumbprint>
        <ManifestTimestampUrl>http://timestamp.hoge-fuga.com/timestamp.dll</ManifestTimestampUrl>
      </PropertyGroup>
    
      <PropertyGroup Condition="'$(Configuration)'==Release">
        <ManifestKeyFile>ReleaseKey.pfx</ManifestKeyFile>
        <ManifestCertificateThumbprint>00112233445566778899AABBCCDDEEFF00112233</ManifestCertificateThumbprint>
        <ManifestTimestampUrl>http://timestamp.hoge-fuga.com/timestamp.dll</ManifestTimestampUrl>
      </PropertyGroup>
    
      <ItemGroup>
        <FileToSign Include="$(TargetPath)" />
      </ItemGroup>
      
      <Target Name="Sign">
        <SignFile CertificateThumbprint="$(ManifestCertificateThumbprint)" 
                  SigningTarget="@(FileToSign)" 
                  TargetFrameworkVersion="v4.5" />
      </Target>
    </Project>

    あとは

    msbuild.exe solution.sln /property:Configuration=Debug /target:Publish
    msbuild.exe solution.sln /property:Configuration=Release /target:Publish
    などのようにmsbuildの引数でプロパティを指定してやればConditionに対応した証明書で署名されると思います。

    #意図が違うのであっても、Conditionで切り替えれば大抵の切り替えは行えます。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2015年9月3日 10:23
    • 回答の候補に設定 星 睦美 2015年9月16日 2:57
    • 回答としてマーク 星 睦美 2015年10月8日 8:17
    2015年9月3日 10:23
  • 単に、msbuildの引数だけでダメでしたっけ?
    --------------------------------
    例:
     A 環境用
      msbuild.exe solution.sln /t:Clean;Publish /p:ManifestKeyFile="<A環境用の証明書のパス>" /p:ManifestCertificateThumbprint="<A環境用の証明書の拇印>"
     B 環境用
      msbuild.exe solution.sln /t:Clean;Publish /p:ManifestKeyFile="<B環境用の証明書のパス>" /p:ManifestCertificateThumbprint="<B環境用の証明書の拇印>"
    --------------------------------
    みたいな感じで。
    • 回答の候補に設定 星 睦美 2015年9月16日 2:57
    • 回答としてマーク 星 睦美 2015年10月8日 8:17
    2015年9月7日 4:44
  • フォーラム オペレーターの星 睦美です。和田さん、今回は質問を投稿いただきありがとうございます。

    和田さんの質問へのgekka さんとmars12 さんから返信が解決の糸口になったのではないかと思います。私のほうで[回答の候補に設定] しましたが、フォーラム ユーザーからの回答がお役にたちましたら投稿者から[回答としてマーク] いただければ幸いです。

    フォーラムのヘルプ
    https://social.msdn.microsoft.com/Forums/ja-JP/e164507c-7d3b-47d7-8be8-dd383e61507c?forum=announceja

    それではこれからもMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年9月18日 7:46