ACM PrivateCAをAzureに上に作成したRootCA（ADCS）の下位CAにしてみた

本記事は株式会社Works Human Intelligenceのアドベントカレンダー、「Develop fun!」を体現する Works Human Intelligence #2の15日目になります。
弊社ではアドベントカレンダーを2枚実施しておりますので、1枚目もぜひご覧ください！

#なにこれ

AWSに構築されているPrivateCAをAzureに構築されているRootCAの下位CAとして利用するために
CA証明書を発行し、インポートした記録です。
webに情報が少なかったので共有の意味を込めて記事にいたします。

本当はサーバールーム移設作業を絶賛行っており内容も盛りだくさんなので書こうと思ったのですが
~~時間が足りず~~諸般の事情により見送りました。

#前提

- AzureADCSにてRootCAが作成済み
- AWS上にてACMPCAが作成されている（階層構造は無し）

#手順概要

- ACMPCAにて署名リクエストCSRを取得
- RootCAに署名リクエストと取り込む
- RootCAにてリクエストから証明書を発行する
- 発行された証明書をPEM形式でエクスポートする
- RootCAのCA証明書をPEM形式でエクスポートする
- ACMPCAに署名された証明書をインポートする
- ACMPCAから証明書を発行し、階層化されているかを確認する

ではやっていきましょう。

#構築
## ACMPCAにて署名リクエストCSRを取得
AWS PCAのプライベートCAの画面を開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/a1e5522f-c6ba-1574-093d-05447c77c8d2.png)
対象のCAを選択し
アクション→CA証明書をインポートする→「外部プライベートCA」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/25dfb19b-fe44-5a72-a407-48cfb0a6f37d.png)
CSRが表示されるのでその内容をコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/8ccb56ae-c563-b725-af3b-f784b2465b74.png)

##ACMPCAにて署名リクエストCSRを取得
RootCA（ADCS）の起動している端末（インスタンス）にアクセスする。
先程コピーしたCSRの内容をメモ帳にペーストし「REQ」ファイルとして保存する（あるいはCSRファイルを配置する）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/bd615936-e84c-40df-3f0d-4d6824fefd59.png)

certsrv.mscを起動する。
起動したらRootCAを選択し右クリック→All Tasks → Submit new request

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/36af5f7d-7816-9815-badd-9b591552256b.png)
先程作成したREQファイルを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/713a18f6-a6ac-74e9-5955-127ba5f672c3.png)
するとPendin Requestsに追加される

##RootCAにてリクエストから証明書を発行する

追加されたPending Requestsを選択し右クリック
All Tasks -> Issue
を選択し、証明書を発行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/1972696d-3944-5903-8476-c948d6b42ac0.png)
するとIssued Certificatesに証明書が追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/275918cb-4346-7a37-5dba-e048fa9f57c4.png)
確かにACMPCAに対する証明書が作成されました！

##発行された証明書をPEM形式でエクスポートする

発行された証明書をダブルクリック→Detailsのタブを選択→Copy to Fileを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/62458ebf-632a-f15c-1ec1-cbb6e959edca.png)
次のようにダイアログに従って進めていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/40f202de-9d8c-782f-2bc3-b140be644266.png)
フォーマットは[Base-64 encoded X.509]を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/1d30e574-e10e-44af-d448-4d399f52e21e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/edb09f3a-a13f-f496-d321-dfaa9b2144eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/42996e12-c3b4-dc72-9156-d6c1a64c24f1.png)
これでエクスポートが完了する①。中身を確認すると次のようになっている（これを後でPCAにインポートする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/cd75a5ec-cb6b-e4b8-c92d-3c7973c3c13c.png)
##RootCAのCA証明書をPEM形式でエクスポートする

この証明書はチェーン証明書としてPCAにインポートする証明書になる。
C:\Windows\System32\CertSrv\CertEnroll
を開き、RootCAのルート証明書を選択する。バイナリデータの場合（今回）一度Base-64 encordedに変更して上げる必要がある。
対象のルート証明書をダブルクリック→Detailsのタブを開き[Copy to File...]をクリックする。
先程と同様のダイアログが表示されるので[Base-64 encoded]を選択して証明書をエクスポートする。②

##ACMPCAに署名された証明書をインポートする
準備は整いましたので署名された証明書をインポートしていきます。

ACMPCAの画面を開き
証明書本文の欄に①のRootCAで署名されたPCAの証明書をコピペ
証明書チェーンの欄に②のRootCAのCA証明書をコピペ
する。[続行]をクリックし確認画面を表示。
インポートを完了させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/3242f727-9860-57b3-067f-581be30fa49b.png)
##ACMPCAから証明書を発行し、階層化されているかを確認する
CA証明書のインポートが出来たら、実際に証明書をエクスポートしてみる。
Certificate Managerを開き[証明書のリクエスト]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/739e1b02-f7d4-05cb-916b-9f7dde5ba810.png)
プライベート証明書を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/b6e5a62b-dfdf-51e3-4573-ef629825359c.png)
作成したCAを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/ced182c6-6ba5-468c-ef54-be7582b5cd9e.png)
今回は検証として midnight.worksというホストの証明書を発行してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/411ed84d-48e1-503a-a672-c397810f6400.png)
後は内容を確認し、証明書を発行。
発行されているのを確認。アクション→エクスポートを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/dbaa3328-e958-69b8-0539-aac7b3e63fab.png)

パスフレーズを要求されるので適当なパスフレーズを入力（空欄不可。後にサーバーに配置した際に必要になります）
すると次にように証明書が出力されるのでサーバーに配置してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/08b8bfa0-8e56-9f5d-cd23-07eb0fa31557.png)
それぞれ

- 証明書
- チェーン証明書
- 秘密鍵
となっております。

###サーバーへの配置

実際にサーバーに配置してみます。今回は検証用の端末に配置。

```
root@midnight:/etc/ssl/certs# ls *acm* -lth
-rw-r--r-- 1 root root 2.8K Oct  6 12:24 midnight-acm-chain.pem
-rw-r--r-- 1 root root 1.4K Oct  6 12:23 midnight-acm.pem
root@midnight:/etc/ssl/certs# ls ../private/*acm* -lth
-rw-r--r-- 1 root root 1.9K Oct  6 12:24 ../private/midnight-acm.key
root@midnight:/etc/ssl/certs#
```

- 証明書 midnight-acm.pem
- チェーン証明書 midnight-acm-chain.pem
- 秘密鍵 midnight-acm.key

として配置。このサーバーではapacheを利用しているのでapacheのSSLに関するCONFIGを書き換える
配置、設定変更が完了したら、サービスを再起動する。その際にエクスポートの際に求められたパスフレーズを入力する必要があります。

###ルート証明書のインポート

アクセスするローカルマシンにRootCAの証明書をインポートする。
ルート証明書のCERファイルを右クリック→証明書のインストール
保存場所をローカルユーザーに変更、次へを押し、「信頼できるルート証明期間」を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/ff295f28-a0a3-fc4d-5ce1-a716fbb632af.png)

後はダイアログに従ってインストールを行う。
Windowsの検索画面に「証明書」と入力して「ユーザー証明書の管理を開く」
「信頼されたルート証明期間」→「証明書」を選択
「作成したRootCA名」があるのを確認する
###確認

実際にブラウザからアクセスしてみる。

- HTTPS通信ができる
- 証明書のパスが階層化されている

ので無事にACMPCAを下位CAとして利用することができていることが確認できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116999/4b9412f2-2d8b-1d24-f4a5-302f671360fd.png)

無事下位CAにすることができ、証明書の発行を行うことができました。

#終わりに

ここまで読んでいただきありがとうございました！
記事を書くのは初めてでしたがいい経験になりました。
ご興味のある方ぜひとも一緒に仕事しましょう！