-
Notifications
You must be signed in to change notification settings - Fork 0
MS_LocalMachineCertificateStore
-
TOP > トラブルシュート > あるある > 管理特権が必要になる処理
- ローカルマシンの証明書ストアの更新処理
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);補足: 理由は、両ストアの実体の置き場所が違うためである。
ストア 実体 書き込みに必要な権限 CurrentUserHKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificatesユーザ自身の権限で足りる LocalMachineHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates管理特権が必要 管理特権が必要になる処理 にあるとおり、
HKEY_LOCAL_MACHINE配下のレジストリの更新は 管理特権を要する。証明書ストアもその一例に過ぎない。なお
TrustedPublisherやRoot(信頼されたルート証明機関)は マシン全体の信頼を左右するストアである。 ここに書き込めるということは、 そのマシンで「任意の署名を信頼させられる」ということなので、 管理特権が要求されるのは仕様として妥当である。
管理特権が必要になります。
補足: 実装上の選択肢を整理しておく。
ユーザ ストアで足りないか見直す
アプリが自分の 証明書 を使うだけならCurrentUserで十分なことが多い。インストーラで入れる
管理特権はインストール時にだけ要求し、 アプリの実行時には要求しない。certutil -addstoreや PowerShell のImport-Certificateを使う。グループ ポリシー で配布する
ドメイン環境なら、これが最も運用しやすい。昇格した別プロセスで実行する
ProcessStartInfoのVerb = "runas"を使う (プロセス内で自身を昇格させることはできない)。サーバ アプリケーション(IIS のワーカー プロセス等)で
LocalMachineストアの読み取りを行う場合は、 書き込み権限ではなく 秘密鍵ファイルの ACL(C:\ProgramData\Microsoft\Crypto\...)が 問題になることが多い。OpenFlags.ReadOnlyで開けても 秘密鍵にアクセスできず落ちる、という症状はこれである。
Tags: あるある, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。