インフラ業務に携わっていると「証明書」という言葉を耳にすることがあるかと思います。
証明書はセキュリティの基盤を支える重要な要素ですが、実は自分で発行・削除・管理することも可能です。
この記事では、自己署名証明書をPowerShellを使って作成する手順を解説します。証明書についての基礎知識から、実際の作成手順までを丁寧に説明します。
証明書の種類
証明書を作成するには、以下の2種類の証明書が必要です。
- 自己署名ルート証明書
役割: 証明書チェーンの最上位に位置し、他の証明書を発行する基盤となる。
ポイント: 信頼された認証局(CA)から発行されるケースが一般的ですが、自己署名を行うことで独自の認証局を構築できます。 - クライアント証明書
役割: 特定のユーザーやデバイス、アプリケーションを認証するための証明書。
ポイント: 中間証明書やルート証明書に基づいて認証され、クライアント側にインストールされます。サーバーとの通信で使用される重要な証明書です。
証明書の作成手順
自己署名ルート証明書の作成
以下の手順で自己署名ルート証明書を作成します。
- PowerShellを管理者権限で実行
Windows 10以降、またはWindows Server 2016以降のコンピューターでPowerShellを管理者権限で実行してください。 - 以下のスクリプトを実行
$params = @{
Type = 'Custom'
Subject = 'CN=RootCert'
KeySpec = 'Signature'
KeyExportPolicy = 'Exportable'
KeyUsage = 'CertSign'
KeyUsageProperty = 'Sign'
KeyLength = 2048
HashAlgorithm = 'sha256'
NotAfter = (Get-Date).AddMonths(24)
CertStoreLocation = 'Cert:\CurrentUser\My'
}
$cert = New-SelfSignedCertificate @params
このスクリプトは、PowerShellのNew-SelfSignedCertificateコマンドレットを使用して自己署名証明書を作成します。
作成された証明書はルート証明書として機能し、他の証明書の基盤となります。
- Type: 証明書の種類を指定します。
- Subject: 証明書の名前を設定します。
- KeySpec: キーの使用目的を設定します。
- KeyExportPolicy: 秘密鍵のエクスポート可否を指定します。
- KeyUsage: 証明書の用途(署名など)を指定します。
- KeyUsageProperty: キーの特性(署名専用など)を指定します。
- KeyLength: 鍵の長さを設定します(単位はビット)。
- HashAlgorithm: ハッシュアルゴリズムを指定します。
- NotAfter: 有効期限を設定します。この例では24ヶ月後(2年)に設定しています。
- CertStoreLocation: 証明書を保存する場所を指定します。
- $certは作成された証明書オブジェクトが格納されており、後続の操作でも利用します
このスクリプトを実行することで以下に証明書が生成されます。
[ユーザー証明書の管理] > [個人] > [証明書]

クライアント証明書の生成
前のステップで作成したルート証明書を基盤として、クライアント証明書を生成します。
- 以下のスクリプトを実行
$params = @{
Type = 'Custom'
Subject = 'CN=ClientCert'
DnsName = 'ClientCert'
KeySpec = 'Signature'
KeyExportPolicy = 'Exportable'
KeyLength = 2048
HashAlgorithm = 'sha256'
NotAfter = (Get-Date).AddMonths(18)
CertStoreLocation = 'Cert:\CurrentUser\My'
Signer = $cert
TextExtension = @(
'2.5.29.37={text}1.3.6.1.5.5.7.3.2')
}
New-SelfSignedCertificate @params
このスクリプトは、PowerShellを使用してクライアント証明書を作成するものです。
作成された証明書は、既存の自己署名ルート証明書(変数$cert)を基盤として署名されます。
これにより、証明書チェーンが構築され、クライアント証明書を使用した認証が可能になります。
- Type: 証明書の種類を指定します。
- Subject: 証明書の識別名を設定します。
- DnsName: ドメイン名や識別名を設定します。
- KeySpec: キーの使用目的を設定します。
- KeyExportPolicy: 秘密鍵のエクスポート可否を指定します。
- KeyLength: 鍵の長さを設定します(単位はビット)。
- HashAlgorithm: ハッシュアルゴリズムを指定します。
- NotAfter: クライアント証明書の有効期限を設定します。この例では18ヶ月後に設定しています
- CertStoreLocation: 証明書を保存する場所を指定します。
- Signer: ルート証明書($cert)を基盤として、クライアント証明書を署名します
- TextExtension: 証明書の拡張属性を指定します。
ルート証明書と同じディレクトリにクライアント証明書が作成されたことが確認できます。

証明書公開キーをエクスポートする
作成した証明書の公開キーをエクスポートします。
公開キーをエクスポートすることで、サーバーとクライアント間の認証や複数のシステムやアプリケーションで証明書を活用することができます。
- ルート証明書を右クリック → [すべてのタスク] → [エクスポート]
- [証明書のエクスポートウィザード]で[次へ]を選択。
- 秘密キーをエクスポートすると.pfxファイル形式でエクスポートされます。
- 秘密キーをエクスポートしない場合は[Base 64 encoded X.509]を選択。
- エクスポートを実行し、出力されたファイルが公開キーとなります。
出力された.cerファイルをメモ帳で開くことで公開キーを確認できます。

おわりに
以上の手順で自己署名ルート証明書とクライアント証明書を作成し、運用に必要な公開キーをエクスポートすることができました。
自己証明書を利用することで、小規模な環境でも簡単にセキュリティ基盤を構築できます。ぜひお試しください!