802.1x認証 の クライアント証明書の作成（AD CS：スタンドアロンCA）

# はじめに
Windows の クライアント PC で 802.1x 認証 (EAP-TLS) を使用するための クライアント証明書 を発行するための手順です。
証明書を発行する証明機関は、AD CS を使った方法で説明しています。

AD CS には、エンタープライズ CA と スタンドアロン CA があります。
どちらの方式でも、クライアント証明書 を作成できるのですが、本記事では 証明書 と クライアント PC との関係性をしっかりと理解することを目的としていますので、スタンドアロン CA を使った手順としています。

なお 運用を意識した場合は、エンタープライズ CA を利用することをお勧めします。
スタンドアロン CA では、すべて手動で行う必要がありますが、これらの操作を ほぼ 全自動で証明書の配布まで実施されます。

https://qiita.com/carol0226/items/564a21455cd3e5f58906

# 1. 事前準備
クライアント証明書 を作成する前に必要な 前提となる環境です。

## AD CS の導入
構築済みの AD CS サーバー を用意してください。
この手順では、AD CS が、以下の構成となっていることを想定しています。
- スタンドアロン CA
- 証明機関 を導入済み
- 証明機関 Web 登録 を導入済み

まだ構築していない場合は、以下の手順を参考に準備しましょう。
※スタンドアロン CA を選択してください。

https://qiita.com/carol0226/items/cb38ed3188c520bd9d64

# 2. クライアント証明書 の作成
以下の URL は、公開情報に記載されている、クライアント証明書 の要件です。
この要件に合った クライアント証明書 を作成する必要があります。
この公開情報を読んだだけで、適切な クライアント証明書 を作るのは難しいと思いますので、その手順については、本章 で説明していきます。

https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/nps/nps-manage-cert-requirements?wt.mc_id=mvp_407731#minimum-client-certificate-requirements

:::note warn
**注意 2025/2/25 追記**
2025/2/11 以降の 最新 KB が適用されたドメインコントローラーを使う場合は、注意が必要です。
本記事の内容を検証して投稿した時点では、考慮していませんでしたが、高度な証明書マッピング の対策が必要になります。

どのような問題なのかは、以下の私の記事を参照してください。
**厳密な証明書マッピング 2025/2/11 完全適用モードの注意点 (KB5014754)**
https://qiita.com/carol0226/items/4ab239cfffb3f6a0891a

そして、具体的に、どのような対策を行えばよいかは、以下に分かりやすく説明されています。
２通りのうち、いずれかの対策を行ってください。
**対処方法について ( 証明書のマッピング )**
https://jpwinsup.github.io/blog/2023/04/11/PublicKeyInfrastructure/CertificateManagement/certificate-based-authentication-changes-on-may-2022/#対処方法について-証明書のマッピング
:::

:::note info
**参考**
上記の 高度な証明書マッピングの内容が難しいと感じる場合で、かつ 本公開しないつもりの PoC 検証が目的であれば、以下のレジストリキーの対策で乗り切っても良いかと思います。
**レジストリキー**
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc
**値**
StrongCertificateBindingEnforcement = "1"

**注意**
ただし、この構成のまま 本番公開はしないでください。2025年9月のKBが適用されると認証ができなくなります。
:::

## 2-1. 証明書要求 (CSR) の作成～申請
クライアント PC へ 管理者権限で サインイン して作業を行ってください。

クライアント証明書 を作成するための 証明書要求ファイル(CSR) を作成します。
この CSR ファイルを 証明機関 (AD CS) へ提出し 承認を受けることで、クライアント証明書を受け取ることができます。

クライアント証明書 を作成する際には、コンピューター認証 または ユーザー認証 のどちらを行う想定であるかを考慮しておく必要があります。

### 2-1-1. INFファイルの準備
INF ファイルは、CSR を作成するための INPUT ファイルとなります。
作成した INF ファイルを コマンドで変換して、CSR ファイルを作成します。
INF ファイルは、テキストエディタで必要事項を記載して作成します。

1. クライアント PC に 管理者権限で サインイン します。
　<br>
1. テキストエディタ を開き、以下の INF ファイルサンプルの内容をコピーして 貼り付けます。

#### 2-1-1-1. "コンピューター認証" 用 INFファイル例

````
[NewRequest]
Subject = "C=JP,ST=Tokyo,L=Chuo-ku,O=Intellilink,CN=pc01.nps.local"
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xA0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
HashAlgorithm = sha256
ProviderType = 12
RequestType = CMC

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.2

[Extensions]
2.5.29.17="{text}"
_continue_ = "dns=pc01.nps.local"
````

#### 2-1-1-2. "ユーザー認証" 用 INFファイル

````
[NewRequest]
Subject = "C=JP,ST=Tokyo,L=Chuo-ku,O=Intellilink,CN=user01"
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xA0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
HashAlgorithm = sha256
ProviderType = 12
RequestType = CMC

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.2

[Extensions]
2.5.29.17="{text}"
_continue_ = "upn=user01"
````

### INFファイル補足
1．"Subject" は、クライアント証明書 の所有者の属性を示しています。
以下を参考に、都道府県、市区町村、組織 などを任意の文字列(英字) に編集してください。
この値は、証明書を取得したクライアント側で 証明書の発行元が 誰であるのかを 人が識別するためのもので、CN=[FQDN]以外の値は、システムの動作に影響するものではありません。動作検証するだけなら、サンプルの内容のままでも問題は無いです。
~~~~
Subject = "C=JP,ST=[都道府県],L=[市区町村],O=[組織],OU=[組織単位],CN=[FQDN]"
~~~~

2．"pc01.nps.local" となっている箇所は、クライアント PC の ホスト名＋ドメイン名 となります。利用する環境に合わせて、修正してください。
"Subject の CN=" と "_continue_ の dns=" の２か所あります。

3．"user01" となっている箇所は、ユーザー の UPN名 となります。利用する環境に合わせて、修正してください。
"Subject の CN=" と "_continue_ の upn=" の２か所あります。

4．編集が終わったら、テキストを保存します。名称は任意ですが、本手順では "request.inf" という名前で保存したこととして説明を続けます。

:::note green
クライアント証明書 の場合は、数多くの証明書を発行するので、PC名やユーザー名ごとに infファイルのファイル名を設定して、保存しておくのも良いと思います。
:::

## 2-1-2. CSRファイルの作成
1. コマンドプロンプトを表示して、上記のファイルを保存したフォルダに移動します。
以下のコマンドを実行します。
・request.inf が、事前に作成した INF ファイル名
・request.req が、変換後に作成される CSR ファイル名
~~~~
certreq -new -f request.inf request.req
~~~~
上記のコマンド実行を実行した時の画面イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e42580ba-9c66-6f37-89cd-4d1e7182e621.png)

2．以下のように request.req というファイルが出来ている事を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/45b73cfe-669c-851b-ef27-dafa79dacfdc.png)

これで、CSR ファイルが作成できました。
このファイルを使って、証明機関に対して 証明書の発行要求を出す事ができます。

## 2-1-3. 証明書要求の実施
1. ブラウザを起動して、http:// [AD CSサーバーのIP] /certsrv へアクセスして、「証明書を要求する」を押します。
ページが開かない場合は AD CS サーバー の Windows Firewall の設定を見直してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c07a05bc-6b27-cef8-70e3-8074b2da0dd7.png)
　<br>
1. 「証明書の要求の詳細設定」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1f281772-7bb3-6fea-3534-0039ea398d92.png)
　<br>
1. 以下の赤枠のリンク先を選択します（この画面は 出ないこともあります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cf218b2e-a0ee-10f2-7e19-94f614c2f25f.png)
　<br>
1. 前章で作成した request.req をメモ帳で開き、「すべてを選択」して「コピー」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/0fa705ac-91d9-e475-2e47-1d829cf12788.png)
　<br>
1. 先ほど開いた 証明書 Web 登録の画面の以下の場所に、貼り付けて「送信」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ded2a68a-fc2b-472c-4122-295247f9ca53.png)
　<br>
1. 証明書の要求が受け付けられると、以下の画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/5065eb5f-ef6e-9f72-9b51-bdd63fb427c5.png)

以上で、クライアント証明書の要求 (CSR) が、証明機関 (AD CS) へ申請されました。

## 2-2. 証明機関で 証明書を承認し、証明書を発行する
こちらは、企業内の 証明機関の管理者の立場になったつもりで作業を行います。
証明機関（AD CS サーバー）へ 管理者権限 でサインインして作業を行ってください。
承認の作業については、以下の記事で 手順を説明していますので、この通りに実施ください。

https://qiita.com/carol0226/items/0c9a6c880fcacbcb8998

## 2-3. 発行された証明書の受け取り
CSR を作成した クライアント PC へ 管理者権限で サインインして作業を行ってください。

1. ブラウザを起動して、http:// [AD CSサーバーのIP] /certsrv へアクセスして、「保留中の証明書の要求の状態」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9b35d7ac-0055-e082-f71b-9d74b418e4eb.png)
　<br>
1. 以下のリンクが、要求に対して 承認された クライアント証明書 です。
このリンクを、クリックしてください。
ここにリンクが表示されていない場合は、以下の点を確認してください。
・証明書を要求した時と、同じマシン、同じブラウザ を使っているか？
・AD CS サーバー側で、ちゃんと 承認が実施できているか？（否認や削除をしてないか？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/429f216c-24ba-a3ad-2de1-cad45d750fb9.png)
　<br>
1. 以下の赤枠の選択肢を選び、クライアント証明書 をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/04cb291d-d572-0ca8-b269-cedeb55f971d.png)
　<br>
1. ダウンロードしたファイルは、CertReqコマンドを実行したフォルダへコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/bc3cfc67-e5f0-6ea1-3752-74cc4fd7383b.png)
　<br>
1. コマンド画面を 管理者モード で開き、証明書をダウンロードしたフォルダへ "cd" コマンドで移動します。続いて、以下のコマンドを実行して、証明書の受け取り (Accept) を実施します。
~~~~
CertReq -Accept certnew.p7b
~~~~
下図の通り、証明書がインストールされた旨のメッセージが表示されれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/feaef87e-038a-c1fd-8d42-23b7b1370c2f.png)

:::note alert
CertReq -Accept コマンドは、事前に CertReq -new コマンドで証明書を要求した処理の後続処理となっていて、"-new" と "-Accept" は対になっています。
そのため、証明書要求を実施していないマシンに クライアント証明書（p7b) を複製して、CertReq -Accept を実施しても、エラーが発生して取り込めません。
さらに、１回の証明書要求(-new) に対して、１回の -Accept しか実施できません。
２回目の -Accept は、プロセッサエラーが発生して取り込めないため、その場合は CertReq -new の実施からやり直してください。
:::

:::note warn
こんなエラーが出たこともありました。
この時は、クライアント PC に 証明機関のルート証明書が入っていない場合でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b60983a5-f22c-c06b-0f84-d877dc07a30e.png)
以下の記事を参考に、AD CS サーバーから ルート証明書をダウンロードして、クライアント PC にインポートしてください。
https://qiita.com/carol0226/items/33042c5c639c79832aeb
:::

6．実際に取り込まれた クライアント証明書 を確認するために、証明書ストアを開きます。
certlm.msc コマンドを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d1887d1a-21d1-7974-cec2-fd506a880bc0.png)

[信頼されたルート証明機関] の配下には、AD CS の名前がついたルート証明書が存在していれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/119aa405-35f1-295d-53be-ce86991b9ee4.png)

[個人] の配下には、発行した クライアント証明書 が 存在していれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4432cddd-fe7a-753a-98a8-a18612f909b7.png)

証明書の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/dbac7003-1866-a27c-dd4c-da246f571693.png)

# 3. クライアント証明書 の エクスポート
作成したクライアント証明書を、実際で運用に使う クライアント PC へ配置するためには、いちど pfx 形式で エクスポート する必要があります。

クライアント証明書を 右クリックして、pfx ファイルとしてエクスポートしましょう。

# 4. クライアント証明書 の 配布（インポート）
pfx 化したファイルを、運用する クライアント PC 上へコピーして、インポートします。
インポートが完了したら、802.1x 認証用の証明書として利用可能です。

コンピューター認証用の証明書は、ローカルコンピューターストアへ
ユーザー認証用の証明書は、ユーザーストアへ 配置してください。