リモートデスクトップ接続用の証明書を展開する

# はじめに
リモートデスクトップ用に 証明書をちゃんと配ろうとすると、中々やっかいです。
世の中に、さまざまな情報があって、どれを実施すれば良いのか見定めるのが難しかったりします。

この機会に、なるべく、シンプルに わかりやすく 纏めておこうと思いました。

以下の記事に、比較的新しめで まとまった記事がありましたので、今回は これを踏襲して構成した手順を紹介したいと思います。

**Remote Desktop Services enrolling for TLS certificate from an Enterprise CA**

https://techcommunity.microsoft.com/blog/askds/remote-desktop-services-enrolling-for-tls-certificate-from-an-enterprise-ca/4137437

**公開情報：Using certificates in Remote Desktop Services**

https://learn.microsoft.com/ja-jp/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn781533(v=ws.11)?wt.mc_id=mvp_407731

---

# この記事の手順で 実現できること
- リモートデスクトップ接続 を行う際に表示される 証明書 の確認画面が表示されないようにする（Before -> After)
- ドメイン全体で機能するようにする
- リモートデスクトップの上部のバーに、鍵マークが表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/af525e90-9138-d96e-5825-88562309e8e5.png)

---

# この記事のポイント
- リモートデスクトップ接続の 証明書確認 の画面を抑止する決定版を目指す
- RDS の役割ではなく、単なる クライアントのリモートデスクトップでテストが出来る
- 証明書とリモートデスクトップサービス のみに着目して、トラシューしやすくする
- Before / After を判りやすくする

:::note info
リモートデスクトップ接続 の 証明書 の話は、RDS の役割サービス と一緒に出てくることが多く、全体を見てしまうと判りづらくなってしまうので、これを 切り離して考えられるようにしています。
:::

---

# 前提事項
- Active Directory ドメイン (AD DS) が構成されていること
これから構築する場合は、以下の記事を参考にしてください。

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

- 上記のドメイン内に **エンタープライズ CA** が展開されていること
これから構築する場合は、以下の記事を参考にしてください。

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

- ドメイン内の任意のホストで、リモートデスクトップ接続が可能になっていること
クライアント OS でも、メンバーサーバーでも、構いません。
このホストを、あとで 接続のテスト に使います。
※前章の Before の状態で RDP 接続ができるようになっていれば OK です。

<details><summary>（参考）RDP 有効化手順を見るには、ココ を押してください</summary>

RDP 接続先ホストの ローカル Remote Desktop Users グループに、RDP 接続をさせたい ユーザー・グループ を追加します。ここで、追加したアカウントのみが RDP する事ができます。
※認証した 全ユーザーを 対象にするには Authenticated Users を追加します。

1. **リモートデスクトップ** を オン にして、**リモートデスクトップ ユーザー** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/652c2fa7-20b5-77c7-5c6c-ddbc544c8352.png)
　<br>
1. 以下の画面で **追加** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b6d53ebf-e253-a208-e17f-512dc5ac7de4.png)
　<br>
1. **選択するオブジェクト名を入力してください** の欄に、**Authenticated Users** または **許可したい グループ や ユーザー名** を入力して**名前の確認** を押します。赤下線のような表示になったら、**OK** を押します。
※Authenticated Users が確認出来ない場合は、**場所** をドメインではなくローカルに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/875e7a75-4d0e-f3d9-92db-1a3a1f757e02.png)
　<br>
1. 一覧に 追加したユーザーが表示されている事を確認して **OK** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/02a61b22-db80-7770-1375-06f5b026d414.png)

:::note info
**ポイント**
上記まで構成したら、パスワードを使って RDP 接続が成功するまでを 動作確認しておきましょう。ここでダメなら、RDP の問題です。

※RDP 自体の問題なのか、証明書の問題なのか 切り分けできるようにしておきます。
:::

</details>

:::note warn
**注意事項**
PoC であれば、AD DS と同一のサーバー上に AD CS を展開する事も可能です。
運用環境の場合は、今後の AD DS のマイグレーションなども考慮して、AD DS と AD CS は、別々のサーバー上に展開することが推奨されています。
:::

---

# 構築手順
手順は、２ステップで完了します。
1. 証明書テンプレートの構成（AD CS サーバーで作業）
→　リモートデスクトップのための証明書テンプレートを定義します。
2. グループポリシーの構成（AD DS サーバーで作業）
→　GPO を使って、定義したテンプレートを元にして、ドメイン内のホストに展開します。

## 1. 証明書テンプレートの構成
**（AD CS サーバー上で作業）**

0. **CertTmpl.msc** (証明書テンプレート MMC) を検索して起動します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/da8272fe-c804-ff24-9c32-abc709f08578.png)
　<br>
0. **コンピューター** という名前のテンプレートを見つけて右クリックし **テンプレートの複製** を選択します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/71506ea1-82ea-1f6c-8d1c-aaa3cc75dc19.png)
　<br>
0. **互換性** タブで、"証明機関" と "証明書の受信者" 欄のドロップダウンリストを選択していきます。これは、これから作成するテンプレートの元となるバージョンを選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e83fc77e-8ff3-493d-103e-280eb1af7901.png)
　
**証明機関** の欄で Windows Server 2012 R2 を選ぶと、以下のウィンドウが開くため、**OK** します（2012R2 を選択したおかげで、新しい機能が利用できるテンプレートとなりました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e81b71ae-51fd-107c-368f-3b940a278212.png)
　
**証明書の受信者** の欄で Windows 8.1/Windows Server 2012 R2 を選ぶと、以下のウィンドウが開くため、**OK** します（8.1/2012 R2 を選択したおかげで、新しい機能が利用できるテンプレートとなりました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ab57fc5f-346a-213c-aafd-7a662483446b.png)
　
以下の状態になれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/36e64b07-a7dc-cdcf-5494-d941d0080ce3.png)
　<br>
0. 続いて **全般** タブで、テンプレートに名前と有効期間を指定する必要があります。 
- テンプレートの表示名フィールドにわかりやすい名前を入力します（日本語も可）
- テンプレート名は、テンプレートを識別するための文字列を入力します（英数字 空白なし）
- 有効期間を変更したい場合は、変更することも可能です。 
- [Active Directory で証明書を公開する]ボックスは **チェックしない** でください。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/43de172d-8168-04c3-2c3b-319444588163.png)

:::note info
**ポイント**
同様のノウハウが示された記事では、"Active Directory の証明書を発行する" にチェックを入れているケースもありますが、本記事では チェック は入れずに GPO を使って配布させています。
:::

5．続いて **拡張機能** タブで、**アプリケーション ポリシー** を変更します。 
ここでは、複製元にした "コンピューター" というテンプレートの設定を修正し、"リモートデスクトップ" 用に構成しなおしています。

5-a. **アプリケーション ポリシー** を選択し、**編集** ボタンをクリックします。 
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d80e180e-f531-1464-82f9-6c2d5e24f2ba.png">

5-b. クライアント認証とサーバー認証を選択して、**削除** ボタンをクリックします。 
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4f9a0c11-bb52-ae9a-38b5-6e8b50344e52.png">

5-c. リモート デスクトップ認証のアプリケーション ポリシーを追加するために **追加** ボタンをクリックします。 
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/49338ce7-07d9-966c-4efb-e7ac613e5062.png">

5-d. リモート デスクトップ認証アプリケーション ポリシーは、一覧にありません。
新規に作成するために **新規** ボタンを押してください。 
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/fbebb1bc-825a-68ae-afe2-b81d51b4a3f4.png">

5-e. **名前** に **リモートデスクトップ認証** と入力し、**オブジェクト識別子 (OID)** の値に**1.3.6.1.4.1.311.54.1.2** と入力して、**OK** ボタンをクリックします。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/801c6349-74be-408d-1fd7-2143cf0c59ee.png">
※この識別子(OID) が、リモートデスクトップ用の証明書であることを示しています。

5-f. アプリケーションポリシーの一覧に **リモートデスクトップ認証** が加わったので、それを選択して **OK** ボタンを押します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6e0a8a22-c48b-a25f-15ed-9e7115998fbb.png">

5-g. アプリケーションポリシーに **リモート デスクトップ認証** が設定されたことを確認し、**OK** ボタンを押します。 
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/21210d34-8ed7-1d13-5380-24f724427cdf.png">

5-h. 以下のように アプリケーションポリシーの説明欄 に、**リモートデスクトップ認証** が表示されていれば OK です。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2cc41fa2-a09b-c29b-f48b-e4f6f07f27d1.png">

6．権限を適切に設定します。これを行うために **セキュリティ** タブをクリックします。 

6-a. 証明書を登録する コンピューターまたはコンピューター グループを追加していきます。
権限は、**登録** のみを選択します。

下図は、**Domain Computers** に対して、**登録** を許可しています。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/36b368ee-c615-a037-94ea-4f524bde876d.png">

なお、**Domain Computers** の指定で、ドメインに参加したホストが対象となりますが、ドメインコントローラーは含まれていません。ドメイン内の全ホストが含まれるようにするために、**Domain Controllers** と **Enterprise Domain Controllers** を追加して、それぞれ **登録** のみ許可します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4897a6c0-d2ee-076a-0350-b5e638ff5114.png">

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/5c2615d2-53e5-d6df-7fa1-61fddda39cee.png">

最終的に、以下のような状態になったら、**OK** ボタンをクリックして テンプレートの構成を終了します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/77a32e3b-f5b9-14c3-0b41-df97b6461bf3.png">

以上で リモートデスクトップ 用の証明書テンプレートが定義できました。
次章では、このテンプレートを使って、証明書を発行して配布するための GPO を構成していきます。

---

## 2. グループポリシーを構成する 
**（AD DS で作業）**

0. グループポリシー管理エディターを開き、ドメイン名 を右クリックして **このドメインに GPO を作成し、このコンテナーにリンクする** を選択します。
※ここでは、全ホストが配布対象となるために、ドメイン を選択していますが、別途 OU を用意して 個別の単位に適用することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f4666c1f-093b-ff9b-b10b-718bb1e8efb6.png)
　<br>
0. GPO の名称を任意で指定して OK ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4346cd09-a276-01c7-f1b8-cbaf05ee2124.png)
　<br>
0. 作成した GPO を右クリックして **編集** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/24138b22-4425-01fb-b2b5-39223a4a1ec2.png)
　<br>
0. コンピューターの構成 - ポリシー - 管理用テンプレート - Windows コンポーネント を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8c374843-dfd4-4728-39d2-749d0380faba.png)
続いて、リモートデスクトップ サービス - リモートデスクトップ セッション ホスト - セキュリティ を開き、**サーバー認証証明書テンプレート** の設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/143a31e7-21e5-1ab0-c9b2-ddfcaa25c94a.png)
　<br>
0. **有効** を選択し、証明書テンプレート名 には、**前章で作成した テンプレート名** を入力してから OK ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d4ca76bb-fdf3-94e2-20ca-1b21e40d933b.png)

:::note warn
**注意**
上記で指定する **証明書テンプレート名** の欄は、必ず、前章で設定した 下図の 緑枠 内の文字列と一字一句間違わずに指定する必要があります。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d2485a9c-f91b-d674-d82d-cff0198f2696.png">
※スペルが間違えていると、証明書が発行されません。
:::

6．下図のように **有効** となっていれば、OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6008d37f-739b-a447-42e0-03edf66b87b9.png)

7．コマンドプロンプトを開き、**gpupdate /force** を実行し、保存したポリシーを適用させます。その後、リモートデスクトップ接続を行う PC 上でも、**gpupdate /force** を実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9b38d9dc-ff81-437b-7d42-0ffd63684524.png)

---

# リモートデスクトップ接続を実行して確認する
1．リモートデスクトップ接続 (mstsc) を起動し、接続先の コンピューター名 を入力して **接続** ボタンをクリックします。
この欄には、IP アドレスではなく、ホスト名 を入力してください。
※証明書のチェックの際に、ホスト名との照合が行われるため。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/fa3d5640-160e-b3b3-641b-0c1e25742d73.png">

2．ユーザー名 と パスワード で認証を行ったあと、直ちに 以下のように RDP が接続されれば OK です。 バーの **鍵マーク** をクリックすることで 下記のウィンドウが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/733ac20f-1071-a0f4-e544-c3261a63c385.png)

:::note alert
**エラー**
引き続き、以下のように 証明書の確認画面 が出てしまう場合は、証明書が正しく発行されているか、次章のトラブルシューティングの章を参考に 再度 確認してください。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/de7025ea-b178-ba92-1122-ffd0a3400b21.png">
　　　　　　　　　↓　　↓　　↓　　↓　　↓　　↓　　↓　　↓
**IPアドレスが表示され、鍵マークが無い状態**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/00e767cc-422c-5bd0-270c-847fabd1b9bb.png)
:::

---

# トラブルシューティング
ドメイン内のホストには、ルート証明書 と サーバー証明書 が配布されているハズです。
ルート証明書は、接続元 で必要です。
サーバー証明書は、受け側 で必要です。

両方の証明書が、各ホストに配布されていることで、ドメイン内のホスト同士が 相互に リモートデスクトップ接続 をおこなう際に 証明書 が利用されることになります。

証明書の確認ウィンドウが表示されてしまう場合は、この証明書の配布がうまくいっていないか、証明書が リモートデスクトップサービスにバインドされていないか・・・が主な原因です。

---

## 証明書の配布状態を確認する
接続元、接続先 のホストで、ローカルコンピューターの証明書ストアを確認します。
**certlm.msc** を検索して、実行します。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1d8ec382-5e55-b741-82ca-27d613315e97.png">

ドメイン内の 各ホストには、以下のように **信頼されたルート証明機関** のストアに、**ルート証明書** が配布されています。
この証明書は、リモートデスクトップ の接続元 になる場合に必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/76fbde23-b3dc-48d1-2ffb-79049d1a7de7.png)

ドメイン内の各ホストには、以下のように **リモートデスクトップ** のストアに 各ホストのコンピューター名（緑下線）の **サーバー証明書** が配布されています。
この証明書は、リモートデスクトップ接続を受ける側として必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8ad7fc5e-0dd3-0a06-26a0-33ab7b8cd55e.png)

**詳細** タブで、証明書の詳細な値が確認できます。**拇印** もココに記載されています。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b4558492-6eaf-de54-f0de-1e52e126f278.png">

---

## 証明書のバインド状態を確認する
以下の PowerShell コマンドを実行する事で リモートデスクトップサービスにバインドされた証明書を確認できます。
~~~
Get-WmiObject -Class "Win32_TSGeneralSetting" -Namespace Root\cimv2\Terminalservices  
~~~

前章で 証明書の **拇印** 欄に表示されていた値と、下図の **SSLCertificateSHA1Hash** が同一の値であれば、証明書が リモートデスクトップサービスに正しくバインドされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c8f34415-4128-d10a-3b1e-0e7496d7107e.png)

もし、**拇印** と **SSLCertificateSHA1Hash** の値に差異があった場合は問題です。
以下の公開情報に、バインドの確認方法や変更方法も記載されているため、問題解決して 一致させましょう。

**公開情報：リモート デスクトップ リスナー証明書の構成**
https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/remote/remote-desktop-listener-certificate-configurations?wt.mc_id=mvp_407731

:::note info
**ポイント**
オブジェクト識別子 (OID) が、1.3.6.1.4.1.311.54.1.2 という証明書が配布されていると、自動的に リモートデスクトップのストアに配置されます。
このストアに配置されていると、リモートデスクトップのサービスに 自動的にバインドされるようです。
:::

---

# 参考
以下の記事も参考にしました。
内容を分析した結果、冒頭（はじめに）で紹介した記事がベストであると判断して、検証し 本記事を執筆しています。各記事を比較して、なぜ そういう設定にしているのかを検討してみると、より深い理解が得られます。

https://medium.com/thesecmaster/step-by-step-procedure-to-deploy-rdp-certificates-using-gpo-ba27f1c9b5fa

https://www.gradenegger.eu/en/configuring-a-certificate-template-for-remote-desktop-rdp-certificates/

https://atmarkit.itmedia.co.jp/ait/articles/1309/20/news036.html