Upgrade to Pro — share decks privately, control downloads, hide ads and more …

セキュアエレメントとIoTデバイスセキュリティ

 セキュアエレメントとIoTデバイスセキュリティ

Kentaro Mitsuyasu

May 07, 2022
Tweet

More Decks by Kentaro Mitsuyasu

Other Decks in Technology

Transcript

  1. IoTセキュリティの潮流 証明書、各クラウドベンダーの接続方法 代表的なAWS IoT,Azure IoTともにX509証明書による接続 クラウド側からデバイスの証明書と秘密鍵をダウンロードし、 デバイスに格納、接続時に使用する。 デバイス側は悪意のあるものに渡った時に秘密鍵を守れない。 それを守る方法として Hardware

    Root-of-Trustという仕組みで 秘密鍵を守ることが望ましい。 参考資料: IoT開発におけるセキュリティ設計の手引き 独立行政法人情報処理推進機構 https://www.ipa.go.jp/security/iot/iotguide.html 対応している仕組み: Arm Trustzoneとしてチップ内部に融合 セキュアエレメントとしての専用チップ
  2. セキュアエレメント比較 ATECC608A SE050(C) Optiga Trust X メーカー Microchip NXP Infineon

    インターフェース I2C 暗号演算 楕円暗号(ECC) 楕円暗号(ECC)、RSA 楕円暗号(ECC) 楕円暗号 NIST P-256 ECC NIST (192 to 521 bit) Brainpool (160 to 512 bit) Twisted Edwards Ed25519 Montgomery Curve25519 Koblitz (192 to 256 bit) Barreto-Naehrig Curve 256 bit NIST P-256, P-384 RSA暗号 - up to 4096 bit - 共通鍵暗号 AES-128 AES 128, 192 and 256 bit and DES keys with single DES, 2K3DES and 3K3DES AES-128 ハッシュ SHA-256 SHA-224/256/384/512 SHA-256 記憶領域 1.1KB 50KB 10KB 価格(1個当たり) 87円 476円 244円 パッケージ 8pin SOIC,DFN 20pin QFN 10pin DFN 製品ファミリ 限定機能のみの ATECC108Aなど 限定機能のみのSE050(A)、SE050(B) 温度環境対応品 採用実績 Google Coral SoM,Arduino MKR Wifi Amazon Dash Button 2nd gen.(ATECC108A) ZYMBIT security module NervesKey for NervesHub Adafruit ATECC608 Breakout Coldcard Bitcoin hardware wallet etc. ー ー 対応規格 ー Security certification CC EAL6+ (HW+JCOP) JavaCard version 3.0.5 GlobalPlatform specification version GP 3.0 Security certification CC EAL6+
  3. セキュアエレメントのセットアップ ▪上からATECC608A,Optiga Trust X,SE050 それぞれ面実装パッケージのため、変換基盤へ はんだ付け。 基本は3.3VとGND、I2C SCL,SDAを接続させて 通信するが、 Optiga

    Trust XはRSTピンのGPIO制御、 SE050はPin15 VOUT をPin18 VCCへの接続が 必要。 ホストはESP32-DevKitC I2Cは100kHzでピン21,22へ接続 ▪開発環境 VSCode+platformio ESP-IDF 3.30
  4. セキュアエレメントのセットアップ ▪デバイスの認識: まずESP32からI2CScanner(arduinoのサンプルプログラム)を実行し、 I2Cバス上にデバイスが見つけられるかテスト。 ATECC608A: Scanning... device found on I2C

    port 0 at address 0x60 ! done SE050: Scanning... device found on I2C port 0 at address 0x48 ! done Optiga Trust XはI2CScannerではデバイスが見つからない。 メーカーライブラリでパスするかどうかを確認する。 https://github.com/Infineon/arduino-optiga-trust-x/blob/master/examples/selfTest/selfTest.ino
  5. サーバー・クライアント認証、 TLS通信暗号化 ▪ホームIoTゲートウェイの作成 機能: • BME280による気温、湿度、気圧の測定 • 赤外線LEDによるリモートコントロール • ボタンによるプッシュ動作送信

    • MQTTメッセージによるLED点灯 • Wifiプロビジョニングモード • OTA機能搭載 • デバイス証明書ローリング対応 仕様: • USB5V電源で動作 • MQTTSにてMosquittoへ接続
  6. 動作フローチャート MQTT イベントハンドラ GPIOボタン イベントハンドラ Wifi接続 Wifiプロビジョニング開始 ATECC608AへWifi SSID,Pass書き込み サーバー接続、

    MQTTイベントハンドラ起動 再起動 リモコン(RMT)BME280初期化 GPIOボタン が押された 自分のシリアル宛 のメッセージ サブスクライブ タスクフラグを確認 BME280 測定しパブリッシュ、 ウェイト ボタン押下をパブリッシュ LED点灯、消灯 エアコン操作 (RMTタスク生成) OTAフラグ キーローリングフラグ 証明書受領フラグ I2Cバス初期化 ATECC608A初期化 ATECC608AからWifi SSID,Pass読み取り GPIO初期化 GPIOボタンが押されているか MQTT停止→公開鍵生成→ MQTT再開とパブリッシュ MQTT停止→ATECC608A 証明書更新→MQTT再開 MQTT接続終了→OTAサーバーへ https接続、ファームダウンロード+ インストール 再起動 キーローリング 証明書受領 OTA # Espressif ESP32 Partition Table # Name Type SubType Offset Size nvs data nvs 0x9000 0x4000 otadata data ota 0xd000 0x2000 phy_init data phy 0xf000 0x1000 factory 0 00x10000 1M ota_0 0ota_0 0x110000 1M ota_1 0ota_1 0x210000 1M
  7. プロビジョニング シリアルコンソールを経由してpem(base64)の 公開鍵と証明書を交換。 -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQasdaghadJKNIWfEtPt61Y6O8NoQVhkrQhrracCRmGgb kinXThlKUkdB0i7uUakzcSIdonsgpdzagdPNIDW8SkGUmGz8jcDSJM2PsouJ9tA== -----END PUBLIC

    KEY----- -----BEGIN CERTIFICATE----- MIIBizCCATKgAwIBAgIQXttAp9UKPvc3FMEUZoYdrjAKBggqhkjOPQQDAjAuMREw DwYDVQQKDAhrbXdlYm5ldDEZMBcGA1UEAwwQa213ZWJuZXQgUm9vdCBDQTAeFw0x OTEwMTAyMTA4MzlaFw00NDEwMTAyMTA4MzlaMC4xETAPBgNVBAoMCGttd2VibmV0 OQIHOFEROLFKFJiiphpiwgeknvspdisbpdwnepIHPIEgwkEwYHKoZIzj0CAQYIKoZIzj0D AQcDQgAEtPt61Y6O8NoQVhkIIPDSUGpou998HHIDPGwEjolKUkdB0i7uUakzcJTUP4gB aJv+kwpghwpedkjwgpkjPKJPEHGIPEihp98887889ewwIHEWBBYEFNQOhdv0lGYauUlM NRYzPg8fVWdgMA8GyioigGipugPGERJhwGWRPihgWoewoZIzj0EAwIDRwAwRAIge3M2 ePvfCr/eCDah5c3XEC8Pto2q2WBNbSL5ZpNWH7ACIHnnFVqZ4Z6Rq3Rw76OLOzKV wXTxzegp/jDA+XDKExLA -----END CERTIFICATE-----
  8. サーバー・クライアント認証、 TLS通信暗号化 ▪証明書の構造: tbsCertificate シリアル番号 証明書発行日、有効期限 公開鍵 CN コモンネーム など…

    signatureAlgorithm ecdsa-with-SHA256(一例) signatureValue 署名データ SHA256で ハッシュ化 署名対象 CA 署名
  9. サーバー・クライアント認証、 TLS通信暗号化 ATECC608が対応できる楕円曲線暗号を選択 secp256r1 別名 prime256v1 または NIST P-256(RFC4492) 256bitの秘密鍵と256bit(X)+256bit(Y)の公開鍵で構成される。

    それぞれ、32バイト、64バイトとなる。 また、署名は256bit(r)+256bit(s)だが、ASN.1という形式で保存されており、 数バイトの変動がある。 ASN.1のヘッダー(オフセット計算)を付加して72~73ビット程度。
  10. サーバー・クライアント認証、 TLS通信暗号化 ▪デバイスの内部概要:合計約1.1KBのEEPROMメモリを持つ。 スロ ット ブロッ ク バイト ビット 名前

    説明 0-7 2 36 288 Private or Secret Key Can also be used for data. 8 13 416 3328 Data 読み取りと書き込みは、他のすべてのスロットと同じ方 法で制限されるように設定できます。このスロットが鍵 として使用されている場合は、秘密鍵または秘密鍵の格 納に不要な残りのバイトは無視されます。 9- 14 3 72 576 Public Key, Signature or Certificate このデバイスでサポートされている曲線の場合、これら のスロットは、ECDSA公開鍵のX成分とY成分、または ECDSA署名のR成分とS成分の両方を入れるのに十分な大 きさです。 15 3 72 576 Private Data, Secret Key, Signature, or Certificate これが128カウント制限使用機能(セクション限定使用 キー(スロット15のみ))をサポートする唯一のスロッ トです。この機能が必要ない場合は、スロット9~14と 同じ目的で使用できます。
  11. サーバー・クライアント認証、 TLS通信暗号化 ▪共通鍵の鍵交換による暗号化 ECDH計算 秘密鍵 公開鍵 デバイス側 公開鍵 秘密鍵 サーバー側

    秘密鍵 公開鍵 公開鍵 秘密鍵 共通鍵 共通鍵 鍵計算 鍵計算 プリマスターシークレ ットとして通信を暗号 化する共通鍵となる ATECC608が担当 MBEDTLS_ECDH_GEN_PUBLIC_ALT
  12. 中間CAの秘密鍵秘匿 ▪ラズパイ中間CA側にもATECC608Aを接続し、秘密鍵を隠す HSM(ハードウェアセキュリティモジュール)として使用する。 ラズパイ 中間CA機 ESP32+ ATECC608A 中間CA証明書 中間CA秘密鍵 CN、有効期限を

    設定し署名 デバイス証明書 デバイス秘密鍵 ATECC608A内フラッシュ ATECC608A内フラッシュ デバイスから 公開鍵を送付 デバイス証明書として ESP32に返送
  13. 中間CAの秘密鍵秘匿 ▪ラズパイのI2Cへ、ATECC608Aを接続、pythonで証明書を作成する スクリプトへATECC608Aで署名するコマンドを割り込ませる。 Python:cryptography cryptography.hazmat.backends.default_backend() •公開鍵読み込み •署名用秘密鍵読み込み x509.CertificateBuilder() •シリアル番号、証明書発行日、有効期限 •CN

    コモンネーム •サブジェクトキーID •署名者ID •Etc… Signコマンド tbsCertificate シリアル番号 証明書発行日、有効期限 公開鍵 CN コモンネーム など… signatureAlgorithm ecdsa-with-SHA256(一例) signatureValue 署名データ 中間CA秘密鍵 ATECC608A内フラッシュ デバイス証明書 SHA256ハッシュを署名