既存の証明書を使って ClickOnce で発行する

前回のアプリケーションを ClickOnce で発行するでは、ClickOnce を使うための基本的な方法を紹介しました。

その方法では、署名用の証明書は自動で生成されたものを使っていました。
これは確かに手っ取り早いのですが、
アプリケーションの数が増えてくると証明書もその分だけ増え、しかも有効期限はばらばらです。
それなりの規模の開発になれば、1 つの証明書に複数のアプリケーションを関連付け、
また発行者のロールを定義して、その証明書を持つメンバーだけが発行できるようにするのがよいでしょう。

そこで今回は、あらかじめ用意された証明書で署名する方法について書いていきます。

 

証明書の設定には、プロジェクトのプロパティの [署名] タブを使います。

image_thumb8

ここには、次の 3 つのボタンがあります。

  • [ストアから選択]
    • 証明書ストアの [個人] にインストールされた証明書の中から選択する
    • プロジェクトに含まれる情報は拇印 (Thumbprint) のみ
  • [ファイルから選択]
    • PFX ファイルを指定してパスワードを入力する
    • プロジェクトに PFX ファイルも含まれる
    • 同時に、証明書ストアの [個人] にもインストールされる
  • [テスト証明書の作成]
    • パスワードおよび署名アルゴリズムを指定して、証明書を作成する
    • 有効期間は 1 年

image

 

[ファイルから選択] の方法では PFX ファイルがプロジェクトに含まれることになるため、
バージョン管理システムを使っていると PFX ファイルも共有されることになります。
したがって、発行者のロールを持つメンバーだけが証明書を持つような運用をするには、[ストアから選択] にします。

PFX を証明書ストアの [個人] にインストールし、[ストアから選択] をクリックします。

image

image

 

署名に使う証明書は、自己署名証明書でも、別の証明書で署名された証明書でもかまいません。
ただし、別の証明書で署名された証明書の場合、
そのルート証明書が [信頼されたルート証明機関] にインストールされていなければなりません。
つまり証明書チェーンが検証されないと発行に失敗します。
有効期限を指定する方法は、証明書を作成するという記事に書いた通りです。

前々回: 証明書を作成する
前回: アプリケーションを ClickOnce で発行する

作成したサンプル
ClickOnceSample (GitHub)

バージョン情報
.NET Framework 4.5
Visual Studio 2013, 2015

参照
方法 : ClickOnce アプリケーション用の信頼された発行者をクライアント コンピューターに追加する

カテゴリー: .NET Framework, ツール. タグ: . 2 Comments »

アプリケーションを ClickOnce で発行する

// この投稿は Windows & Microsoft技術 基礎 Advent Calendar 2015 の 12 日目の記事です。

ClickOnce とは、Windows 上のデスクトップ アプリケーションをネットワーク経由でインストールするための配置テクノロジです。
(ファイル システムからオフラインでインストールすることもできます。USB や DVD 経由なども含みます。)
正確には、ネットワークの有無を吸収して統一的にインストールするための仕組みと言ったほうがよいでしょう。
配置できるアプリケーションには WPF のほか、Windows フォームやコンソール アプリケーションなども含まれます。
ユーザーからすれば、インストーラーをいったんダウンロードする手間が省けます。
また、アプリケーションをアップデートするための仕組みも備わっています。

では、新規で WPF アプリケーション プロジェクトを作成しましょう。
これを最も簡単に ClickOnce で発行するには、[ソリューション構成] を Release に変更して、
プロジェクトのプロパティを開いて [公開] タブの [今すぐ発行] をクリックします。

image

これでアプリケーションが publish フォルダーに発行されました。

image

.application ファイルがエントリ ポイントとなっているので、
これをダブルクリックすればアプリケーションをインストールできます。

image

インストールが完了すれば、スタート メニューからアプリを起動できるようになります。

image

上記ではローカルのファイル システムからインストールしましたが、
ネットワーク経由にする場合も同じフォルダー構成で Web サーバーやファイル サーバーに配置しておき、
ブラウザーやエクスプローラーで .application の URL にアクセスすれば同じようにインストールできます。

 

証明書による署名

さて、上記の手順ですぐに発行すると、証明書に関する手順が省略されます。
実はこのプロセスの中で自動的に、有効期間が 1 年でパスワードの設定されていない自己署名の PFX ファイルが作成され、
さらにそれが証明書ストアの [個人] にインストールされています。

image

image

この PFX ファイルを [信頼されたルート証明機関] にもインストールしておくと、発行元が表示されるようになります。
(実際にクライアント PC に証明書をインストールするときは CER ファイルを使うほうがよいでしょう。)

image

さらに、これを [信頼された発行元] にもインストールすると、このダイアログが現れずにアプリケーションがインストールされます。

なお、PFX ファイルを含めたソース一式を他のコンピューター上でビルドすると、
PFX にパスワードが設定されていなければ、自動的に証明書ストアにインストールされます。
パスワードが設定されている場合は、[署名] タブなどからあらかじめインストールしておかないとビルドに失敗します。

 

コマンドからの発行

次のように、MSBuild.exe で発行することもできます。

msbuild WpfApplication1.csproj /p:Configuration=Release /t:Publish

.NET ビルド小技集 (4) で書いた方法と組み合わせれば、バージョン番号のインクリメントも含めて自動化できそうです。
なお、発行のバージョンとアセンブリのバージョンには関連がありません。

 

オプション

(1) アップデートについて

アプリケーションのアップデートを有効にするには、[公開] タブの [更新] をクリックして、各項目を設定します。
また、[公開] タブにある [インストール フォルダーの URL] も設定します。

image

なお、更新を有効にしなくても、手動での更新はできます (.application にアクセスするだけ)。
また、[プログラムと機能] から、1 世代前までロールバックができます。

 

(2) 表示名について

[公開] タブの [オプション] をクリックして、各項目を設定します。

  • 発行者名 インストール時のルート フォルダーの名前となります。
  • スイート名 ルート フォルダーとアプリケーションの間のフォルダーの名前となります。省略可能です。
  • 製品名 アプリケーションの名前となります。

image

Windows 8 以降、スイート名のフォルダーは表示されなくなりました。

ClickOnce-StartMenu-10

 

Git の設定

発行されたファイルを Git 経由で共有する場合 (GitHub Pages でホストするときなど) は注意が必要です。

Git は既定で、コミット時にテキスト ファイルの改行コードを LF に変換します。
しかし、ClickOnce はインストール時にダウンロードしたすべてのファイルのハッシュを検証するため、
ファイルが変更されてしまうとインストール時にエラーが発生します。
この場合、.manifest や .application などの XML ベースのファイルが該当します。

そこで、以下のように設定を変更します。

(1) config

config で core.autoCRLF を false に設定します。

$ git config --global core.autocrlf false

次のコマンドで設定を確認できます。

$ git config --list

(2) .gitattributes

config よりも、各リポジトリの .gitattributes が優先されます (Visual Studio などにより生成されます)。
.gitattributes ファイル内で text=auto となっている部分を次のように編集します。

text=false

 

さて、今回は自動生成された証明書を使いましたが、次回は既存の証明書を使って ClickOnce で発行する方法についてです。
前回: 証明書を作成する
次回: 既存の証明書を使って ClickOnce で発行する

バージョン情報
.NET Framework 4.5
Visual Studio 2013, 2015

参照
ClickOnce のセキュリティと配置
連載 ClickOnceの真実:第7回 ClickOnceが持つセキュリティ機構とは?

Windowsでgitを使う場合の改行コード自動変換がうざい
git での改行コード
Gitのcore.autocrlfについて
WindowsのGitクライアントSourceTreeのインストールと初期設定

カテゴリー: .NET Framework, ツール. タグ: . 2 Comments »

証明書を作成する

// この投稿は Windows & Microsoft技術 基礎 Advent Calendar 2015 の 11 日目の記事です。

Windows で証明書を作成する方法を紹介します。
ただし、証明書は用途によっていろいろなものがあるので、
ここでは ClickOnce 発行に必要な開発用の証明書ということにします。
後続の既存の証明書を使って ClickOnce で発行するという記事で使います。

ツールとしては、.cer ファイルおよび .pvk ファイルを作成するには Makecert.exe を、
.pfx ファイルを作成するには Pvk2pfx.exe を使います。
また、証明書チェーンとなる .pfx ファイルを作成するには途中で .spc ファイルが必要で、Cert2spc.exe を使います。

Makecert.exe は、Windows 7 以前では .NET Framework ツールに含まれていたと思うのですが、
Windows 8 以降では Windows Driver Kit に入っており、C:\Program Files (x86)\Windows Kits フォルダーにあります。
Pvk2pfx.exe も Windows Driver Kit に入っています。
Windows 7 以前では pvkimprt.exe という別のツールを使っていました。

なお、Visual Studio 開発者コマンド プロンプトを使用すれば、
各ツールの絶対パスを気にすることなく makecert や pvk2pfx と打てます。

Visual Studio 開発者コマンド プロンプト

 

以下では、次の 2 パターンの証明書を作成する方法を示します。

  • 自己署名証明書 (ルート証明書)
    • 証明書ストアの [信頼されたルート証明機関] に配置します。
    • いわゆる「オレオレ証明書」です。
  • 証明書で署名された証明書
    • 証明書ストアの [個人]、[信頼された発行元]、[中間証明機関] などに配置します。

 

自己署名証明書 (ルート証明書) を作成する

とりあえず必須項目のみでルート証明書を作成するには、次のコマンドを実行します。

makecert -n "CN=abc" -r -sv abc-root.pvk abc-root.cer

表示されるダイアログで、秘密キーを保護するためのパスワード (Subject Key) を指定します。
ダイアログは 2 つありますが、すべて同じパスワードを入力します。

Subject Key

Subject Key

これで、.cer (証明書) と秘密キーがエクスポートされた .pvk が作成されました。

主なスイッチの説明は以下の通りです。

  • -r 自己署名であることを示します。
        -r も親の証明書も指定されない場合、"Root Agency" というルート証明機関の下に証明書が作成されます。
  • -n サブジェクト名を指定します。
        CN (Common Name) には区切り文字である "," を使用できません。
        例えば "Abc, Ltd." のような名前は指定できません。

Makecert.exe のスイッチはいろいろありますが、
自分は -a (署名アルゴリズム)、-b (有効期間の開始日)、-e (有効期間の終了日) を指定しています。

makecert -n "CN=Abc Root CA,O=Abc Company,C=JP" -a sha256 -b 01/01/2000 -e 01/01/2100 -r -sv abc-root.pvk abc-root.cer

-eku および -cy については、証明書を作成するときのオプション (OID など) に書きました。

.pfx を作成するには、次のコマンドを実行します。
-pi スイッチには、先ほど .pvk に設定した Subject Key を指定します。

pvk2pfx -pvk abc-root.pvk -spc abc-root.cer -pfx abc-root.pfx -f -pi P$ssword1

これで .pfx が作成されました。

作成された証明書

 

証明書で署名された証明書を作成する

Makecert.exe のスイッチで、-iv および -ic に親となる証明書を指定します。

makecert -n "CN=Abc Test,O=Abc Company,C=JP" -a sha256 -b 01/01/2000 -e 01/01/2100 -iv abc-root.pvk -ic abc-root.cer -sv abc-test.pvk abc-test.cer

新たに作成する証明書のパスワード (Subject Key) を入力するダイアログ (2 つ) のほか、
前項で指定した親の証明書のパスワード (Issuer Signature) を入力するダイアログも現れます。

Issuer Signature

.pfx を作成する方法は先ほどと同じです。

pvk2pfx -pvk abc-test.pvk -spc abc-test.cer -pfx abc-test.pfx -f -pi P$ssword2

この手順の代わりに、途中で .spc を作成するには次のコマンドを使います。

cert2spc abc-root.cer abc-test.cer abc-test.spc
pvk2pfx -pvk abc-test.pvk -spc abc-test.spc -pfx abc-test.pfx -f -pi P$ssword2

.spc は証明書チェーンとなっており、引数で指定した証明書が含まれます。
.spc から .pfx を作成するとチェーンも維持されるため、
この .pfx をインストールすればルート証明書も同時にインストールされます。

 

証明書マネージャー、証明書のインストール

証明書ストアの一覧を表示するには、Certmgr.exe (証明書マネージャー) を引数なしで実行します。
OS やブラウザーの [インターネット オプション] から開く方法もあります。

証明書マネージャー

 

Certmgr.exe にスイッチを指定すれば、コマンドで証明書をインストールできます (.pfx には使えない?)。

certmgr -add -c abc-root.cer -s root
certmgr -add -c abc-test.cer -s trustedpublisher

また、証明書ファイルをダブルクリックすれば、GUI で証明書をインストールできます。
ストアを指定しない場合、.pfx は [個人] に、.cer は [ほかの人] にインストールされます。
.pfx をインストールするには、パスワードの入力が必要です。

 

// 2016. 2. 5: .spc ファイルおよび Cert2spc.exe について追記。

次回: アプリケーションを ClickOnce で発行する
次々回: 既存の証明書を使って ClickOnce で発行する
次々々回: 証明書を作成するときのオプション (OID など)

バージョン情報
Windows 8.1, 10

参照
Makecert.exe (証明書作成ツール)
Certmgr.exe (証明書マネージャー ツール)
Pvk2Pfx
Cert2spc.exe (ソフトウェア発行元証明書テスト ツール)

方法 : 開発中に使用する一時的な証明書を作成する
デジタル署名に関して ~テスト用の証明書を作る~
X509Store.Name プロパティ (証明書ストアの名前)

カテゴリー: ツール. タグ: , . 3 Comments »