本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 X.509 用戶端憑證進行自訂身分驗證
將裝置連線至 時 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 憑證和自訂授權方身分驗證類型的 X.509 憑證自訂身分驗證,此類型可同時搭配MQTT通訊協定和HTTPS通訊協定使用。如需有關裝置端點支援的身分驗證類型和應用程式通訊協定 AWS IoT Core 的詳細資訊,請參閱裝置通訊協定 。
注意
AWS GovCloud (US) 區域不支援使用 X.509 用戶端憑證的自訂身分驗證。
重要
您必須使用使用網域組態 建立的端點。此外,用戶端在連線至 時必須提供伺服器名稱指示 (SNI)
透過 X.509 用戶端憑證使用自訂身分驗證來驗證裝置的程序包括下列步驟。
步驟 1:向 註冊 X.509 用戶端憑證 AWS IoT Core
如果您尚未這樣做,請向 註冊並啟用 X.509 用戶端憑證 AWS IoT Core。否則,跳至下一步。
若要向 註冊和啟用您的用戶端憑證 AWS IoT Core,請遵循下列步驟:
-
如果您直接使用 建立用戶端憑證 AWS IoT。這些用戶端憑證會自動向 註冊 AWS IoT Core。
-
如果您建立自己的用戶端憑證 ,請依照這些指示向 註冊 AWS IoT Core。
-
若要啟用您的用戶端憑證,請遵循這些指示 。
步驟 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(傳輸層安全性) 通訊協定的相關資訊。-
serverName
- 伺服器名稱指示 (SNI)主機名稱字串。 AWS IoT Core 需要裝置將SNI延伸 項目傳送至 Transport Layer Security (TLS) 通訊協定,並在 host_name
欄位中提供完整的端點地址。 -
x509CertificatePem
- PEM 格式的 X.509 憑證,用於TLS連線中的用戶端身分驗證。 -
principalId
- 與TLS連線中的用戶端相關聯的主體識別符。
mqtt
- 此物件會保留 TLS(傳輸層安全性) 通訊協定的相關資訊。-
clientId
- 只有在裝置傳送此值的情況下,才需要包含字串。 -
username
- MQTT Connect 封包中提供的使用者名稱。 -
password
- MQTT Connect 封包中提供的密碼。
-
connectionMetadata
-
連線的中繼資料。
id
- 用於記錄和故障診斷的連線 ID。
注意
在此事件JSON物件中, x509CertificatePem
和 principalId
是請求中的兩個新欄位。的值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物件 (即 certificateId X.509 憑證)principalId
中的 值相同。 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_MQTT
或 HTTPS
。
在網域組態中設定身分驗證類型和應用程式通訊協定 (CLI)
如果您沒有網域組態,請使用 create-domain-configuration命令來建立網域組態。的值authenticationType
必須為 CUSTOM_AUTH_X509
,而 的值applicationProtocol
可以是 SECURE_MQTT
或 HTTPS
。
aws iot create-domain-configuration \ --domain-configuration-name
domainConfigurationName
\ --authentication-typeCUSTOM_AUTH_X509
\ --application-protocolSECURE_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-typeCUSTOM_AUTH_X509
\ --application-protocolSECURE_MQTT
\ --authorizer-config '{ "defaultAuthorizerName":my-custom-authorizer
}'
domain-configuration-name
-
網域組態的名稱。
authentication-type
-
網域組態的身分驗證類型。如需詳細資訊,請參閱選擇身分驗證類型 。
application-protocol
-
裝置用來與 通訊的應用程式通訊協定 AWS IoT Core。如需詳細資訊,請參閱選擇應用程式通訊協定 。
--authorizer-config
-
指定網域組態中授權方組態的物件。
defaultAuthorizerName
-
網域組態的授權方名稱。
如需詳細資訊,請參閱參考 UpdateDomainConfiguration 中的 CreateDomainConfiguration和 。 AWS IoT API 如需網域組態的詳細資訊,請參閱網域組態 。