Windows が証明書と秘密キーを保存する場所
<本文>
通常、Windows で証明書を管理するために次のグラフィカル MMC スナップインが使用されます: certlm.msc (ローカル マシン証明書)、certmgr.msc (ユーザー証明書)、および certutil コマンドライン ユーティリティ。これらのツールはすべて、論理証明書ストアと対話し、ディスク上およびレジストリ内の公開証明書キーと秘密証明書キーの物理的な場所をエンド ユーザーやアプリから抽象化します。
Windows の論理証明書ストアと物理証明書ストアの場所
Windows の証明書の公開キーと秘密キーは、同じ中央の場所に保存されません。証明書の公開キーはレジストリに保存されます (抽出可能) が、秘密キー (存在する場合) はファイル システムに保存され、暗号化されます。
デフォルトでは、Windows 証明書マネージャー (certmgr.msc) は証明書ストアの論理ビューのみを表示します。コンソールで物理証明書ストアを表示するには、メニューから 表示 -> オプション を選択し、物理証明書ストアを有効にします。コンソールには、物理的な保管場所 (レジストリ、ローカル コンピューター、スマート カードなど) ごとにグループ化された証明書キーが表示されます。

レジストリ内の証明書:
証明書ストア |
レジストリキー |
説明—|—|—ユーザー |
HKCU\SOFTWARE\Microsoft\SystemCertificates |
ユーザー証明書の公開鍵
ユーザー |
HKCU\SOFTWARE\Policies\Microsoft\SystemCertificates |
AD グループ ポリシーを使用して展開されたユーザー証明書の公開キー
コンピューター |
HKLM\SOFTWARE\Microsoft\SystemCertificates |
マシン証明書の公開鍵
コンピューター |
HKLM\SOFTWARE\Microsoft\Cryptography\Services |
共通サービスの公開鍵
コンピューター |
HKLM\SOFTWARE\Policies\Microsoft\SystemCertificates |
GPO 経由でインストールされたマシン証明書の公開キー
コンピューター |
HKLM\SOFTWARE\Microsoft\EnterpriseCertificates |
マシンの公開キーは、エンタープライズ CA から AD ドメインにインストールされました。
システム ドライブ上の証明書の秘密キー:
ユーザー |
%APPDATA%\Microsoft\SystemCertificates |
このディレクトリには、ユーザーの公開キーと秘密証明書キーへのポインターが保存されます。—|—|—ユーザー | —|—
%APPDATA%\Microsoft\Crypto |
ユーザー秘密鍵コンテナ
コンピューター |
%ProgramData%\Microsoft\Crypto |
マシン秘密鍵コンテナー
DPAPI暗号化。これにより、パスワードを知っているアカウント所有者だけが秘密キーを復号化できるようになります。これにより、攻撃者が侵入した場合に秘密キーが保護されます。
Windows は、ユーザーのログイン パスワードに基づくマスター暗号化キーを使用して、証明書の秘密キーを保護します。これにより、パスワードを知っているアカウント所有者だけが秘密キーを復号化できるようになります。これにより、攻撃者がマシン上のローカル管理者パスワードをリセットした場合に秘密キーが保護されます。
ファイル システム上のオブジェクトにアクセスする方法と同様に、組み込みの証明書プロバイダーを使用して PowerShell から論理証明書ストアにアクセスできます。
たとえば、これはコンピューターの証明書ストアに移動するために使用される PowerShell コマンドです。
cd Cert:\LocalMachine\my
LocalMachine ストア内の証明書を一覧表示します。
アイテムの取得 *

または、certutil コマンドを使用してマシン証明書を一覧表示することもできます。
certutil-store MY
Windows レジストリからの証明書の抽出
証明書は、HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\SystemCertificates\MY レジストリ キーの下に保存されます。これらは、レジストリ キー名の拇印によって識別できます。各証明書のデータは、DER エンコード形式の完全な証明書を含む BLOB バイナリ値に保存されます。
![]()
この PowerShell スクリプトを使用して、サムプリントによってレジストリから BLOB 証明書データを抽出します。次に、データを X509Certificate2 形式に変換し、証明書情報を出力します。
` $regPath=“HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\D9DA2EDD7CBC0EFBF476276672DEBFD56870AAF8”$blob=(Get-ItemProperty-Path $regPath).Blob
$cert=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2-ArgumentList (, $blob)
$cert |形式リストの件名、発行者、NotBefore、NotAfter、拇印 `

この公開キー証明書を CER ファイルとしてエクスポートするには (別のコンピューターに転送するため)、次のコマンドを実行します。
` $certBytes=$cert.Export(System.Security.Cryptography.X509Certificates.X509ContentType::Cert)
System.IO.File::WriteAllBytes(“c:\temp\exported_certificate.cer”, $certBytes) `

このアプローチは、オフラインのレジストリ ハイブからデータを抽出して、障害が発生したシステムの証明書ストアを分析する場合に役立ちます。これにより、コンピュータにインストールされている証明書の公開部分をすべて抽出できます。
RecoverOfflineCertificate スクリプトを使用して、オフライン コンピューターから秘密キーをエクスポートします。
*️⃣ 出典リンク:
AD グループ ポリシーを使用してデプロイされた証明書、 、ローカル管理者のパスワードをリセット、 、 RecoverOfflineCertificate 、