PowerShell の証明書インポートとエクスポート|PFX 移行の手順

  • URLをコピーしました!
目次

はじめに

Windows で証明書をエクスポートしようとした際、以下のような GUI 手順を踏んでいる方も多いのではないでしょうか。

  1. 「インターネットオプション」を開く
  2. 「コンテンツ」タブをクリック
  3. 「証明書」ボタンをクリック
  4. ウィザードに従って画面を進めていく

手順が多く、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=User01

Thumbprint 列に表示されている 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-PfxCertificatePFX エクスポート用のコマンドレット
-FilePath出力先のファイルパス
-PasswordPFX に設定するパスワード(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「現在のユーザー」のストアを対象にする(指定しない場合はローカルコンピューター)
-exportPFXPFX 形式(秘密鍵付き)でエクスポートする指定
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 `
                      -Exportable

CER ファイル(公開鍵のみ)のインポート

ルート証明書や公開鍵のみの証明書は、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.pfx

CER ファイル(公開鍵のみ)のインポート

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 環境でも利用でき、スクリプトに組み込んで自動化できる という運用上のメリットがあります。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次