シナリオ: mTLS証明書を使用するデジタル・ツイン・インスタンスの作成

デバイスからデータを受信する場合は、デジタル・ツイン・インスタンスで認証を使用する必要があります。このシナリオでは、証明書を使用してデバイスのデジタル・ツイン・インスタンスを認証する方法について説明します。

相互TLS (mTLS)は、クライアントとサーバーの両方が通信中に互いのアイデンティティを認証することを保証するセキュリティ・プロトコルです。サーバーのみを認証する標準のTLSとは異なり、mTLSは、クライアントとサーバーの両方に有効な証明書を提示するように要求することで、信頼の層を追加します。または、テスト環境を設定している場合は、シークレットを使用してデジタル・ツイン・インスタンスを認証できます。
  1. キーの作成
  2. 認証局を作成します。
  3. 新規プライベート・キーの生成
  4. 外部で管理される証明書の作成
  5. 証明書を使用するデジタル・ツイン・インスタンスの作成
  6. デジタル・ツインのインスタンスの詳細の取得
  7. MQTTxを使用したトピックへのサブスクライブ
  8. APEXでのデバイス・データの表示

ベストプラクティス
  • 証明書を頻繁にローテーションします。
  • 証明書の有効期間を制限します。
  • Vaultsを使用して秘密キーを格納します。
  • 接続の試行を監視および監査します。

開始する前に

必要な権限があることを確認してください。管理者は、必要なポリシーを作成してアクセス権を付与します。詳細は、証明書に必要なポリシーについては前提条件を、IoTリソースに必要なポリシーについてはInternet of Things (IoT)プラットフォームのポリシー詳細を参照してください。

証明書ポリシー

認証に証明書を使用する場合は、デジタル・ツイン・インスタンスを作成するときに、IoTドメインが証明書を読み取ることができるように、次のポリシーが必要です。

IoTユーザーは、IoTドメインの特定のコンパートメント内の証明書を読み取ります:
Allow any-user to {CERTIFICATE_BUNDLE_READ, CERTIFICATE_READ} in compartment <compartment-name> where request.principal.type = 'iotdomain'
Allow any-user to {CERTIFICATE_AUTHORITY_BUNDLE_READ, CERTIFICATE_AUTHORITY_READ} in compartment <compartment-name> where request.principal.type = 'iotdomain'
Allow any-user to {CABUNDLE_READ} in compartment <compartment-name> where request.principal.type = 'iotdomain'
IoT Vaultシークレット・ポリシー
Allow any-user to {SECRET_BUNDLE_READ, SECRET_READ} in compartment <compartment-name> where ALL {request.principal.type = 'iotdomain', target.vault.id = '<vault-OCID>'}

ステップ1: キーの作成

Oracle Cloud Infrastructure (OCI)には、ハードウェアで保護された既存の非対称暗号化キーが必要です。マスター暗号化キーがあるかどうかを確認するか、新しいキーを作成するには:

  1. 「アイデンティティとセキュリティ」に移動し、「Vault」を選択します。
  2. IoTリソースに使用するコンパートメントを選択します。
  3. キーを作成するには、「キーの作成」を選択し、マスター暗号化キーの作成の手順に従います。
  4. または、「Vaults」のリストから、使用するVaultの横にある「Actions」メニューを選択し、「View Vault Details」を選択します。
  5. 「マスター暗号化キー」を選択して、「キー」を表示します。「キー詳細の表示」を選択して「保護モード」を検索し、それがHSM (ハードウェア・セキュリティ・モジュール)であることを確認します。

ステップ2: 認証局の作成

証明書サービスを使用して、ルート認証局(CA)または下位CAを作成します。詳細は、認証局の作成を参照してください。

このタスク例では、下位CAを使用して外部で管理する秘密キーを使用して証明書を発行する方法について説明します。

従属CAを作成するには、すでにルートCAが必要です。

  1. 適切なポリシーを使用して管理者としてログインし、これらのアクションを実行します。CAを作成するには、適切なレベルのセキュリティ・アクセス権が必要です。
  2. 「認証局」リスト・ページで、「認証局の作成」を選択します。リスト・ページの検索に関するヘルプが必要な場合は、認証局のリストを参照してください。
  3. 「コンパートメント」を選択し、CAを作成するコンパートメントを選択します。
  4. 「認証局タイプ」で、「下位認証局」タイプ(他のCAを含む階層内のルートCAではないCA)を選択します。
  5. (オプション) CAの一意の表示名前を入力します。この名前を使用すると、管理目的でCAを識別できますが、CA証明書の一部として表示されません。機密情報を入力しないでください。
    ノート

    テナンシ内の2つのCAは、削除保留中のCAを含め、同じ名前を共有できません。
  6. (オプション)タグを適用するには、「タグ付けオプションの表示」を選択します。タグの詳細は、リソース・タグを参照してください。
  7. 「次へ」を選択します。
  8. 件名情報を入力します。サブジェクト情報には、少なくともCA証明書の所有者を識別するための共通名(CN)が含まれます。証明書の使用目的に応じて、サブジェクトは個人、組織、コンピュータ・エンドポイントまたはデバイスを識別します。サブジェクト情報の形式は、RFC 5280標準に準拠している必要があります。ワイルドカードを使用して、複数のドメイン名またはサブドメイン名の証明書を発行できます。
  9. 「次へ」を選択します。
  10. 「認可構成」で、CA証明書に使用する暗号化キーを含むボールトを確認または選択します。オプションで、「コンパートメントの変更」を選択して別のコンパートメントを指定します。ボールトの作成と管理の詳細は、「ボールトの管理」を参照してください。
  11. 「キー」で、使用するボールト内のキーをクリックします。証明書では非対称キーのみがサポートされるため、リストにはボールト内の非対称キーのみが含まれます。Rivest-Shamir-Adleman(RSA)キーから、2,048ビットまたは4,096ビットを選択できます。また、楕円曲線IDがNIST_P384の楕円曲線暗号デジタル署名アルゴリズム(ECDSA)キーを選択することもできます。具体的に言うと、このリストには、ハードウェア・セキュリティ・モジュール(HSM)によって保護されているこれらのタイプの非対称キーのみが含まれます。証明書では、ソフトウェア保護されたキーの使用はサポートされません。キーの作成および管理の詳細は、キーの管理を参照してください。
  12. 「署名アルゴリズム」で、キー・アルゴリズム・ファミリに応じて、次のいずれかのオプションを選択します。
    • SHA256_WITH_RSA: SHA-256ハッシュ関数を使用したRSSAキー
    • SHA384_WITH_RSA: SHA-384ハッシュ関数を使用したRSSAキー
    • SHA512_WITH_RSA: SHA-512ハッシュ関数を使用したRSSAキー
    • SHA256_WITH_ECDSA: SHA-256ハッシュ関数を使用したECDSAキー
    • SHA384_WITH_ECDSA: SHA-384ハッシュ関数を使用したECDSAキー
    • SHA512_WITH_ECDSA: SHA-512ハッシュ関数を使用したECDSAキー
  13. 「次へ」を選択します。
  14. 有効期限ルールを構成します。「証明書の最大有効期間(日数)」で、このCAによって発行された証明書を有効化できる最大日数を指定します。有効期間は90日以内にすることを強くお薦めします。
  15. 「失効構成」ページで、証明書失効リスト(CRL)を構成しない場合は、「失効のスキップ」チェック・ボックスを選択します。
  16. 「次へ」を選択します。
  17. 情報が正しいことを確認し、「認証局の作成」を選択します。証明書関連のリソースの作成には数分かかる場合があります。
  18. 認証局が正常に作成された場合は、サマリーの詳細が表示されます。

ステップ3: 新規秘密キーの生成

OpenSSLを使用して、秘密キーと証明書署名リクエスト(CSR)を作成します。

ノート

セキュリティのため、キーを非公開にし、外部でキーを共有しないように、デバイスでこのステップを実行することを検討してください。
  1. このコマンドを使用して、新しい秘密キーprivate.pemと、RSA 2048ビット暗号化を使用した証明書署名リクエストcsr.pemを生成します。この例では、パスワード保護なしで指定し、v3_req拡張子を使用する-nodesパラメータの使用方法を示します。
    openssl req -nodes -newkey rsa:2048 -keyout private.pem -out csr.pem -extensions v3_req
    ノート

    Linuxを使用している場合、デフォルトでは、OpenSSL.cnfファイルが拡張子をコメント・アウトします。たとえば、OpenSSL構成ファイルに次のようなものが表示された場合: /etc/pki/tls/openssl.cnf
     # req_extensions = v3_req # The extensions to add to a certificate request
    次に、#を削除して拡張子をコメント・アウトし、ファイルは次のようになります。
    req_extensions = v3_req  # The extensions to add to a certificate request
    OpenSSLextensions v3_reqを使用していることを確認するために、出力に次が含まれていることを確認できます。
    X509v3 extensions:
        X509v3 Basic Constraints: critical
            CA:FALSE
  2. この例は、証明書リクエストの入力フィールドと値の例を示しています。証明書レポートに組み込む情報を識別名(DN)として入力します。

    共通名を入力します。共通名は、「証明書の詳細」ページの「サブジェクト情報」タブ、ステップ8の「認証局の作成」を参照するか、証明書の詳細ページの検索方法については、「証明書のリスト」を参照してください。
    Country Name (2 letter code) []: US
    State or Province Name (full name) [Some-State]:
    Locality Name (eg, city) []:
    Organization Name (eg, company) []:
    Organizational Unit Name (eg, section) []:
    Common Name (Enter common name from the certificate details.) []:common-name
    Email Address [your@email.com]:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

ステップ4: 外部で管理される証明書の作成

証明書をインストールする予定のサーバーで証明書署名リクエスト(CSR)と秘密キーを生成してから、そのCSLをCAに送信し、証明書を発行することもできます。この場合、秘密キーは外部で管理します。

このタスクでは、外部で管理する秘密キーを持つ証明書を発行する方法について説明します。証明書を使用するその他の方法の詳細は、「外部で管理する証明書の作成」および「証明書の管理」を参照してください。
  1. コンソールで、ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」を選択します。
  2. 「証明書」リスト・ページに、特定のコンパートメントの認証局のリストが表示されます。
  3. 作業する証明書を検索し、行の最後にある「アクション」メニューを選択します。
  4. 「発行証明書」を選択します。
  5. 「証明書タイプ」で、外部のサード・パーティCAによって管理される証明書サービスのCAから証明を発行するには、「内部CAによって発行され、外部に管理」を選択します。
  6. 証明書の一意の表示名前を入力します。機密情報を入力しないでください。
    ノート

    テナンシ内の2つの証明書が同じ名前(削除保留中の証明書を含む)を共有することはできません。
  7. (オプション) 説明を入力して、証明書を識別しやすくします。機密情報を入力しないでください。
  8. サードパーティCAが管理する証明書の場合、サブジェクト情報を指定する必要はありません。かわりに、「次へ」を選択します。
  9. 「証明書署名リクエスト」で、「ファイルのアップロード」を選択して証明書の内容を指定し、「1つ選択」を選択して証明書をPEM形式のファイルとしてのアップロードします。
  10. または、「コンテンツの貼付け」を選択し、テキスト・ボックスを選択して証明書の内容を直接貼り付けます。
  11. 「次へ」を選択します。
  12. 証明書サービスで管理されない証明書の自動更新は構成できません。「次へ」を選択して続行します。
  13. サマリー情報が正しいことを確認し、「証明書の作成」を選択します。
  14. 「証明書の詳細」ページがオープンします。「バージョン」で、表示する証明書の名前を検索し、行の最後にある「アクション」メニューに移動して、「コンテンツの表示」を選択します。詳細は、証明書の詳細の表示を参照してください。
  15. 「ダウンロード」を選択し、「証明書PEM」ファイルを「保存」します。
  16. 証明書の詳細ページで、「サブジェクト情報」タブに移動し、次のステップで使用する証明書の「共通名」をコピーします。

ステップ5: 証明書を使用するデジタル・ツイン・インスタンスの作成

データを送信するデバイスを認証するには、前のステップで作成した--auth-idパラメータおよび<certificate-OCID>を使用して、デジタル・ツイン・インスタンスを作成します。

このコマンドおよびパラメータを使用して、デジタル・ツイン・インスタンスを作成します。<common-name-for-the-certificate>を置き換えます。<certificate-OCID>を環境の証明書OCIDに置き換えます。証明書の詳細でこれらの値を検索します。詳細は、証明書の詳細の表示を参照してください:

oci iot digital-twin-instance create --iot-domain-id <iot-domain-OCID> --auth-id <certificate-OCID> --external-key <common-name-from-certificate-details>

CLIパラメータの完全なリストは、oci iot digital-twin-instance createを参照し、詳細はデジタル・ツイン・インスタンスの作成を参照してください。

オプションのステップ6: デジタル・ツインのインスタンス詳細の取得

このコマンドを使用して、デジタル・ツイン・インスタンスの詳細を表示します。レスポンスには、デジタル・ツインのインスタンスOCID、認証IDおよび外部キーが含まれます。
oci iot digital-twin-instance get --digital-twin-instance-id <digital-twin-instance-OCID>
詳細は、デジタル・ツインのインスタンス詳細の取得を参照してください。

ステップ7: データの送信

シナリオに応じて、MQTTS、HTTPSまたはWebSocketを使用してデジタル・ツイン・インスタンスに接続できます。シナリオの例は、Connecting a Deviceを参照してください。

  • Curlの使用

    POSIXスタイルのシェル: このcurlコマンドは、Windowsでbash、zsh、macOS Terminal、LinuxまたはGit Bashを使用して、接続をテストするサンプル・プレーン・テキスト・メッセージを送信する場合に使用します。device-cert.pemおよびdevice-key.pemを、使用している環境のファイルへのパスに置き換えます。
    curl --cert /path/device-cert.pem --key /path/device-key.pem \
    -H "Content-Type: text/plain" \
    -d "sample data 1" \
    "https://<iot-domain-short-id>.device.iot.<region>.oci.oraclecloud.com/sampletopic"

    Windows Powershell: このcurlコマンドを使用して、device-cert.pemおよびdevice-key.pemを環境の値に置き換えます。

    curl.exe --cert /path/device-cert.pem --key /path/device-key.pem \
    -H "Content-Type: text/plain" \
    -d "sample data 1" \
    "https://<iot-domain-short-id>.device.iot.<region>.oci.oraclecloud.com/sampletopic"

    「ステップ3: デジタル・ツイン・インスタンスの作成」を完了したときに、外部キー・パラメータ値を引用符付きで定義した場合は、データの送信時に引用符を含める必要があります: "external-key"。見積りのベストプラクティスについては、Troubleshootingを参照してください。

  • 任意のMQTTクライアントを使用して、MQTTSを使用してトピックにサブスクライブします。この例では、MQTTxを使用します。

    サンプル・データを送信し、接続をテストするには:

    1. 次のように、ホストとしてデバイスホストを入力します。
      mqtts://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com
    2. ポート8883を入力します。
    3. クライアントID: your-client-ID
    4. クリーン・スタート: True
    5. トグルをオンにすると、TLSが有効になります。
    6. オプション「CAまたは自己署名証明書」を選択します。
    7. 「外部で管理される証明書の作成」のステップ15から、クライアント証明書ファイルの場所を入力します: your-certificate.pem
    8. 「新規秘密キーの生成」のステップ1から、クライアント・キー・ファイルの場所を入力します: your-private-key.pem
    9. 「接続」を選択します。

      MQTTx

      MQTTxを使用して接続します。

    10. デバイスからデータを受信するには、「新規サブスクリプション」を選択します。
    11. 「トピック」としてエンドポイントを入力します。
    12. 次の例は、Quality of Service (QoS)レベル1の/endpoints/4321トピックにパブリッシュされたメッセージを示しています。トピック:
      {
        "pulse": 300,
        "s02": 400
      }
      {
        "test": 100
      }

      MQTTxのトピックにサブスクライブします。

オプションのステップ7: APEXでのIoTデータのモニター

APEXでデータを表示するための構成済アクセス権で、デバイスからRAWデータが送信された場合は、このSQL文を使用して、APEXでデジタル・ツイン・インスタンスのRAWデータ・レスポンスを表示できます。
select * from <domain-short-id-from-device-host>__IOT.RAW_DATA
where digital_twin_instance_id = '<digital-twin-instance-ocid>'