AWSとFreeRTOSを用いたOTAによるファームアップデート方法 - renesas/rx72n-envision-kit GitHub Wiki

準備する物

  • 必須
    • RX72N Envision Kit × 1台
    • USBケーブル(USB Micro-B --- USB Type A) × 3 本
    • LANケーブル(インターネット接続可能なネットワークに接続されていること) × 1 本
    • USB-シリアル変換 PMODモジュール × 1 台
    • Windows PC × 1 台

前提条件

  • FreeRTOSチュートリアル デバイスをAWS IoTに登録する を完了すること
    • 自分のAWSアカウントのIoTエンドポイントの文字列が入手出来ていること
      • 例: a164xxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com
    • 自分のRX72N Envision Kit用の「モノの名前」の文字列が入手出来ていること
      • 例: rx72n_envision_kit
    • 自分のRX72N Envision Kit用の「モノ」がAWSにアクセスするための証明書/パブリックキー/プライベートキーのファイルが入手出来ていること
  • FreeRTOS 無線による更新 の各前提条件を完了すること
    • ここでは各項目における実際の操作について2020/06/14時点の注意事項を中心に紹介する

キーワード

  • FreeRTOS 無線による更新 では以下キーワードが出てくる
  • キーワードに対し入力が求められる名前や、予めアカウント毎に決まっている値がある
  • テキストエディタにキーワードを張り付けておき、手順を進める毎にその名前や値を列挙しておくとよい
  • 特にアクセスポリシー用のコードには、これらキーワードを代名詞とした状態で解説されており、ポリシー適用前に自力でコード書き換えが必要である
  • 本稿ではキーワードに対し以下のように名前や値を定義する
  • 各項で名前入力が求められた場合、ここで定義する名前を入力するとよい
AWSアカウントID: 211xxxxxxxxx (x=伏字)
IAMユーザ: rx72n-envision-kit
S3バケット: rx72n-envision-kit
OTAサービスロール: rx72n-envision-kit-ota
OTAサービスロースIAMアクセスポリシー: rx72n-envision-kit-ota-iam
OTAサービスロースS3バケットアクセスポリシー: rx72n-envision-kit-ota-s3
OTAユーザーポリシー: rx72n-envision-kit-ota-user-policy
IAMユーザコード署名オペレーションアクセスポリシー:rx72n-envision-kit-iam-code-signer

AWSアカウントIDの調べ方

  • IAMコンソール にて画面左下に表示されている数列がAWSアカウントID

FreeRTOS 無線による更新 の各前提条件

OTAによるファームアップデート手順

  • ルネサスの Amazon FreeRTOS wikiのOTA解説ページの実機動作確認方法 の「手順まとめ」を参照
    • 注意事項
      • RX65N RSK は RX72N Envision Kit、RX65NはRX72Nに読み替える
      • user_application は aws_demos に読み替える
      • 手順5のブートローダ用公開鍵はRX72N Envision Kitではすでにソースコードに埋め込み済み
      • 手順3の各種パラメータおよび、手順6のアプリケーション用公開鍵はRX72N Envision KitではUART経由で入力必要
      • UART経由で入力した各種パラメータはデータフラッシュに保持され、RX72N Envision Kitの電源がOFFになっても消えることはない
      • また、ファームウェアアップデートしても前の状態が維持されるため、コンパイルする毎に調整する必要がない
  • 各種パラメータ入力はCN8のUSBコネクタから実施可能
  • 動作確認時はOTAの進行状況(Amazon FreeRTOSのログ)はCN6(PMOD)のUSBコネクタから出力される

手順3の各種パラメータおよび、手順6のアプリケーション用公開鍵入力方法

  • ルネサスの Amazon FreeRTOS wikiのOTA解説ページの実機動作確認方法 の「手順まとめ」の手順19まで進める(手順3と手順6のソースコード書き換えは無視)
  • Tera Term で CN8と通信できることを確認 (デフォルト状態だとブートローダのログの後に「RX72N Envision Kit」とプロンプトが出て入力状態となる)

クライアント秘密鍵の入力

  • dataflash write aws clientprivatekeyと入力し、エンターキー
  • 入力待ちとなる
  • クライアント秘密鍵を入力: AWS IoT Core が生成したクライアント秘密鍵(3axxxxxxxx-private.pem.key)をテキストエディタで開きTera Termにコピー&ペースト
    • 注意: 改行コードは "LF" のみである
  • stored data into dataflash correctly. と表示されればOK
$ RX72N Envision Kit
$ dataflash write aws clientprivatekey
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAzhY82YODydQYFH/yFZONXFYMNJ86US+Ph+snfsinjFFU3kOp
 :
 : (省略)
 :
5M9Nxhh8FDzNJibzbLSZQHJNgEu9nufrOkLLxv/84heYH/W/Ako=
-----END RSA PRIVATE KEY-----
stored data into dataflash correctly.

クライアント証明書の入力

  • dataflash write aws clientcertificateと入力し、エンターキー
  • 入力待ちとなる
  • クライアント証明書を入力: AWS IoT Core が生成したクライアント証明書(3axxxxxxxx-certificate.pem.crt)をテキストエディタで開きTera Termにコピー&ペースト
    • 注意: 改行コードは "LF" のみである
  • stored data into dataflash correctly. と表示されればOK
RX72N Envision Kit
$ dataflash write aws clientcertificate
-----BEGIN CERTIFICATE-----
MIIDWTCCAkGgAwIBAgIUWNAUkpzF4GO909IxarCG1nLaXO8wDQYJKoZIhvcNAQEL
 :
 : (省略)
 :
UB2bnt0RxcqXtoihQ2KgWWWW699CWKt4EyPoCgxuQ04P4pzlmF60BbESpUfm
-----END CERTIFICATE-----
stored data into dataflash correctly.

コード検証用公開鍵の証明書の入力

  • dataflash write aws codesignercertificateと入力し、エンターキー
  • 入力待ちとなる
  • コード検証用公開鍵の証明書を入力: RX72N Envision Kitのサンプル鍵束にある(secp256r1.crt)をテキストエディタで開きTera Termにコピー&ペースト
    • 注意: 改行コードは "LF" のみである
  • stored data into dataflash correctly. と表示されればOK
$ dataflash write aws codesignercertificate
-----BEGIN CERTIFICATE-----
MIICYDCCAgYCCQDqyS1m4rjviTAKBggqhkjOPQQDAjCBtzELMAkGA1UEBhMCSlAx
 :
 : (省略)
 :
gQIhAO75WVGyGt58QCGNx3wMcbaDgJ4Xpqj0SWTWdxdz0jh1
-----END CERTIFICATE-----
stored data into dataflash correctly.

IoTエンドポイントの入力

  • dataflash write aws mqttbrokerendpoint <mqtt_broker_endpoint> と入力し、エンターキー
  • <mqtt_broker_endpoint> は以下で確認可能
  • stored data into dataflash correctly. と表示されればOK
$ dataflash write aws mqttbrokerendpoint a25xxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com
stored data into dataflash correctly.

「モノ」の名前の入力

  • dataflash write aws iotthingname <iot_thing_name> と入力し、エンターキー
  • <iot_thing_name> は以下で作成した「モノ」の名前
  • stored data into dataflash correctly. と表示されればOK
$ dataflash write aws iotthingname rx72n_envision_kit
stored data into dataflash correctly.

正しく各パラメータが書き込めているか確認する

  • dataflash read コマンドで書き込み済みのパラメータを全表示する
$ dataflash read
label = timezone
data = UTC
data_length(includes string terminator 1byte zero) = 4

label = client_private_key
data = -----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAzhY82YODydQYFH/yFZONXFYMNJ86US+Ph+snfsinjFFU3kOp
QlfU4WyV+Hz15qsHbxEIv/BS4NvgKZdFpfysLdoWJDPKgOqjbJ8Z//5DZP9SRzVi
CQhKO8bAP2XonB8Vx0JfpzHHwKfPspI/1xbCb1ritjboTn4vmZ1jdQE+h8MFhKJQ
 :(以下略)

データフラッシュに保持したパラメータが異常になった場合は以下コマンドで全削除可能

$ dataflash erase
completed erasing all flash.

注意事項

  • データフラッシュに保持されている「クライアント証明書」「クライアント秘密鍵」は、ユーザ認証における「ID」「パスワード」に相当する
  • 本システムにおいては「クライアント証明書」「クライアント秘密鍵」が平文のままデータフラッシュに配置されており、dataflash readコマンドで容易く外部から読み出せてしまう
  • アタッカがこれを悪用すると、当該AWSアカウントに不正ログインされ、大量に通信が発生した場合、当該AWSアカウントに大量の課金請求が届く可能性がある
  • 従ってデモセット等に組み込んで展示会などに配置する場合、dataflash readコマンドは機能削除した方がよい
  • また量産製品に搭載する場合、メモリプロテクトをかけることを推奨
    • さもないと、市場に出回っている製品からマイコンを剥がし、ROMライタにセットしROMライタからデータフラッシュを直接読み出すことも可能
  • メモリプロテクトがかかっていても専用機材を用いて物理的にメモリ内容を読み出すアタッカも存在するかもしれない
  • 従って、特に「クライアント秘密鍵」においてはRXファミリ内蔵のTrusted Secure IPを用いて暗号化した状態でデータフラッシュに保存することが望ましい