はじめに
Windows で証明書をエクスポートしようとした際、以下のような GUI 手順を踏んでいる方も多いのではないでしょうか。
- 「インターネットオプション」を開く
- 「コンテンツ」タブをクリック
- 「証明書」ボタンをクリック
- ウィザードに従って画面を進めていく
手順が多く、Windows Server Core のような GUI を持たない環境や、数十台の PC へ証明書を一括配布する場面ではマウス操作には限界があります。
そこで本記事では、PowerShell の PKI モジュール(Export-PfxCertificate / Import-PfxCertificate)と Windows 標準コマンド(certutil)を使って、証明書の確認・エクスポート・インポートをコマンドラインだけで完結させる方法 を解説します。さらに、3 方式(PowerShell / certutil / GUI)の使い分けや、AES256 暗号化への対応、エクスポート時のトラブルと対処 にも触れます。
- PowerShell で証明書の「拇印(Thumbprint)」を検索する方法
- PowerShell PKI コマンドレットでの PFX エクスポート・インポート手順
- certutil による代替手順(AES256 暗号化対応)
- PowerShell・certutil・GUI の使い分け
- エクスポート時のエラーと対処(秘密鍵が非エクスポート可能な場合など)
対象の証明書を見つける(PowerShell)
証明書を操作するには、その証明書を一意に特定する ID である 拇印(Thumbprint) が必要です。Subject(名前)は重複することがあるため、操作対象の特定には拇印を使うのが確実です。拇印は 40 桁の 16 進数(SHA-1 ハッシュ、160 ビット) で表現されます。
証明書ストアの一覧表示
PowerShell を起動し、以下のコマンドを実行することで、現在のユーザーの「個人」ストアにある証明書一覧を表示できます。
Get-ChildItem -Path Cert:\CurrentUser\My実行結果の例
PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
Thumbprint Subject
---------- -------
B1E52CD8EA6CDB32A120CF48553C6DXXXXXXXXXX CN=User01Thumbprint 列に表示されている 40 桁の英数字が拇印です。
主要な証明書ストアのパス
PowerShell では、Cert: という PSDrive を介して証明書ストアにアクセスします。代表的なストアパスは以下のとおりです。
| パス | 内容 | 主な用途 |
|---|---|---|
Cert:\CurrentUser\My | 現在のユーザーの「個人」 | クライアント証明書(VPN、メール署名など) |
Cert:\CurrentUser\Root | 現在のユーザーの「信頼されたルート」 | ユーザー個別の信頼ルート CA |
Cert:\LocalMachine\My | ローカルコンピューターの「個人」 | サーバー証明書(IIS、RDP など) |
Cert:\LocalMachine\Root | ローカルコンピューターの「信頼されたルート」 | 全ユーザー共通の信頼ルート CA |
参考: about_Certificate_Provider(Microsoft Learn)
“The Certificate provider exposes the certificate namespace as the Cert: drive in PowerShell.”
(Certificate プロバイダーは、証明書名前空間を PowerShell の Cert: ドライブとして公開します)
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.security/about/about_certificate_provider
条件で絞り込む
証明書が多数ある環境では、Subject や有効期限で絞り込むことで目的の証明書を見つけやすくなります。
# Subject に "example.com" を含む証明書のみ表示
Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*example.com*" }
# 30 日以内に有効期限が切れる証明書を抽出
Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.NotAfter -lt (Get-Date).AddDays(30) }エクスポートしたい証明書の拇印をコピーして、以降の手順で利用します。
証明書をエクスポートする(PowerShell PKI コマンドレット)
特定した証明書をファイルとして書き出します。ここでは、秘密鍵を含んだ PFX 形式(.pfx) でエクスポートします。これがあれば、別の PC に移行しても「本人」として証明書を利用できます。
PowerShell には Export-PfxCertificate という標準コマンドレットが用意されており、Windows 8.1 / Windows Server 2012 R2 以降で利用可能です。
基本構文
$pwd = ConvertTo-SecureString -String "Pass1234" -Force -AsPlainText
Get-ChildItem -Path Cert:\CurrentUser\My\<拇印> |
Export-PfxCertificate -FilePath C:\backup.pfx -Password $pwd| 要素 | 説明 |
|---|---|
ConvertTo-SecureString | パスワードを SecureString 型に変換(PFX のパスワードに必須) |
Get-ChildItem -Path Cert:\...\<拇印> | エクスポート対象の証明書を取得 |
Export-PfxCertificate | PFX エクスポート用のコマンドレット |
-FilePath | 出力先のファイルパス |
-Password | PFX に設定するパスワード(SecureString) |
参考: Export-PfxCertificate(Microsoft Learn)
“The Export-PfxCertificate cmdlet exports a certificate or a PFXData object to a Personal Information Exchange (PFX) file.”
(Export-PfxCertificateコマンドレットは、証明書または PFXData オブジェクトを PFX ファイルにエクスポートします)
https://learn.microsoft.com/en-us/powershell/module/pki/export-pfxcertificate
AES256 暗号化でエクスポートする(推奨)
Export-PfxCertificate の既定の暗号化方式は TripleDES_SHA1 ですが、より強固な AES256_SHA256 への切り替えを推奨します。
$pwd = ConvertTo-SecureString -String "Pass1234" -Force -AsPlainText
Get-ChildItem -Path Cert:\CurrentUser\My\<拇印> |
Export-PfxCertificate -FilePath C:\backup.pfx `
-Password $pwd `
-CryptoAlgorithmOption AES256_SHA256パスワードを使わない方法(ProtectTo)
AD 環境であれば、特定のユーザーアカウントに紐づけて PFX をエクスポートできます。指定されたユーザーであればパスワードなしで利用可能となるため、パスワード管理の煩雑さを回避 できます。
$params = @{
Cert = "Cert:\LocalMachine\My\<拇印>"
FilePath = "C:\myexport.pfx"
ProtectTo = "contoso\billb99", "contoso\johnj99"
}
Export-PfxCertificate @paramsこの方式は Windows Server 2012 以降のドメインコントローラーが必要 で、鍵配布のために AD のサービスを利用します。
証明書チェーンを除外してエクスポートする
既定では、エクスポート対象の証明書とその上位の証明書チェーンが含まれます。エンドエンティティ証明書(対象の証明書のみ)だけが必要な場合 は、-ChainOption EndEntityCertOnly を指定します。
$pwd = ConvertTo-SecureString -String "Pass1234" -Force -AsPlainText
Get-ChildItem -Path Cert:\CurrentUser\My\<拇印> |
Export-PfxCertificate -FilePath C:\backup.pfx `
-Password $pwd `
-ChainOption EndEntityCertOnly証明書をエクスポートする(certutil による代替手順)
PowerShell が利用できない環境や、コマンドプロンプトで一行操作したい場合は、certutil も選択肢です。
基本構文と実行例
certutil [Options] -exportPFX [CertificateStoreName] CertId PFXFile [Modifiers]certutil -p "Pass1234" -user -exportPFX My "B1E52CD8EA6CDB32A120CF48553C6DXXXXXXXXXX" backup.pfx| 要素 | 説明 |
|---|---|
-p "Pass1234" | PFX に設定するパスワード |
-user | 「現在のユーザー」のストアを対象にする(指定しない場合はローカルコンピューター) |
-exportPFX | PFX 形式(秘密鍵付き)でエクスポートする指定 |
My | ストア名(個人ストア) |
<拇印> | エクスポート対象の証明書の拇印 |
backup.pfx | 出力ファイル名 |
AES256 暗号化を指定する
certutil でも、モディファイアで暗号化アルゴリズムを指定できます。
certutil -p "Pass1234" -user -exportPFX My "<拇印>" backup.pfx CryptoAlgorithm=Aes256-Sha256参考: certutil コマンドリファレンス(Microsoft Learn)
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/certutil
カレントディレクトリに backup.pfx が作成されます。
証明書をインポートする(PowerShell PKI コマンドレット)
PFX ファイルを別の PC に取り込む(インポートする)手順です。Import-PfxCertificate コマンドレットを使用します。
基本構文
$pwd = ConvertTo-SecureString -String "Pass1234" -Force -AsPlainText
Import-PfxCertificate -FilePath C:\backup.pfx `
-CertStoreLocation Cert:\CurrentUser\My `
-Password $pwd| 要素 | 説明 |
|---|---|
-FilePath | インポートする PFX ファイルのパス |
-CertStoreLocation | 格納先のストアパス |
-Password | エクスポート時に設定したパスワード |
参考: Import-PfxCertificate(Microsoft Learn)
“The Import-PfxCertificate cmdlet imports certificates and private keys from a PFX file to the destination store.”
(Import-PfxCertificateコマンドレットは、PFX ファイルから宛先ストアへ証明書および秘密鍵をインポートします)
https://learn.microsoft.com/en-us/powershell/module/pki/import-pfxcertificate
サーバー(ローカルコンピューター)ストアにインポートする
IIS(Web サーバー)や RDP など、ユーザーがログオフしていてもシステムとして稼働するサービス用の証明書は、ローカルコンピューターストア に格納します。
# 管理者として PowerShell を起動して実行
$pwd = ConvertTo-SecureString -String "Pass1234" -Force -AsPlainText
Import-PfxCertificate -FilePath C:\backup.pfx `
-CertStoreLocation Cert:\LocalMachine\My `
-Password $pwdインポート後に再エクスポート可能とする(-Exportable)
既定では、インポートした証明書の秘密鍵は 再エクスポート不可 です。バックアップ目的などで後から再エクスポートしたい場合は、-Exportable パラメータを指定します。
Import-PfxCertificate -FilePath C:\backup.pfx `
-CertStoreLocation Cert:\CurrentUser\My `
-Password $pwd `
-ExportableCER ファイル(公開鍵のみ)のインポート
ルート証明書や公開鍵のみの証明書は、Import-Certificate コマンドレットを使用します。
# 個人ストアへインポート
Import-Certificate -FilePath C:\certnew.cer -CertStoreLocation Cert:\CurrentUser\My
# 信頼されたルート証明書ストアへインポート
Import-Certificate -FilePath C:\rootca.cer -CertStoreLocation Cert:\LocalMachine\Root証明書をインポートする(certutil による代替手順)
certutil でも同等のインポートが可能です。
PFX ファイル(秘密鍵付き)のインポート
certutil -user -p "Pass1234" -importpfx backup.pfx-user を付けないと、自動的に ローカルコンピューター(LocalMachine)ストア が対象になります。サーバーへのインポート時は管理者権限で実行します。
certutil -p "Pass1234" -importpfx backup.pfxCER ファイル(公開鍵のみ)のインポート
certutil -user -addstore My certnew.cer| 引数 | 説明 |
|---|---|
-addstore | ストアへの追加を指定 |
My | 「個人」ストア(信頼されたルート証明書なら Root を指定) |
NoExport モディファイアで再エクスポート不可にする
セキュリティ要件で「インポート後に再エクスポートできないようにしたい」場合は、NoExport モディファイアを利用します。
certutil -user -p "Pass1234" -importpfx backup.pfx NoExport「ユーザー」ストアと「コンピューター」ストアの違い
Windows の証明書ストアには、大きく分けて 2 つの保管場所があります。用途によって使い分けが必要です。
| ストアの種類 | PowerShell パス | certutil オプション | 用途 |
|---|---|---|---|
| 現在のユーザー(CurrentUser) | Cert:\CurrentUser\My | -user あり | クライアント PC 向け: VPN、メール署名、Web ブラウザ認証など |
| ローカルコンピューター(LocalMachine) | Cert:\LocalMachine\My | -user なし | サーバー向け: IIS、RDP など、システムとして稼働するサービスの証明書 |
実行時の権限
- CurrentUser ストアへの操作: 通常権限で実行可能
- LocalMachine ストアへの操作: 管理者権限が必要。管理者として実行しない場合、
Access Deniedエラーが発生します
3 方式の比較|PowerShell・certutil・GUI の使い分け
証明書のエクスポート・インポートには、本記事で紹介してきた PowerShell PKI コマンドレット と certutil に加え、GUI(certmgr.msc / mmc) も選択肢です。それぞれ得意分野が異なるため、用途に応じた使い分けが推奨されます。
主要 3 方式の比較
| 方式 | 主用途 | 自動化適性 | 学習コスト | 主な制約 |
|---|---|---|---|---|
| PowerShell PKI コマンドレット | スクリプトでの自動化、最新の Windows 環境 | 高 | 中(PowerShell の基礎知識が必要) | Windows 8.1 / Server 2012 R2 以降 |
| certutil | レガシー環境、コマンドプロンプトでの一行操作 | 中 | 低(コマンド一行で完結) | パイプライン処理が苦手 |
| GUI(certmgr.msc / mmc) | 1〜2 台で目視確認しながら作業 | 低 | 低 | Server Core 環境では利用不可 |
PowerShell PKI コマンドレット
スクリプト化・自動化に最も適した方式です。Get-ChildItem でフィルタリングした結果を Export-PfxCertificate にパイプで渡すといった、他のコマンドレットと組み合わせた処理を短いコードで記述 できます。
# 期限切れ間近の証明書を一括バックアップする例
$pwd = ConvertTo-SecureString -String "Pass1234" -Force -AsPlainText
Get-ChildItem -Path Cert:\LocalMachine\My |
Where-Object { $_.NotAfter -lt (Get-Date).AddDays(60) } |
ForEach-Object {
Export-PfxCertificate -Cert $_ `
-FilePath "C:\backup\$($_.Thumbprint).pfx" `
-Password $pwd `
-CryptoAlgorithmOption AES256_SHA256
}定期実行スクリプトに組み込めば、証明書管理の自動化にも応用できます。タスクスケジューラとの連携手順は、関連記事『PowerShell とタスクスケジューラで自動サインアウト』も参考になります。
certutil
Windows 標準のコマンドプロンプトコマンドで、バッチファイルや bat / cmd スクリプトで完結させたい場合に有効 です。PowerShell が制限されている環境(実行ポリシー、PowerShell が無効化された端末など)でも利用できます。短いコマンドで完結する一方、PowerShell のような柔軟なフィルタリングや配列処理は苦手です。
GUI(certmgr.msc / mmc)
certmgr.msc(ユーザーストア)または mmc.exe(管理者権限でローカルコンピューターストア)を起動して、ウィザード形式で操作する方式です。1〜2 台で目視確認しながら作業したい場合や、コマンドに不慣れな場合に適しています。一方、Windows Server Core のような GUI を持たない環境では利用できません。
使い分けのフローチャート
| 状況 | 推奨方式 |
|---|---|
| 数十台以上の端末に一括配布 | PowerShell PKI コマンドレット |
| バッチファイルで自動化したい | certutil |
| Server Core 環境 | PowerShell PKI コマンドレット または certutil |
| 1〜2 台で確認しながら操作 | GUI(certmgr.msc / mmc) |
| PowerShell が制限された環境 | certutil または GUI |
制約事項とトラブルシューティング
PowerShell・certutil による証明書操作では、いくつか押さえておきたい制約事項とハマりどころがあります。
Cannot export non-exportable private key エラー
Export-PfxCertificate 実行時に、以下のエラーが発生する場合があります。
Export-PfxCertificate : Cannot export non-exportable private keyこれは、証明書の秘密鍵が「エクスポート不可」設定でストアに格納されているケース です。certreq などで証明書要求を作成する際、秘密鍵をエクスポート可能としていない場合に発生します。
対処方法は以下のいずれかです。
- 証明書要求時に「秘密鍵をエクスポート可能にする」オプションを付与して再発行: 根本解決
- 既存証明書の秘密鍵アクセス権限を変更: MMC の証明書スナップインで該当証明書を右クリック →「すべてのタスク」→「秘密キーの管理」で操作対象アカウントに権限を付与すると、エクスポートできるようになる場合があります
なお、「エクスポート可能」属性自体が false の場合は、権限変更だけでは解決できず、証明書の再発行が必要 です。
TripleDES_SHA1 から AES256_SHA256 への移行
Export-PfxCertificate の既定の暗号化方式である TripleDES_SHA1 は古い暗号方式 です。新規エクスポートでは -CryptoAlgorithmOption AES256_SHA256 を指定することを推奨します。
ただし、AES256 で暗号化された PFX を、Windows 7 以前など古い OS でインポートしようとすると失敗する場合がある ため、移行先 OS の対応状況を事前に確認することを推奨します。
LocalMachine ストアへの操作には管理者権限が必須
Cert:\LocalMachine\My などのローカルコンピューターストアに対して書き込み操作(インポート・削除)を行う場合、PowerShell またはコマンドプロンプトを「管理者として実行」する必要があります。
管理者権限なしで実行した場合、以下のようなエラーが発生します。
Import-PfxCertificate : Access is denied.スクリプト化する場合は、タスクスケジューラの「最上位の特権で実行する」オプションや、Start-Process -Verb RunAs などを利用して管理者権限で起動することを推奨します。
DPAPI と CSP の互換性
PFX ファイルに格納される秘密鍵は、DPAPI(Data Protection API)や CSP(Cryptographic Service Provider)に依存 します。古い証明書(CSP ベース)を新しい OS(KSP / CNG ベース)にインポートすると、想定通りに動作しない場合があります。
特に、SHA-1 ベースのレガシー証明書を SHA-256 ベースの環境に持ち込む場合や、Windows Server 2016 以前で発行された証明書を Windows Server 2025 環境で利用する場合 は、事前検証を推奨します。
パスワード強度の確保
PFX のパスワードは、ファイルが外部に流出した場合の最後の防御線です。短いパスワードや辞書に載っている語句は、ブルートフォース攻撃で短時間に解読される可能性があります。 12 文字以上、英大文字・小文字・数字・記号を混在させたパスワードを設定することを推奨します。
スクリプト内にパスワードを平文で埋め込むことは推奨されません。インタラクティブ実行の場合は Read-Host -AsSecureString を利用すると、パスワードを安全に入力できます。
# インタラクティブ実行(パスワードプロンプト)
$pwd = Read-Host -AsSecureString "PFX のパスワードを入力してください"
Get-ChildItem -Path Cert:\CurrentUser\My\<拇印> |
Export-PfxCertificate -FilePath C:\backup.pfx -Password $pwd拇印の指定でつまずきやすいポイント
- 拇印には半角スペースが含まれない
-
MMC の証明書プロパティ表示ではスペースを含む形式で表示されますが、PowerShell や certutil で指定する際はスペースを除去する必要があります。
- 大文字・小文字の区別
-
拇印は通常大文字で表示されますが、コマンド実行時には大文字・小文字を区別しません。
まとめ
本記事では、PowerShell PKI コマンドレットと certutil を使い、GUI に頼らず証明書を管理する方法を解説しました。
- 拇印の確認:
Get-ChildItem -Path Cert:\CurrentUser\Myで 40 桁の Thumbprint を取得 - エクスポート(PowerShell):
Export-PfxCertificateに-CryptoAlgorithmOption AES256_SHA256を指定して安全にバックアップ - インポート(PowerShell):
Import-PfxCertificateで-CertStoreLocationを指定して格納先を制御 - certutil: バッチファイルで自動化したい場面や、PowerShell が制限された環境での代替手段
- 使い分け: 自動化なら PowerShell、bat 主体なら certutil、目視確認なら GUI
- トラブル対処: エクスポート不可エラー、管理者権限、DPAPI/CSP 互換性、パスワード強度に注意
GUI 操作は 1 台なら問題なく実施できますが、台数が増えるとミスにつながりやすくなります。コマンドラインなら Server Core 環境でも利用でき、スクリプトに組み込んで自動化できる という運用上のメリットがあります。
以上、最後までお読みいただきありがとうございました。


