AWS IoT Coreに「1-Click証明書作成」と「CSRによる作成」の2つの方法でプロビジョニングを実施してみる

#はじめに
IoT Coreにプロビジョニングする方法のうち、以下2点を試したので、その備忘録です。

* 1-Click証明書作成
* CSRによる作成

なお、今回プロビジョニングするデバイスはJetson nanoのDevelopers kitです。
作業はWindowsで行い、Jetson nanoに対する作業は主にTeraTermで接続して行っています。
※ファイルのやりとりはFileZillaで実施

以下の記事を参考に、事前にOSインストール済です。
参考：[はじめてみよう！NVIDIA Jetson nano まずは知識と最初の起動！](https://www.fabshop.jp/firstsetpjetson/)

# 事前準備
##AWS IoTのCAルートを取得
[このページ](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/server-authentication.html?icmpid=docs_iot_console#server-authentication-certs)からAWS IoTのCAルートを取得します。
「RSA 2048 ビットキー: Amazon Root CA 1」を右クリックして、「名前を付けてリンク先を保存」で取得できます。

##mosquittoのインストール
プロビジョニング後の疎通テスト用にmosquittoをインストールしておきます。
参考：[UbuntuにMosquittoをインストールしてMQTTブローカーを構築](https://qiita.com/kyoro353/items/b862257086fca02d3635)

```
#パッケージにmosquittoのレポジトリを追加
sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa

#パッケージリストの更新
sudo apt-get update

#クライアントのインストール
sudo apt-get install mosquitto-clients

#ブローカーのインストール
sudo apt-get install mosquitto
```

#1.「1-Click証明書作成」でプロビジョニング
今回は証明書作成→モノの作成、という順で実施したので、その通り記載します。
※モノの作成で「1-Click証明書作成」の方が手数は少なく済むはずです

##1-1　証明書の作成
1.マネジメントコンソールでIoT Coreに移動
2.左のメニューから 安全性 > 証明書 > 証明書を作成する の順にクリック
3.以下の画面で 1-Click証明書作成（推奨）の「証明書を作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/2df5e8ce-b3c9-50c9-b309-b4cbec4bab7b.png)
4.証明書が作成されるので、すべてダウンロードし「有効化」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/9328ac99-990f-9e9d-ab14-668f858c18ed.png)
5.「ポリシーをアタッチ」をクリック
6.「新規ポリシーの作成」をクリック
7.今回は検証用なので、以下の通り特に権限を絞らずアクションとリソースを指定して、「作成」をクリック

* 名前：任意のポリシー名
* アクション：iot:*
* リソースARN：*
* 許可にチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/d6a0600e-71e0-228a-3b46-50cddb182869.png)
##1-2　モノの作成
1.左のメニューから 管理 > モノ > モノの登録 の順にクリック
2.「単一のモノを作成する」をクリック
3.「名前」に任意の名前を入力し、他はそのままで「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/95fd218c-8bf9-2a59-1a59-68b834108752.png)
4.今回は先に証明書を作成しているので、「証明書なしでモノを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/bcbf86d2-c0a8-a187-a85f-b067f24bf17b.png)
##1-3　証明書のアタッチ
ここまでの手順で作成したモノと証明書を関連付けます。

1.左のメニューから 安全性 > 証明書 とクリック
※一覧に先ほど作成した証明書が表示される
2.作成した証明書をチェックして アクション > モノをアタッチ
3.作成したモノをチェックして「アタッチ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/8904d1ac-7682-0090-cb7e-e03edff95afd.png)
##1-4　疎通確認
取得したモノの証明書、秘密鍵、AWS IoTのCAルートを使ってIoT CoreにMQTTでメッセージを送信します。

1.証明書等を格納するディレクトリを作成

```
mkdir .certs
```
2.作成したディレクトリに以下のファイルをアップロード

* 秘密鍵：xxxxx-private.pem.key
* 証明書：xxxxx-certificate.pem.crt
* IoT CoreのCA：AmazonRootCA1.pem

3.マネジメントコンソールで 左メニューからテストをクリック
4.左のメニューの設定をクリックし、エンドポイントを控えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/a5379b68-b6f7-9212-a8af-6283b1026d79.png)
5.トピックのフィルターに「test/mqtt」と入力して、「サブスクリプション」をクリック
※test/mqtt宛てにパブリッシュされたメッセージをサブスクライブできるかテストする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/5593efdf-6810-88d9-73e2-930f238afc98.png)
6.Jetson nanoからmosquittoでtest/mqtt宛てにメッセージをパブリッシュ

```
#証明書等を格納したディレクトリに移動
cd .certs

#MQTTメッセージをパブリッシュ
mosquitto_pub --cafile [IoT CoreのCA] --cert [モノの証明書] --key [秘密鍵] \
 -i [デバイス名] --tls-version tlsv1.2 -h [エンドポイント] -p 8883 -q 1 \
 -t test/mqtt -m "{\"message\":\"Hello world\"}" -d
```
7.マネジメントコンソールで設定したサブスクリプションにメッセージが届ていることを確認する
8.Jetson nanoで今度はサブスクライブを行う

```
mosquitto_sub --cafile [IoT CoreのCA] --cert [モノの証明書] --key [秘密鍵] \
 -i [デバイス名] --tls-version tlsv1.2 -h [エンドポイント] -p 8883 -q 1 -t test/mqtt -d
```
9.マネジメントコンソールで左のメニューから テスト > トピックに公開する をクリック
10.トピック名を「test/mqtt」として「発行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/96ae3968-6407-561c-47cf-a78caf446701.png)
11.Jetson nanoでサブスクライブ出来たことを確認する
※Ctrl + C でサブスクライブを終了
##1-5　備忘録
証明書を格納したディレクトリ以外でmosquittoコマンドを実行したところ「Error: Problem setting TLS options.」というエラーが発生しました。
以下の記事を参考に、上記の通りディレクトリを移動したところ解消しました。
参考：[【Raspberry Pi】AWS IoTとRaspberry PiでIoTをやってみよう](http://www.kanenote.org/blog/?p=986#2_Error_Problem_setting_TLS_options)
#2　CSRによる作成
上記の作業後、同じJetson nanoで作業をするにあたって以下を削除しています。

マネジメントコンソールから

* モノ
* 証明書

Jetson nanoから

* モノの証明書
* 秘密鍵

##2-1　秘密鍵とCSRの作成
今回は「CSRによる作成」でモノの証明書作成を行うため、以下の記事を参考に秘密鍵とCSRを作成しました。
参考：[Apache + OpenSSL CSR生成手順 (新規)](https://knowledge.digicert.com/ja/jp/solution/SO23384.html)

1.Jetson nanoで秘密鍵とCSRを生成

```
#opensslが使えることを確認
openssl version
OpenSSL 1.1.1  11 Sep 2018

#作業ディレクトリに移動
cd .certs

#秘密鍵の生成
openssl genrsa -des3 -out private.key 2048

#CSRの生成
openssl req -new -key private.key -out things.csr
```
2.作成したCSRを取得

##2-2　モノの作成
1.左のメニューから 管理 > モノ > モノの登録 の順にクリック
2.「単一のモノを作成する」をクリック
3.「名前」に任意の名前を入力し、他はそのままで「次へ」をクリック
4.今回は「CSR」による作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/bcbf86d2-c0a8-a187-a85f-b067f24bf17b.png)
5.ファイル選択画面が開くので、先ほど作成・取得したCSRファイルを選択
6.「ファイルのアップロード」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/aeb84261-14c0-b5cd-f122-027b8d802851.png)
7.作成されたモノの証明書をダウンロードし、「有効化」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/b2910f8d-3598-5dee-9586-68e299cc1e70.png)
8.「ポリシーのアタッチ」をクリック
9.「1-1 証明書の作成」で作成したポリシーを残しているので、今回はこれを選択して「モノの登録」をクリック

##2-3　疎通確認
以下は1-4で実施した手順と同じになります。

1.取得したモノの証明書をJetson nanoの.certsディレクトリにアップロード
2.マネジメントコンソールで 左メニューからテストをクリック
3.トピックのフィルターに「test/mqtt」と入力して、「サブスクリプション」をクリック
※test/mqtt宛てにパブリッシュされたメッセージをサブスクライブできるかテストする
4.Jetson nanoからmosquittoでtest/mqtt宛てにメッセージをパブリッシュ

```
#証明書等を格納したディレクトリに移動
cd .certs

#MQTTメッセージをパブリッシュ
mosquitto_pub --cafile [IoT CoreのCA] --cert [モノの証明書] --key [秘密鍵] \
 -i [デバイス名] --tls-version tlsv1.2 -h [エンドポイント] -p 8883 -q 1 \
 -t test/mqtt -m "{\"message\":\"Hello world\"}" -d
```
5.マネジメントコンソールで設定したサブスクリプションにメッセージが届ていることを確認する
6.Jetson nanoで今度はサブスクライブを行う

```
mosquitto_sub --cafile [IoT CoreのCA] --cert [モノの証明書] --key [秘密鍵] \
 -i [デバイス名] --tls-version tlsv1.2 -h [エンドポイント] -p 8883 -q 1 -t test/mqtt -d
```
7.マネジメントコンソールで左のメニューから テスト > トピックに公開する をクリック
8.トピック名を「test/mqtt」として「発行」をクリック
9.Jetson nanoでサブスクライブ出来たことを確認する
##2-4　備忘録
「2-2　モノの作成」の手順6で「ファイルのアップロード」をクリックした際に以下の挙動に何度か発生しました。

* 作成された証明書の画面を飛ばしてポリシーのアタッチの画面に飛ばされる
* ポリシーを選択して「モノの登録」をクリック後、モノが登録されていない

作成された証明書の画面が飛ばされた際は戻って「ファイルのアップロード」を再試行しました。
モノが登録されていなかった場合は モノを登録 → 証明書をアタッチ という順で対応しました。
#3　おわりに
今回は上記2つの方法でデバイスをプロビジョニングし、MQTTメッセージのパブリッシュ/サブスクライブができるところまでを確認しました。
確認が目的だったので作成した以下のものは作業後削除しています。
※AWS IoT CoreのCAは今後また検証で使うことを見越して残しています

* ポリシー
* モノの証明書
* モノ
* 秘密鍵とCSRファイル

#4　参考文献（文中で登場していないもの）

* [AWS IOT CORE 初級ハンズオン](https://aws-iot-core-for-beginners.workshop.aws/)
* [AWS IOT DEVICE MANAGEMENT WORKSHOP](https://iot-device-management.workshop.aws/)
* [[AWS IoT] CSRによる証明書の作成](https://dev.classmethod.jp/articles/aws-iot-create-certificate-with-csr/)