Skip to content

MS_LocalMachineCertificateStore

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

ローカルマシンの証明書ストアの更新処理

概要

ReadWrite アクセスを要求するとエラーになる。

ローカルマシンの証明書ストア

X509Store store = new X509Store(
  StoreName.TrustedPublisher, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite); // ← アクセス許可無しでエラー(OpenFlags.ReadOnlyなら動作する)

現在のユーザの証明書ストア

現在のユーザのストアなら動作する。

X509Store store = new X509Store(
  StoreName.TrustedPublisher, StoreLocation.CurrentUser); // ★ StoreLocation.LocalMachine → StoreLocation.CurrentUser
store.Open(OpenFlags.ReadWrite);

補足: 理由は、両ストアの実体の置き場所が違うためである。

ストア 実体 書き込みに必要な権限
CurrentUser HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates ユーザ自身の権限で足りる
LocalMachine HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates 管理特権が必要

管理特権が必要になる処理 にあるとおり、 HKEY_LOCAL_MACHINE 配下のレジストリの更新は 管理特権を要する。証明書ストアもその一例に過ぎない。

なお TrustedPublisherRoot(信頼されたルート証明機関)は マシン全体の信頼を左右するストアである。 ここに書き込めるということは、 そのマシンで「任意の署名を信頼させられる」ということなので、 管理特権が要求されるのは仕様として妥当である。

対策

管理特権が必要になります。

補足: 実装上の選択肢を整理しておく。

  • ユーザ ストアで足りないか見直す
    アプリが自分の 証明書 を使うだけなら CurrentUser で十分なことが多い。

  • インストーラで入れる
    管理特権はインストール時にだけ要求し、 アプリの実行時には要求しない。 certutil -addstorePowerShellImport-Certificate を使う。

  • グループ ポリシー で配布する
    ドメイン環境なら、これが最も運用しやすい。

  • 昇格した別プロセスで実行する
    ProcessStartInfoVerb = "runas" を使う (プロセス内で自身を昇格させることはできない)。

サーバ アプリケーション(IIS のワーカー プロセス等)で LocalMachine ストアの読み取りを行う場合は、 書き込み権限ではなく 秘密鍵ファイルの ACLC:\ProgramData\Microsoft\Crypto\...)が 問題になることが多い。 OpenFlags.ReadOnly で開けても 秘密鍵にアクセスできず落ちる、という症状はこれである。

参考


Tags: あるある, デバッグ

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally