選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

使用 X.509 用戶端憑證進行自訂身分驗證

焦點模式
使用 X.509 用戶端憑證進行自訂身分驗證 - AWS IoT Core

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將裝置連線至 時 AWS IoT Core,您有多個可用的身分驗證類型。您可以使用 X.509 用戶端憑證來驗證用戶端和裝置連線,或定義自訂授權方來管理自己的用戶端身分驗證和授權邏輯。本主題說明如何搭配 X.509 用戶端憑證使用自訂身分驗證。

如果您已經使用 X.509 憑證對裝置進行身分驗證,並想要執行其他驗證和自訂授權,則使用自訂身分驗證搭配 X.509 憑證可能會有所幫助。例如,如果您在 X.509 用戶端憑證中存放裝置的資料,例如其序號,在 AWS IoT Core 驗證 X.509 用戶端憑證之後,您可以使用自訂授權方,根據憑證的 CommonName 欄位存放的資訊來識別特定裝置。將裝置連接到 時,搭配 X.509 憑證使用自訂身分驗證可增強您的裝置安全管理, AWS IoT Core 並提供管理身分驗證和授權邏輯的更多彈性。 AWS IoT Core 支援搭配 X.509 憑證的自訂身分驗證,以及搭配 MQTT 通訊協定和 HTTPS 通訊協定使用的自訂授權方身分驗證類型。如需裝置端點支援的身分驗證類型和應用程式通訊協定 AWS IoT Core 的詳細資訊,請參閱裝置通訊協定

注意

AWS GovCloud (US) 區域不支援使用 X.509 用戶端憑證進行自訂身分驗證。

重要

您必須使用使用網域組態建立的端點。此外,用戶端在連線至 時必須提供伺服器名稱指示 (SNI) 延伸 AWS IoT Core。

步驟 1:向 註冊您的 X.509 用戶端憑證 AWS IoT Core

如果您尚未這樣做,請註冊並啟用您的 X.509 用戶端憑證。 AWS IoT Core否則,跳至下一步。

若要使用 註冊和啟用您的用戶端憑證 AWS IoT Core,請遵循下列步驟:

  1. 如果您直接使用 建立用戶端憑證 AWS IoT。這些用戶端憑證會自動向 註冊 AWS IoT Core。

  2. 如果您建立自己的用戶端憑證,請遵循這些指示來註冊憑證 AWS IoT Core

  3. 若要啟用您的用戶端憑證,請遵循這些指示

步驟 2:建立 Lambda 函數

AWS IoT Core 使用自訂授權方來實作自訂身分驗證和授權方案。自訂授權方與 Lambda 函數相關聯,該函數會判斷裝置是否經過身分驗證,以及允許裝置執行哪些操作。當裝置連線至 時 AWS IoT Core, 會 AWS IoT Core 擷取授權方詳細資訊,包括授權方名稱和相關聯的 Lambda 函數,並叫用 Lambda 函數。Lambda 函數會收到事件,其中包含具有裝置 X.509 用戶端憑證資料的 JSON 物件。您的 Lambda 函數使用此事件 JSON 物件來評估身分驗證請求、決定要採取的動作,以及傳送回應。

Lambda 函數事件範例

下列範例 JSON 物件包含所有可以包含的欄位。實際 JSON 物件只會包含與特定連線請求相關的欄位。

{ "token": "aToken", "signatureVerified": true, "protocols": [ "tls", "mqtt" ], "protocolData": { "tls": { "serverName": "serverName", "x509CertificatePem": "x509CertificatePem", "principalId": "principalId" }, "mqtt": { "clientId": "myClientId", "username": "myUserName", "password": "myPassword" } }, "connectionMetadata": { "id": "UUID" } }
signatureVerified

布林值,指出在呼叫授權方的 Lambda 函數之前,是否驗證授權方中設定的字符簽章。如果授權方設定為停用權杖簽署,則此欄位將為 false。

protocols

包含請求預期通訊協定的陣列。

protocolData

物件,其中包含連線中使用的通訊協定資訊。它提供通訊協定特定的詳細資訊,可用於身分驗證、授權等。

tls - 此物件會保留與 TLS (Transport Layer Security) 通訊協定相關的資訊。

  • serverName - 伺服器名稱指示 (SNI) 主機名稱字串。 AWS IoT Core 要求裝置將 SNI 延伸模組傳送至 Transport Layer Security (TLS) 通訊協定,並在 host_name 欄位中提供完整的端點地址。

  • x509CertificatePem - PEM 格式的 X.509 憑證,用於 TLS 連線中的用戶端身分驗證。

  • principalId - 與 TLS 連線中的用戶端相關聯的主體識別符。

mqtt - 此物件會保留 MQTT 通訊協定的相關資訊。

  • clientId - 只有在裝置傳送此值時,才需要包含字串。

  • username - MQTT Connect 封包中提供的使用者名稱。

  • password - MQTT Connect 封包中提供的密碼。

connectionMetadata

連線的中繼資料。

id - 用於記錄和故障診斷的連線 ID。

注意

在此情況下,JSON 物件 x509CertificatePemprincipalId是請求中的兩個新欄位。的值principalId與 的值相同certificateId。如需詳細資訊,請參閱憑證

Lambda 函數回應範例

Lambda 函數應使用事件 JSON 物件的資訊來驗證傳入連線,並決定連線中允許的動作。

下列 JSON 物件包含 Lambda 函數可以傳送的範例回應。

{ "isAuthenticated": true, "principalId": "xxxxxxxx", "disconnectAfterInSeconds": 86400, "refreshAfterInSeconds": 300, "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting" } ] } ] }

在此範例中,此函數應傳送包含下列值的回應。

isAuthenticated

布林值,指出請求是否已驗證。

principalId

英數字串,可做為自訂授權請求所傳送字符的識別符。值必須是英數字串,其中至少包含一個字元,且不得超過 128 個字元。它會識別日誌中的連線。的值principalId必須與事件 JSON 物件principalId中的 值相同 (即 X.509 憑證的 certificateId)。

policyDocuments

JSON 格式 AWS IoT Core 政策文件的清單。此值為選用,並支援物件政策變數憑證政策變數。政策文件的數量上限為 10。每份政策文件最多可包含 2,048 個字元。如果您將多個政策連接到用戶端憑證和 Lambda 函數,則許可是所有政策的集合。如需建立 AWS IoT Core 政策的詳細資訊,請參閱政策

disconnectAfterInSeconds

整數,指定與 AWS IoT Core 閘道連線的最長持續時間 (以秒為單位)。最小值為 300 秒,最大值為 86,400 秒。 disconnectAfterInSeconds適用於連線的生命週期,不會在連續政策重新整理時重新整理。

refreshAfterInSeconds

指定政策重新整理之間間隔的整數。當此間隔通過時, 會 AWS IoT Core 叫用 Lambda 函數以允許政策重新整理。最小值為 300 秒,最大值為 86,400 秒。

Lambda 函數範例

以下是 Node.js Lambda 函數的範例。函數會檢查用戶端的 X.509 憑證,並擷取相關資訊,例如序號、指紋和主體名稱。如果擷取的資訊符合預期值,則會授予用戶端連線的存取權。此機制可確保只有具有有效憑證的授權用戶端才能建立連線。

const crypto = require('crypto'); exports.handler = async (event) => { // Extract the certificate PEM from the event const certPem = event.protocolData.tls.x509CertificatePem; // Parse the certificate using Node's crypto module const cert = new crypto.X509Certificate(certPem); var effect = "Deny"; // Allow permissions only for a particular certificate serial, fingerprint, and subject if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint && cert.subject === "allow.example.com") { effect = "Allow"; } return generateAuthResponse(event.protocolData.tls.principalId, effect); }; // Helper function to generate the authorization response. function generateAuthResponse(principalId, effect) { const authResponse = { isAuthenticated: true, principalId, disconnectAfterInSeconds: 3600, refreshAfterInSeconds: 300, policyDocuments: [ { Version: "2012-10-17", Statement: [ { Action: ["iot:Connect"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:client/myClientName" ] }, { Action: ["iot:Publish"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" ] }, { Action: ["iot:Subscribe"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName" ] }, { Action: ["iot:Receive"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" ] } ] } ] }; return authResponse; }

上述 Lambda 函數在收到具有預期序列、指紋和主體的憑證時,會傳回下列 JSON。的值x509CertificatePem將是 TLS 交握中提供的用戶端憑證。如需詳細資訊,請參閱定義 Lambda 函數

{ "isAuthenticated": true, "principalId": "principalId in the event JSON object", "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Connect", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName" }, { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" }, { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName" }, { "Action": "iot:Receive", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" } ] } ], "disconnectAfterInSeconds": 3600, "refreshAfterInSeconds": 300 }

步驟 3:建立自訂授權方

定義 Lambda 函數之後,請建立自訂授權方來管理您自己的用戶端身分驗證和授權邏輯。您可以遵循步驟 3:建立客戶授權方資源及其授權中的詳細說明。如需詳細資訊,請參閱建立授權方

在建立自訂授權方的過程中,您必須授予 AWS IoT 許可,以在 Lambda 函數建立後叫用該函數。如需詳細說明,請參閱授權 AWS IoT 叫用 Lambda 函數

步驟 4:在網域組態中設定身分驗證類型和應用程式通訊協定

若要使用自訂身分驗證搭配 X.509 用戶端憑證來驗證裝置,您必須在網域組態中設定身分驗證類型和應用程式通訊協定,而且必須傳送 SNI 延伸。的值authenticationType必須是 CUSTOM_AUTH_X509,而 的值applicationProtocol可以是 SECURE_MQTTHTTPS

在網域組態 (CLI) 中設定身分驗證類型和應用程式通訊協定

如果您沒有網域組態,請使用 create-domain-configuration命令來建立一個。的值authenticationType必須是 CUSTOM_AUTH_X509,而 的值applicationProtocol可以是 SECURE_MQTTHTTPS

aws iot create-domain-configuration \ --domain-configuration-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'

如果您已有網域組態,applicationProtocol請視需要使用update-domain-configuration命令更新authenticationType和 。請注意,您無法變更預設端點 () 上的身分驗證類型或通訊協定iot:Data-ATS

aws iot update-domain-configuration \ --domain-configuration-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'
domain-configuration-name

網域組態的名稱。

authentication-type

網域組態的身分驗證類型。如需詳細資訊,請參閱選擇身分驗證類型

application-protocol

裝置用來與之通訊的應用程式通訊協定 AWS IoT Core。如需詳細資訊,請參閱選擇應用程式通訊協定

--authorizer-config

指定網域組態中授權方組態的物件。

defaultAuthorizerName

網域組態的授權方名稱。

如需詳細資訊,請參閱 AWS IoT API 參考中的 CreateDomainConfigurationUpdateDomainConfiguration。如需網域組態的詳細資訊,請參閱網域組態

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。