PowerShellを使用したWindows証明書管理

Windowsシステム管理者であれば、Windowsの証明書と取り組むことがあるかもしれません。Windowsで証明書を扱うことは、通常、システム管理者が担当する追加の役割の1つです。Windowsの証明書マネージャーをツールとして使用することで、それが可能です!

証明書は一般的に複雑で理解しにくいものですが、この記事ではWindowsではそれほど恐ろしいものではないことがわかります!

この記事では、主にWindowsで証明書を扱う方法について説明します。一般的な証明書の動作について詳しく知りたい場合は、この記事の関連記事であるX.509証明書チュートリアルをご覧ください。

証明書ストアの理解

Windowsの証明書マネージャーでは、すべての証明書が論理的な保存場所である「証明書ストア」に存在します。証明書ストアは、現在インストールされているすべての証明書を保持する「バケツ」のようなものであり、証明書は複数のストアに存在する場合があります。

残念ながら、証明書ストアは直感的ではありません。以下では、これらのストアの違いを理解し、それらを操作する方法について説明します。

各ストアは、Windowsレジストリとファイルシステムに存在します。詳細については、以下の表を参照してください。ストア内の証明書を操作する場合、論理的なストアとやり取りしており、直接レジストリやファイルシステムを変更しているわけではありません。このようにすることで、Windowsがオブジェクトをディスク上でどのように表現するかを自動的に処理できます。

証明書ストアは、物理的なストアまたは論理的なストアとして参照されることがあります。物理的なストアは、実際のファイルシステムまたはレジストリの場所を指し、レジストリキーまたはファイルが格納されます。論理的なストアは、1つ以上の物理的なストアを参照する動的な参照です。一般的な用途では、論理的なストアの方が物理的なストアよりも操作が容易です。

Windowsは、ユーザーコンテキストとコンピューターコンテキストの2つの異なる領域に証明書を格納します。証明書は、単一のユーザー、複数のユーザー、またはコンピューター自体で使用するかどうかに応じて、これらの2つのコンテキストのいずれかに配置されます。この記事の残りでは、ユーザーコンテキストおよびコンピューターコンテキストの証明書を非公式にユーザー証明書とコンピューター証明書と呼びます。

ユーザー証明書

証明書を単一のユーザーが使用することを意図している場合、Windowsの証明書マネージャー内のユーザー証明書ストアが理想的です。これは、有線IEEE 802.1xなどの証明書ベースの認証プロセスの一般的な使用例です。

ユーザー証明書は、現在のユーザーのプロファイル内にあり、そのユーザーのコンテキスト内でのみ論理的にマッピングされます。ユーザー証明書は「マッピング」され、同じシステム上でも各ユーザーごとに一意です。

コンピューター証明書

コンピュータまたはシステムプロセスのすべてのユーザーが使用する場合、証明書はコンピュータのコンテキスト内のストアに配置する必要があります。たとえば、すべてのクライアントの通信を暗号化するためにWebサーバーで証明書を使用する場合、コンピュータのコンテキストのストアに証明書を配置することが理想的です。

コンピュータの証明書ストアは、すべてのユーザーコンテキストに論理的にマッピングされています。これにより、コンピュータの証明書ストアにある証明書は、プライベートキーの構成に応じてすべてのユーザーによって使用されることができます。

プライベートキーに関する詳細な情報については、記事「X.509証明書チュートリアル:システム管理者ガイド」を参照してください。

コンピュータ証明書は、ローカルマシンレジストリハイブおよびProgram Dataフォルダにあります。ユーザー証明書は、Current UserレジストリハイブおよびApp Dataフォルダにあります。以下に、各タイプのストアがレジストリとファイルシステムのどこにあるかの詳細を示します。

Context Registry Path Explanation
User HKCU:\SOFTWARE\Microsoft\SystemCertificates\ Physical store for user-specific public keys
User HKCU:\SOFTWARE\Policies\Microsoft\SystemCertificates\ Physical store for user-specific public keys installed by Active Directory (AD) Group Policy Objects (GPOs)
Computer HKLM:\SOFTWARE\Microsoft\SystemCertificates\ Physical store for machine-wide public keys
Computer HKLM:\SOFTWARE\Microsoft\Cryptography\Services\ Physical store for keys associated with a specific service
Computer HKLM:\SOFTWARE\Policies\Microsoft\SystemCertificates\ Physical store for machine-wide public keys installed by GPOs
Computer HKLM:\SOFTWARE\Microsoft\EnterpriseCertificates\ Physical store for machine-wide public keys installed by the Enterprise PKI Containers within an AD domain
Context File Location Explanation
User $env:APPDATA\Microsoft\SystemCertificates\ Physical store for user-specific public keys and pointers to private keys
User $env:APPDATA\Microsoft\Crypto\ Physical store for user-specific private key containers
Computer $env:ProgramData\Microsoft\Crypto\ Physical store for machine-wide private key containers

前提条件

この記事の残りの部分では、Windowsの証明書ストアとの対話を示す複数の例があります。これらの例を再現するには、次の前提条件を満たしてください:

  • Windows Vista、Windows Server 2008、または新しいオペレーティングシステム。表示される例では、Windows 10 Enterpriseバージョン1903を使用しています。
  • PowerShellの理解。必須ではありませんが、必要に応じて証明書を参照するために使用される言語です。表示される例はすべて、Windows PowerShell 5.1で作成されています。
  • 特定の証明書をインストールする必要はありませんが、自己署名証明書を使用することは有益です。

Windowsでの証明書の管理方法

Windowsでは、証明書を管理するための主な方法が3つあります:

  • 証明書Microsoft Management Console (MMC) スナップイン (certmgr.msc)
  • PowerShell
  • certutilコマンドラインツール

この記事では、証明書の管理方法について、Certificates MMC スナップインと PowerShell を使用して学びます。 certutilの使用方法について詳しく知りたい場合は、Microsoft Docsを参照してください。

PowerShell と Windows セキュリティ証明書マネージャー

Windowsでは、証明書を数種類の方法で管理できますが、どちらを選ぶべきでしょうか?GUI(MMC)経由で行くべきか、PowerShellのコマンドライン経由で行くべきかを考えてみましょう。

注意: この記事は、Windows 7 の証明書マネージャーと Windows 10 の証明書マネージャー MMC スナップインの両方に関連しています。

まず、証明書のライフサイクルを考えてみましょう。1回だけ証明書をインストールまたは削除する場合は、MMCを使用することを検討してください。しかし、複数の証明書を管理したり、同じ作業を何度も繰り返す場合は、コマンドライン経由の方法が適しているかもしれません。PowerShellスクリプトの書き方がわからなくても、多くの異なる証明書を管理する必要がある場合は、学ぶ価値があります。

最初に、証明書マネージャーとPowerShellを使用してWindowsにインストールされた証明書を参照する方法を見てみましょう。

Windows証明書マネージャー(certmgr.msc)を使用する

MMCを使用して証明書を表示するには、スタートメニューを開き、certmgr.mscと入力します。これにより、Windows証明書MMCが表示されます。この初期表示では、左のウィンドウに表示されるすべての論理ストアの概要が提供されます。

以下のスクリーンショットでは、信頼されたルート認証機関の論理ストアが選択されていることがわかります。

Trusted Root Certification Authorities store

物理ストアの表示

デフォルトでは、Windows証明書マネージャーは実際の物理ストアを表示しません。ストアを表示するには、表示をクリックしてオプションを選択します。すると、Windows内の特定のパスを特定するのが簡単になるように、物理証明書ストアを表示するオプションが表示されます。

Figure 2 – The Certificates MMC View Options with Physical certificate stores selected.

前述の例の信頼されたルート認証機関の論理ストアの下に、追加のコンテナが表示されるようになりました。証明書はまだ論理ストアに相対的にグループ化されていますが、物理ストアである「レジストリ」も表示されます。

Inspecting the physical cert stores

Windows証明書マネージャーで属性を検査する

MMCで証明書を表示する際には、証明書の多くの属性を見ることができます。たとえば、特定の証明書を選択したいと思うでしょう。

これを達成するための最も簡単な方法は、証明書の シリアル番号または サムプリント拡張値を参照することです。証明書が証明書機関(CA)によって署名された場合、発行時にシリアル番号が付与されます。サムプリントは、証明書を表示するたびに計算されます。

以下のように、MMCで証明書を開くことで、いくつかの属性を表示することができます。

Inspecting a Windows certificate

特筆すべき重要な機能の1つは、埋め込まれたプライベートキーです。Windowsの証明書は、対応するプライベートキーを持つこともあります。これらのプライベートキーは、暗号化されたファイルとして対応する物理的なストアに保存されます。

対応するプライベートキーを持つ証明書と持たない証明書をすばやく区別するには、証明書のアイコンを確認してください。Windowsの証明書マネージャーでは、アイコンがリボン付きの紙片のように見える場合、対応するプライベートキーはありません。証明書にプライベートキーがある場合、MMCのアイコンにはキーが表示され、証明書を開くと一般タブの下部にキーが表示されます。

Certificate without an embedded private key

PowerShellを使用する

MMCと同様に、PowerShellでも証明書を表示および管理することができます。まず、物理的なストア(レジストリおよびファイルシステム)内の証明書を調べてみましょう。

物理的なストアごとに

Get-ChildItem PowerShellコマンドレットを使用して、親のHKCU:\Software\Microsoft\SystemCertificates\CA\Certificates\レジストリキーパス内のすべてのキーと値を列挙できます。

以下のコマンドは、現在ログインしているユーザーの証明書を中間認証機関論理ストアで列挙します。

Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates\

表示されるレジストリ ハイブの各エントリは、信頼されたCAの証明書のThumbprintに対応し、対応するプロパティにはその証明書が含まれています。以下に、この出力の例を示します。

Results of the installed certificates from the example commands, limited to the first 5 entries.

もう1つの一般的なストアは、個人用ストアです。このストアの証明書はレジストリではなくファイルシステム上にあります。以下のコマンドでは、これらの異なる物理パスとその目的を示します。

以下のコマンドで返されるディレクトリ内の各ファイルは、個人用の現在のユーザーストアにインストールされた証明書に対応しています。

Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Certificates\

以下のコマンドで返される各ファイルは、キーストレージプロバイダ(KSP)によって作成されたプライベートキーのオブジェクトへの参照です。ファイル名は証明書のサブジェクトキー識別子に対応しています。インストールするプライベートキーごとに、対応するファイルが追加されます。

Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Keys\

以下のコマンドで返されるディレクトリ内の各ファイルは、KSPによって作成された暗号化されたプライベートキーの固有のコンテナです。ファイル名と証明書との直接の関係はありませんが、ファイルは以前のコマンドのポインターの対象です。

Get-ChildItem -Path $env:APPDATA\Microsoft\Crypto\Keys

論理ストアごとに

物理的なパスで証明書を扱うことは一般的ではありませんので、他の例では論理ストアを使用します。

PowerShellは、Cert: PSDriveを使用してWindowsの論理ストアにアクセスできます。Cert: PSDriveは、MMCと同様に証明書を物理ストアにマッピングします。

残念ながら、MMCとCert PSDriveでは、論理ストアに対するラベルが異なります。以下に、MMCとCert PSDriveの両方での一般的なストアとその名前の比較表があります。

Cert: Certificates MMC
My Personal
Remote Desktop Remote Desktop
Root Trusted Root Certification Authorities
CA Intermediate Certification Authorities
AuthRoot Third-Party Root Certification Authorities
TrustedPublisher Trusted Publishers
Trust Enterprise Trust
UserDS Active Directory User Object
証明書の選択

証明書を操作するためには、フィルタリングや選択する方法が必要です。ほとんどの場合、特定の拡張子の値に基づいて証明書をフィルタリングおよび選択します。

以下の例では、開始時にルートCAストアにインストールされているすべての証明書をリストアップする必要があります。

Get-ChildItem -Path Cert:\CurrentUser\Root\

返されるオブジェクトは、以下の例で使用できる証明書オブジェクトです。

一般的な拡張子は、証明書オブジェクトのプロパティとして既に利用可能です。以下の例では、Get-Memberを使用して返されるオブジェクトのすべてのプロパティをリストしています。

Get-ChildItem -Path Cert:\CurrentUser\Root\ | Get-Member -MemberType Properties
Figure 9 – The properties available for the returned certificate objects.

図9で見るように、発行者などのいくつかの拡張子は、証明書を見つけるのに役立ちます。拡張子は、証明書に関する情報(発行先、使用目的、制限など)を提供します。

より複雑な使用例では、使用される証明書テンプレートなど、他の拡張子で証明書を検索したい場合があります。困難な点は、これらの拡張子の値が整数の配列として返されることです。これらの整数は、ASN.1エンコードされたコンテンツに対応しています。

オブジェクト上で利用可能な既存のScriptPropertiesには、これらとのインターフェース例が示されています。以下のコマンドでは、キーの使用方法を手動で抽出して、この関係を確認します。

((Get-ChildItem -Path Cert:\CurrentUser\Root\ | select -First 1).Extensions | Where-Object {$_.Oid.FriendlyName -eq "Key Usage"}).format($true)

上記のコマンドで新たに導入するのは、formatメソッドです。このメソッドはASN.1デコードを実行します。返されるオブジェクトが単一行または複数行であるかを識別するために、真偽値(例:$true)を渡します。

以下のコマンドでは、図7の証明書からThumbprintの値を使用します。Thumbprintの値はPowerShell変数として設定され、以下のコマンドで特定の証明書を選択するために使用されます。

$thumb = "cdd4eeae6000ac7f40c3802c171e30148030c072"
Get-ChildItem -Path Cert:\CurrentUser\Root\ | Where-Object {$_.Thumbprint -eq $thumb}

PowerShellを使用した自己署名証明書の作成

PowerShellはNew-SelfSignedCertificateコマンドレットを使用して自己署名証明書を作成することができます。自己署名証明書は、CAの使用なしで公開鍵と秘密鍵のペアを生成することができるため、テストに便利です。

次の手順の例で使用するために、現在のユーザーおよびローカルマシンストアに自己署名証明書を作成しましょう。

以下の例では、PowerShellが公開鍵と秘密鍵のペア、自己署名証明書を生成し、適切な証明書ストアにすべてインストールしています。

PS51> New-SelfSignedCertificate -Subject 'User-Test' -CertStoreLocation 'Cert:\CurrentUser\My'
PS51> New-SelfSignedCertificate -Subject 'Computer-Test' -CertStoreLocation 'Cert:\LocalMachine\My'

本番サービスで自己署名証明書を使用することは推奨されていません。信頼ベースのメカニズムが存在しないためです。

証明書のインポート/エクスポート

公開鍵暗号は、公開鍵が広くアクセス可能であることに基づいています。この原則に基づいて、効果的に証明書を共有するための標準的な方法が必要です。同様に、秘密鍵のセキュリティも重要です。一部の秘密鍵については、アクセスできないメディアに保存したり、災害対策資料と共に保管するのが一般的な方法です。

これらの両方には、これらの暗号オブジェクトを標準的な形式で保存する方法が必要です。エクスポート機能により、これらのオブジェクトを保存し、広く受け入れられている標準的なファイル形式を使用することができます。インポート機能により、これらの暗号オブジェクトをWindowsオペレーティングシステムに取り込むことができます。

Windows証明書マネージャー(certmgr.msc)の使用

MMCから証明書をエクスポートすることは比較的簡単です。証明書をエクスポートするには、MMCで証明書をクリックし、「すべてのタスク」メニューをクリックしてから「エクスポート」をクリックします。

エクスポート中に、以下のようにファイル形式を選択するように求められます。最も一般的なオプションはDERまたはBase-64エンコードです。

Figure 10 – Exporting a certificate with no private key or one that is marked as not exportable.

秘密鍵のエクスポート

関連する秘密鍵を持つ証明書をエクスポートするには、2つの条件を満たす必要があります。ログインしているアカウントには、秘密鍵へのアクセス権限が必要です(コンピュータ証明書の場合のみ)、また、秘密鍵はエクスポート可能としてマークされている必要があります。

ローカルコンピュータの秘密鍵の権限を確認するには、秘密鍵を持つ証明書を選択し、証明書MMC内のすべてのタスクを選び、秘密鍵の管理を選択します。開かれるダイアログボックスには、秘密鍵のアクセス制御エントリが表示されます。

The Basic Security Property Page for the private keys of a certificate with the Subject of ServerName.

これらの2つまたは3つの前提条件を満たした場合、証明書を選択し、すべてのタスクをクリックし、公開鍵のみを持つ証明書と同様にエクスポートをクリックします。エクスポート時には、以下に示すようにはい、秘密鍵をエクスポートを選択するオプションが表示されるはずです。

Certificate Export Wizard with exportable private key.

Windowsで秘密鍵をエクスポートする場合、ファイルはPFXとしてのみ保存できます。これらのファイルタイプとエンコーディング形式は、この投稿で詳しく説明されています。

エクスポートウィザードに表示される残りの設定については、デフォルト値を使用できます。以下の表は、各設定の概要です。

Setting Description
Including all certificates in the certification path if possible Helps with portability of certificate issuers, and includes all pertinent public keys in the PFX
Delete the private key if the export is successful Removes the private key from the file and has few common use cases, but one example is to test access to private keys
Export all extended properties Will include any extensions within the current certificate, these relate to the certificates [specific settings]() for Windows interfaces
Enable certificate privacy Normally only the private key will be encrypted in the exported PFX file, this setting encrypts the entire contents of the PFX file
Group or user names You can use a group or user security principal from Active Directory for encrypting the contents of the PFX file, but a password is the most portable option across legacy systems or computers not joined to the same domain

証明書のインポート

サポートされているすべての証明書ファイルタイプに対して、インポート機能は同じです。唯一の違いは、ファイルに秘密鍵が含まれている場合に「このキーをエクスポート可能にする」というオプションが利用できることです。Windowsは証明書のインポートウィザードを利用します。

Figure 12 – Certificate Import Wizard with a PFX file.

PFXの場合、証明書インポートウィザードを使用する際には、秘密鍵を暗号化するために使用されるパスワードを入力する必要があります。以下にインポートオプションの再説明を示します。

Setting Description
Enable strong private key protection Requires a password for each access of a private key, be cautious of newer functions as they will not be supported in all software
Mark this key as exportable You should try to avoid using this setting on any end system, private keys should be treated similarly to storing passwords
Protect private key using [virtualization-based security] The setting provides more security functionality for protecting private keys from advanced malware attacks
Include all extended properties Relates to the same Windows-specific settings discussed as with exporting

PowerShellのコード署名証明書は、強力な秘密鍵の保護に適しています。

証明書の自動配置は注意が必要です。証明書ストアを手動で選択すると、最良の結果が得られるでしょう。

PowerShellを使用する

これで、以前に作成した自己署名証明書のうちの1つをPowerShellでエクスポートします。この例では現在のユーザーが使用されていますが、どちらでも使用できます。

以下では、発行者がサブジェクトと一致する、現在のユーザーのパーソナル論理ストア内の自己署名証明書を選択しています。

$certificate = Get-Item (Get-ChildItem -Path Cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq $_.Issuer}).PSPath

証明書を選択したので、以下のコマンドを使用してDERエンコードされたファイルを保存することができます。

Export-Certificate -FilePath $env:USERPROFILE\Desktop\certificate.cer -Cert $certificate

次に、プライベートキーもエクスポートしてみましょう。以下では、選択した証明書にプライベートキーがあることを確認しています。これがtrueを返さない場合、Get-Itemコマンドが間違った証明書を選択した可能性があります。

$certificate.HasPrivateKey

以下では、プライベートキーを暗号化するためのパスワードを設定します。選択した証明書をPFXファイルにエクスポートし、先に入力したパスワードでファイルを暗号化します。

$pfxPassword = "ComplexPassword!" | ConvertTo-SecureString -AsPlainText -Force
Export-PfxCertificate -FilePath $env:USERPROFILE\Desktop\certificate.pfx -Password $pfxPassword -Cert $certificate

エクスポートと同様に、証明書のインポートには2つのコマンドがあります。証明書のインポートとPFXファイルのインポートです。

以下のImport-Certificateコマンドは、以前にエクスポートしたDER形式のファイルを現在のユーザーの個人ストアにインポートします。

Import-Certificate -FilePath $env:USERPROFILE\Desktop\certificate.cer -CertStoreLocation Cert:\CurrentUser\My

例えば、その証明書の秘密鍵もインストールしたい場合を考えてみましょう。

$pfxPassword = "ComplexPassword!" | ConvertTo-SecureString -AsPlainText -Force
Import-PfxCertificate -Exportable -Password $pfxPassword -CertStoreLocation Cert:\CurrentUser\My -FilePath $env:USERPROFILE\Desktop\certificate.pfx

なお、パスワードはSecure Stringである必要があります。また、ローカルマシンストア(例:Cert:\LocalMachine\)にインポートする場合は、管理者としてプロンプトを実行する必要があります。

上記の例では、コマンドとともにExportableパラメータも使用しており、将来において秘密鍵をエクスポート可能にしています。デフォルトでは、エクスポート不可となっています。エクスポート可能な秘密鍵も、セキュリティに関する考慮事項であり、どのように保護するかについてさらなる焦点を当てるべきです。

Windowsで証明書には他にも多くの操作がありますので、さらに探索してみることをお勧めします。

PowerShellで証明書を削除する場合

証明書を削除する際には、ごみ箱は存在しないことを念頭に置く必要があります。証明書を削除すると、それは消えてしまいます。これは、シリアル番号やサムプリント拡張値などの一意の識別子を検証して、正しい証明書を削除していることを確認することが重要です。

上記と同様に、以下のコマンドでは、現在のユーザーの個人ストアから自己署名証明書を選択しています。

$certificate = Get-Item (Get-ChildItem -Path Cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq $_.Issuer}).PSPath

以下には、選択した証明書のサムプリント、シリアル番号、およびサブジェクトのプロパティが表示されており、選択した証明書が意図した証明書であることを確認できます。

$certificate.Thumbprint
$certificate.SerialNumber
$certificate.Subject

削除する意図の正しい証明書を選択したことを確認してください。

次のコマンドは、選択したすべての証明書オブジェクトを削除します。注意して使用してください。以下のコマンドで$certificateオブジェクトをパイプラインを介してRemove-Itemコマンドレットに渡すことで、確認プロンプトなしですべての証明書コンテンツが削除されます。

$certificate | Remove-Item

概要

この記事では、Windowsで証明書にアクセスする方法と、それらを使用する際のいくつかのツールについて学びました。特定のサービスとインストールされた証明書を関連付ける方法や、独自の証明機関(CA)を展開してプライベートな公開鍵インフラストラクチャ(PKI)を実装する方法など、さらに探求することができます。

さらなる読み物

Source:
https://adamtheautomator.com/windows-certificate-manager/