自己署名証明書を使用してWindows ServerでUniFi NetworkのSSL通信をセットアップする方法

# はじめに
「UniFiNetworkApplication」を稼働させている状況で、WebページにアクセスするとGoogleが毎回警告を表示してくるのが面倒だと感じ、また証明書についての知識も身につけたいと思い、SSL通信の実装に挑戦することにしました。ただし、この通信はプライベートネットワーク内で完結するため、自己署名証明書を利用しています。



# 環境
CA（認証局）
　OS：WindowsServer2019
　ActiveDirectory証明書サービスインストール済み
　※ActiveDirectoryとして利用しています。

UniFiNetworkApplicationサーバ(以下、UniFiサーバ)
　OS：WindowsServer2019
　UniFiNetworkApplicationをサービスとして実行済み
　※サービスとして実行する方法は[こちら](https://qiita.com/rat-engineer755/items/2f04a9822e8e701fd13a)で紹介しています。

ブラウザ
　GoogleChrome



# 前提条件
1. ここではWindows Serverの機能であるActive Directory証明書サービスを利用しています。事前にインストールと設定を完了させるか、別の証明書発行サービスを利用して代替してください。
1. UniFiサーバは事前にドメイン参加しているものとします。
1. 各サーバは固定のIPアドレスが割り振られていること。
1. DNSによる名前解決が出来ること。もしくはhotsファイルで名前解決が出来ること。
1. CAの役割をさせるサーバの証明書をブラウザにCAの証明書が「信頼できるルート証明機関」にインポートされていること。



# 手順

## KeyStore Explorerのダウンロード・セットアップ
[https://keystore-explorer.org](https://keystore-explorer.org/)でkeystore explorerをダウンロードします。
ダウンロードが出来たら、UniFiNetworkApplicationが稼働しているサーバにインストールします。

:::note info
**keystoreについて**
UniFiNetworkApplicationはkeystoreというファイルに証明書を保存しています。
普通の方法では中身を確認することが出来ないため、Javaのコマンドを使って証明書を上書きするか、KeyStore Explorerを使ってGUIで操作する必要があります。
:::



## 証明書の発行
UniFiサーバでコンピューター証明書の管理を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/993e7d9f-cbe0-24ba-23d5-e4617cdec388.png)

ファイル名を指定して実行で「certlm.msc」と入力しても出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/257e3aae-f8e3-59f3-fd4c-725049e4a476.png)

証明書の管理コンソール（certlm.msc）が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/26803c68-50b8-6527-5d25-28b94106b5d5.png)


証明書の管理コンソール（certlm.msc）を開いたら、「証明書 - ローカルコンピューター ＞ 個人 ＞ 証明書」と進み、証明書の一覧を表示します。
証明書の一覧で右クリックをして、表示されるメニューから「すべてのタスク(K) ＞ 新しい証明書の要求(R)...」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/600e20f8-3ec6-11c3-aec4-9b591b862b30.png)

「次へ(N)」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/b09940bc-288a-328a-3756-bb1ca40aebfd.png)

ドメイン参加しているので、「ActiveDirectory 登録ポリシー」を選択して「次へ(N)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/8c39b1ed-c154-d8cf-50f6-987c485edb48.png)

> もしドメイン参加していない場合はユーザーが構成することになるので、下記になるんですかね。今回の環境ではこちらは解説出来ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/42ab8122-35ce-6a44-8570-2a0f49031c72.png)

証明書の登録画面が出ます。
先ほど作成したUniFiNetworkWebServiceのテンプレートが出てきていますが、情報が不足しているので詳細の隣にある矢印をクリックして、プロパティを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/7ea8018e-6902-5adf-9090-23591eb6d10e.png)

証明書のプロパティインターフェースが出てくるため、必要な情報を入れていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/f14c69a7-950b-2ea8-fecf-88a7724ea08a.png)
必要なサブジェクト名は下記くらいですかね。
- 共通名（コモンネーム）
- 国名(なくてもいいですが最低限...)

上記以外にも地域、都道府県などありますが、無くても何とかなります。
別名の欄は個別で設定を入れてもらえればいいですが、おすすめは下記の３点です。
- DNS
- IPアドレス(v4)
- URL

秘密キーのタブへ移り、キーのオプションで秘密キーをエクスポート出来るようにしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/abb02502-572c-b2ba-e9fb-a1eb8c88921e.png)

必要な設定を入れ終わったら、「OK」をクリックし、チェックボックスにチェックを入れて「登録(E)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/b55ede3b-d8a0-36f3-0906-dc8531790945.png)

問題なく証明書が登録されたら下図のように成功と表示されます。
「完了(F)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/f3c6a549-270b-cd85-4111-0fceca29b5ec.png)

完了をクリックしたら証明書の登録画面が消え、証明書の管理コンソールの「証明書 - ローカルコンピューター ＞ 個人 ＞ 証明書」の中に先ほど作った証明書がインストールされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/1c80d3c9-f890-e449-f447-9f1c23e03aa6.png)



## 証明書のエクスポート
前のステップで作成した証明書を選択し、右クリックをして「すべてのタスク(K)　＞　エクスポート(E)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/d360b536-3c3f-eb0c-a79b-a07b2d894659.png)

証明書のエクスポートウィザードが表示されるので「次へ(N)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/63e6ae06-e762-759c-1cac-d62ad5779760.png)

秘密キーをエクスポートするか聞かれるので「はい」のラジオボタンをクリックして「次へ(N)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/055bf18e-7ef6-ed4c-c5a6-4216b41430df.png)

エクスポートの形式を聞かれます。
選択の余地はありませんが「.PFX」で出力されるようにして「次へ(N)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/60863c79-2673-4153-e2c8-e3371e30311d.png)

秘密キーを保護するためにセキュリティを選択します。
無難にパスワード入れていきます。また、暗号化方式で「TripleDES-SHA1」が選択されていますが、「AES256-SHA256」に変更して「次へ(N)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/49645274-56cb-ee66-9cb3-e50a3caebd48.png)
一応、Wikiも調べたらTripleDESは推奨されないみたいですね。

TripleDES wiki

https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%AA%E3%83%97%E3%83%ABDES

エクスポートする場所とファイル名が聞かれますので、適当な場所に設定します。
今回はデスクトップに「example」という名前で保存します。
設定が出来たら「次へ(N)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/42819022-bf49-6609-5a17-225fd61ae162.png)

ウィザードが完了したという画面が出たら「完了(E)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/5b5684b1-2137-c506-c3a1-26fec6dc7277.png)
「正しくエクスポートされました。」と表示されるので「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/aaa90a13-e1dd-b765-f722-82a7bf0a2dce.png)

保存された場所（今回はデスクトップ）を見るとちゃんとエクスポートされているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/d4ab0146-130e-8366-ad1b-20354a063abe.png)



## サービス停止
:::note warn
**注意**
この操作を行うとUniFiNetworkApplicationのサービスが停止し、 **Webブラウザからアクセスが出来なくなります。**
無線通信には影響出ませんが留意しておいてください。
:::

「ファイル名を指定して実行」で「services.msc」と検索してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/cfa94110-d001-e855-728d-b370e885aedd.png)

サービス管理コンソールが出てくるので、UniFiNetworkApplicationを探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/0dc8b92f-941a-3e15-f84e-3041142ad649.png)

見つけたら「サービスの停止」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/af39bf78-bc4d-3dc5-fec9-3e85bbac47ca.png)



## keystoreのバックアップ
KeyStore Explorerで操作をする前にバックアップを取得します。
keystoreの保存されているディレクトリに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/84aba14b-798c-ffed-184b-d653158eacda.png)

:::note info
**keystoreの保存場所**
keystoreは通常インストールしたUserディレクトリ内に「Ubiquiti UniFi」というディレクトリが作成され、その中に存在するため、**「C:\User\$user\Ubiquiti UniFi\data」** に保存されます。
:::

私の環境では\Program Filesにサービスとしてインストールしているため、下記のディレクトリパスになります。
「C:\Program Files\Ubiquiti UniFi\data」

\Program Filesにサービスをインストールする方法は下記の記事を参照してください。

https://qiita.com/rat-engineer755/items/2f04a9822e8e701fd13a

keystoreをコピーして名前を変更します。
keystore.bakでもkeystore.originでも何でもいいです。
これでバックアップも完了です。



## 証明書をkeystoreにインポートする

### keystoreをKeyStore Explorerで開く
まずKeyStore Explorerを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/d6c9e507-5c03-6230-f7ac-2b8778678507.png)

「Open an exsting KeyStore」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/fcc93763-5129-b95d-9b0c-ddd64d0e5abe.png)

ダイアログボックスが出てくるので、先ほど確認した場所のkeystoreファイルを選択して「開く」をクリックします。
**※デフォルトのファイルタイプは「KeyStore File」になっているので「すべてのファイル」に変更します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/1dcd472c-4715-c244-b77e-4882e5ea0b4e.png)

keystoreを開く際にパスワードを求められます。
UniFiNetworkApplicationのkeystoreのデフォルトパスワードは下記になります。
```
aircontrolenterprise
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/dcecb2cb-b1e9-4af8-7fa0-9b1569da90b1.png)

無事開けると既存のunifi証明書が保存されているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/ccb860bb-5efb-7aff-7f90-bad7a3e5a2c7.png)

### 既存の証明書を削除する
Entry Name「unifi」を選択し、右クリックをするとメニューが表示されます。
その中の「Delete」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/2638c61a-8120-633d-d667-d2f136504386.png)

確認をされるので「はい(Y)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/c7849585-b350-d88c-d4fe-de39b4ad37d7.png)

一覧から削除されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/1f98f87a-bac9-2b1c-c4d8-ecc19322b2dc.png)


### keystoreに証明書をインポートする
ツールバーの「Import Key Pair」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/e994359a-44dc-4db7-cc68-2914fe054b61.png)

Key Pair Typeを聞かれるので「PKCS #12」を選択し、「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/1cdfb6c0-0b0d-db91-73db-ade5ef19b324.png)

ファイルの場所と開封するためのパスワードを聞かれるので、作成した証明書ファイル（この記事ではexample.pfx）を選択し、パスワードを入力します。
パスワードは.PFXファイルをエクスポートするときに設定したパスワードを入力します。
入力が完了したら「Import」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/b9303309-1c86-5f84-d94d-9cca78b19bbb.png)

Entry Aliasを聞かれるので、デフォルトのunifiを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/1b17c4aa-14ab-e00b-bb81-77d7318a818c.png)

新しくKey Pairのパスワードを設定することになりますが、ここはUniFiNetworkApplicationのデフォルトパスワードを設定します。
```
aircontrolenterprise
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/7fbab9dd-e031-faaf-5640-7407eba2d223.png)

「OK」をクリックするとKey Pairのインポートが成功した表示が出て、一覧に証明書がインポートされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/a1f87486-9f3f-a0a1-6b01-656ddc3d51a8.png)


### 設定の保存
:::note warn
これを実施しないと設定が反映されないので注意してください。
:::

最後に設定を保存します。
ツールバーのSaveアイコンをクリックして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/7cd451a0-19a0-47ae-a85f-f1be2eac0365.png)


## サービス開始
サービスを開始します。
サービス停止と同じく「services.msc」を開いて、UniFiNetworkApplicationのサービスを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/d692b6a9-a3b0-5a71-cbb1-229c4a06a328.png)


## 確認
最後にWebブラウザからページにアクセスして確認をします。
下記のURLをブラウザに入力してみます。

https://<任意のFQDN or IPアドレス>:8443/manage/

:::note warn 
**注意 404エラーについて**
サービスを開始してすぐにアクセスすると404エラーを返されるので１分ほど待ってからアクセスしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/ccfc9468-fac8-a49b-bca4-4406d7d5e60d.png)
:::

下記の様にログイン画面が出てくればサービスの開始は正常に行われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/dab8069f-a4e9-d9b7-d90e-65d0d1d30754.png)

下記の様に表示されていれば正常にSSL通信が実装できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/67dcdbed-300a-b09b-bbeb-c8fccd665103.png)


# おわりに
今回は（あまり意味はないですが）SSL通信をUniFiNetworkApplicationのサービスを例に実装してみました。
毎回Googleから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1675077/9ec52e60-8504-d5e1-a9ec-559f0c51425b.png)

と言われるのも面倒ですからね。
もし興味がある方は実装してみてください。