none
Mage.exe を使ったマニフェストへの署名 RRS feed

  • 質問

  • Visual Studio 2010 で office2010 のアドイン開発(VSTO)を行っています。

    アドインへの署名に関する質問なのですが、最近 GlobalSign の署名ファイルが pfx ファイルを使用したものから USB Token を使用したものに変更になりました。

    signtool.exe を使用しての署名に関しては
    signtool.exe sign /v /a /n "Common Name" /tr "timestamp URL"/td sha256 "Addin.dll"
    とすることで署名できるのですが、Mage.exe を使用してマニフェストへの署名、更新を次のように実行すると失敗してしまいます。
    mage.exe -Sign Addin.dll.manifest -CertFile "Common Name"
    mage.exe -Update Addin.vsto -appmanifest Addin.dll.manifest -CertFile "Common Name" -a sha256RSA
    どちらの場合も Common Name というファイルが見つかりませんという内容のエラーが表示されます。

    現在 GlobalSign では pfx ファイルの配布は行っておらず USB Token を使用してのみ署名可能としています。
    mage.exe での USB Token を使用した署名方法またはそれに代わるツールがありましたらご教示ください。





    2018年3月12日 8:59

すべての返信

  • こんばんは、

    mage.exe の -cf および -CertFile オプションには、証明書の Common Name ではなく filepath を渡すべきと思いますので、MMC の証明書スナップイン等から対象の証明書を .pfx 形式のファイルへエクスポートし、その .pfx ファイルを引数にして再度試されてみてはいかがでしょうか。

    ご参考まで、 [1] mage.exe のオプションについて、 [2] [3] MMCスナップインによる証明書のエクスポートについて、をそれぞれ説明する外部リンクを下記に追記します。

    [1] Mage.exe の Sign コマンドオプション
    https://docs.microsoft.com/ja-jp/dotnet/framework/tools/mage-exe-manifest-generation-and-editing-tool#Sign

    [2] 方法 : MMC スナップインを使用して証明書を参照する
    https://docs.microsoft.com/ja-jp/dotnet/framework/wcf/feature-details/how-to-view-certificates-with-the-mmc-snap-in

    [3] Windows環境で証明書をエクスポートする方法
    https://jp.globalsign.com/support/faq/11.html


    -- Momoto, Seiji

    2018年3月12日 14:45
  • 返信ありがとうございます。

    Global Sign の USB Token は証明書のエクスポート禁止フラグがついておりエクスポートできない仕様になっています。

    マニフェストへの署名ができず困っています。

    2018年3月13日 5:45
  • 海外に同じ質問が挙がっていますが、特にコメントがついていない状態です。

    ClickOnce, Manifest Generation and Editing and signing with Token protected Certificate
    https://social.msdn.microsoft.com/Forums/en-US/43c19da5-0713-4b01-948c-5d256b6bd821/clickonce-manifest-generation-and-editing-and-signing-with-token-protected-certificate?forum=winformssetup

    有償サポートへの問い合わせも検討された方が良いかもしれません。

    2018年3月13日 11:22
    モデレータ
  • フィードバック、ありがとうございます。証明書ストアから証明書ファイルをエクスポートできないために署名ができない状態と理解しました。

    Mage.exe のグラフィカルユーザーインターフェースである MageUI.exe を使用すると、「署名オプション」画面から Windows にインストールされた証明書を使用して署名できるようですので、こちらの方法をお試しください。MageUI.exe は、Mage.exe があるのと同じフォルダから見つかると思います。私の Windows 10 の環境の場合ですと <C:\Program Files (x86)\Microsoft SDKs\Windows\{version}\bin\NETFX {version} Tools\> です。

    MageUI.exe が見つかったら、まず対象のアプリケーションマニフェストを開き(または新規作成)、「ファイル」メニューの「ユーザー設定」から「保存時に署名する」にチェックされていることを確認してください。この設定がチェックされている場合に限り、マニフェストの保存時に「署名オプション」画面が開きます。

    有効な証明書がインストールされていれば、この画面の「保存された証明書で署名する (Sign with stored certificate)」に利用可能な証明書が表示されるはずです。ここで対象の証明書が表示されない場合は、証明書の目的が「すべて」または「コード署名」になっていることをご確認ください。

    ご参考まで、英語UI ですが、私の環境で試した時のスクリーンショットを添付いたします:

    以上の情報は次の外部リンクを参考にしてまとめました。より詳しい情報が掲載されていますので、あわせてご確認ください。

    MageUI.exe (マニフェスト生成および編集ツールのグラフィカル クライアント)
    https://docs.microsoft.com/ja-jp/dotnet/framework/tools/mageui-exe-manifest-generation-and-editing-tool-graphical-client

    うまく署名ができるといいですね。ご不明な点があればご返信ください。


    -- Momoto, Seiji

    2018年3月13日 14:19
  • 返信ありがとうございます

    色々と調べたのですが皆さん苦労されてるようですね

    Global Sign としてもこの部分はサポート対象外としているのであとは有償のサポートですね

    ありがとうございます

    2018年3月14日 11:19
  • 返信ありがとうございます

    言葉足らずでしたが、コンパイル→署名→インストーラの作成

    までを自動化している状況下でBATが通らなくなってしまって困っていました

    一部手動になっても解決できる可能性があるなら試したみたいと思います

    ありがとうございました

    2018年3月14日 11:23
  • USB Tokenに格納されている署名は使ったことないですが、もしもcertmgr.mscの個人証明書に登録できるとしたら、-CertFileではなく-CertHashでできるんじゃないでしょうか。

    -Certhashの<hash>には証明書をダブルクリックして詳細を表示させて見られる拇印を渡します。
    (コピペしようとすると不可視文字が混ざることがあるみたいなので注意)

    あるいは、以下のようなコードでもハッシュは得られます。

    using System;
    using System.Security.Cryptography.X509Certificates;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
                store.Open(OpenFlags.OpenExistingOnly);
                X509Certificate2Enumerator enumerator = store.Certificates.GetEnumerator();
                foreach (X509Certificate2 cert in store.Certificates)
                {
                    if (cert.NotBefore < DateTime.Now  && cert.NotAfter < DateTime.Now)
                    {
                        Console.WriteLine(cert.GetNameInfo(X509NameType.SimpleName, true));
                        Console.WriteLine(cert.IssuerName.Name);
                        Console.WriteLine("{0} - {1}", cert.NotBefore, cert.NotAfter);
                        Console.ForegroundColor= ConsoleColor.Red;
                        Console.WriteLine(cert.GetCertHashString());
                        Console.ResetColor();
                        Console.WriteLine();
                    }
                }
            }
        }
    }

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

    2018年3月15日 3:34
  • ご回答ありがとうございます

    Hashも試したのですがダメでした

    Private Key のエクスポートが禁止されているので結局の所 USB Token へアクセスする必要があるのだと思いますがその部分が未実装なのだと思われます

    セキュリティ強化によって出来ることが大きく制限されたという印象です

    2018年3月15日 4:23
  • すみません。コマンドラインでの方法は分からなかったのですが、

    Visual Studio 2015 ですと、プロジェクトのプロパティの「署名」→「ClickOnce マニフェストに署名する」→「ストアから選択」で証明書を選択し、発行することで、USB Token を使ったマニフェストへの署名が可能でした。

    下記のサイトでは、「マニフェスト署名のため .NET Framework 4.6 以上が必要」と記載がありました。一度ツール類のバージョンを確認してみてはいかがでしょうか?

    参考サイト: https://blogs.msdn.microsoft.com/jpvsblog/2016/10/12/evcodesign-clickonce/

    2018年3月15日 10:04
  • Global Sign の USB Token 証明書でMAGE.exeを使ってマニフェストの更新ができました。

    "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\mage.exe"

     -Update "Application Files\prog_2_1_27_0\prog.exe.manifest" -ch 拇印

    拇印は、証明書の詳細の下の方にあります。 スペースで区切られているのでスペースを除いて指定します。

    2019年10月23日 8:16