本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將裝置連線至 時 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)
使用自訂身分驗證搭配 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 (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 物件 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 物件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_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
-
網域組態的授權方名稱。
如需詳細資訊,請參閱 AWS IoT API 參考中的 CreateDomainConfiguration 和 UpdateDomainConfiguration。如需網域組態的詳細資訊,請參閱網域組態。