1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS: IoT Coreジャストインタイムプロビジョニング(JITP)の仕様検証

Last updated at Posted at 2019-05-18

はじめに

IoT Coreのジャストインタイムプロビジョニング(JITP: Just-in-time provisioning)の検証を行いました。
想定読者は例えば以下のような事に興味がある方々です。

  • ジャストインタイムプロビジョニングについて理解したい。
  • OpenSSLで証明書を作成したい。
  • 作成したCA証明書をAWS IoT Coreに登録したい。
  • ジャストインタイムプロビジョニングのリクエストをPythonで書きたい。

以下が検証するアーキテクチャです。
「複数個」と記載している箇所は、デバイスの数だけリソースが生まれます。
arc.png

検証内容

IoT Coreのジャストインタイムプロビジョニングの登録、レスポンスの動作について検証する。

準備

本検証の準備内容について以下に示す。
準備の説明における凡例は以下の通りである。
<凡例>

はファイル出力の例を示す。

はコンソール出力の例を示す。


証明書の作成

本検証に必要な秘密鍵、証明書の作成方法を以下に示す。

  • CA 証明書を作成
openssl genrsa -out rootCA.key 2048

rootCA.key

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem  

rootCA.pem

  • 検証証明書の作成
openssl genrsa -out verificationCert.key 2048

verificationCert.key

openssl req -new -key verificationCert.key -out verificationCert.csr
Common Name (eg, your name or your server's hostname) []:{入力値※1}

verificationCert.csr

openssl x509 -req -in verificationCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out verificationCert.pem -days 500 -sha256

Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd/CN={入力値※1}
Getting CA Private Key

rootCA.srl
verificationCert.pem

  • デバイス証明書の作成
openssl genrsa -out deviceCert.key 2048  

deviceCert.key

openssl req -new -key deviceCert.key -out deviceCert.csr
Common Name (eg, your name or your server's hostname) []:{任意の値}  

deviceCert.csr

openssl x509 -req -in deviceCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out deviceCert.crt -days 500 -sha256  

Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd/CN={任意の値}
Getting CA Private Key

deviceCert.crt

cat deviceCert.crt rootCA.pem > deviceCertAndCACert.crt  

deviceCertAndCACert.crt

AWSリソース

本検証で用いるAWSリソースについて以下に示す。

IoT Core

  • 検証用証明書の登録先エンドポイントを取得
    {入力値※1} に必要です。AWSのアカウントおよびリージョン毎に値が変わる。
aws iot get-registration-code

"registrationCode": "{入力値※1}"

  • プロビジョニングテンプレートを作成
    provisioning-template.jsonを準備する。プロビジョニングテンプレートの記載方法はジャストインタイムプロビジョニングを参照。プロビジョニングテンプレート内の"templateBody"の値はString型なので見づらいので、jsonファイルで記載しておきStringへ変換するIaCプログラムを用意するなどがおすすめ。

  • ポリシーを作成
    ポリシーを作成する。作成方法については、AWS サービスの直接呼び出しの承認を参照。

IAM

ソースコード

IoT Coreへジャストインタイムプロビジョニングのリクエストを行うソースコードを以下に示す。

import requests
import json
from aws_requests_auth.aws_auth import AWSRequestsAuth

account_id = 'xxxxxxxxxxxx'
endpoint = 'xxxxxxxxxxxxxx'
thing_name = 'testThingName'
role_alias = 'roleAliasName'

headers = {'x-amzn-iot-thingname': thing_name}
url = 'https://' + endpoint + '.credentials.iot.ap-northeast-1.amazonaws.com/role-aliases/' + role_alias + '/credentials'
crt = './deviceCertAndCACert.crt'
key = './deviceCert.key'
certs = (crt, key)

res = requests.get(url, cert =certs, headers=headers)
res_dict = json.loads(res.text)
print(res_dict)

動作検証手順

  1. 各種必要なファイルを実行環境に用意

  2. CA証明書を登録
    以下のAWS CLIコマンドを実行する。

aws iot register-ca-certificate --ca-certificate file://rootCA.pem --verification-cert file://verificationCert.pem --set-as-active --allow-auto-registration --registration-config file://provisioning-template.json    

3. ジャストインタイムプロビジョニングの実行
IoT Coreへジャストインタイムプロビジョニングのリクエストを行うソースコードを実行する。

動作検証結果

  • IoT Coreへリクエスト(1回目)

    • IoTへ以下の登録された。
      • デバイス証明書
      • モノ
      • デバイス証明書とモノの紐づけ
      • デバイス証明書へポリシーをアタッチ
    • 「HTTP/1.1 200 OK」が返却されない。
  • IoT Coreへリクエスト(2回目以降)

    • 「HTTP/1.1 200 OK」が返却される。
    • 以下が返却される
    {
        "credentials": {
            "accessKeyId": "xxxx",
            "secretAccessKey": "xxxx",
            "sessionToken": "xxxx",
            "expiration": "xxxx"
        }
    }
    

まとめ

  • ジャストインタイムプロビジョニングの登録動作を確認できた。
  • クリデンシャルを取得したいならば、数秒後にリトライすると取得できた。

参考

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?