As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Autenticação personalizada com certificados de cliente X.509
Ao conectar dispositivos a AWS IoT Core, você tem vários tipos de autenticação disponíveis. Você pode usar certificados de cliente X.509 que podem ser usados para autenticar conexões de clientes e dispositivos ou definir autorizadores personalizados para gerenciar sua própria lógica de autenticação e autorização de clientes. Este tópico aborda como usar a autenticação personalizada com certificados de cliente X.509.
Usar a autenticação personalizada com certificados X.509 pode ser útil se você já tiver autenticado seus dispositivos usando certificados X.509 e quiser realizar validação adicional e autorização personalizada. Por exemplo, se você armazenar os dados de seus dispositivos, como seus números de série, no certificado do cliente X.509, depois de AWS IoT Core autenticar o certificado do cliente X.509, poderá usar um autorizador personalizado para identificar dispositivos específicos com base nas informações armazenadas no campo do certificado. CommonName O uso da autenticação personalizada com certificados X.509 pode aprimorar o gerenciamento da segurança do dispositivo ao conectar dispositivos AWS IoT Core e fornecer mais flexibilidade para gerenciar a lógica de autenticação e autorização. AWS IoT Core oferece suporte à autenticação personalizada com certificados X.509 usando o certificado X.509 e o tipo de autenticação personalizada do autorizador, que funciona tanto com o protocolo quanto com o MQTTprotocolo. HTTPS Para obter mais informações sobre os tipos de autenticação e os protocolos de aplicativos compatíveis com os endpoints AWS IoT Core do dispositivo, consulte Protocolos de comunicação do dispositivo.
nota
A autenticação personalizada com certificados de cliente X.509 não é suportada nas AWS GovCloud (US) regiões.
Importante
Você deve usar um endpoint criado usando configurações de domínio. Além disso, os clientes devem fornecer a extensão Server Name Indication (SNI)
O processo para autenticar dispositivos usando autenticação personalizada com certificados de cliente X.509 consiste nas etapas a seguir.
Etapa 1: registre seus certificados de cliente X.509 com AWS IoT Core
Se você ainda não fez isso, registre e ative seus certificados de cliente X.509 com. AWS IoT Core Caso contrário, vá para a próxima etapa.
Para registrar e ativar seus certificados de cliente com AWS IoT Core, siga as etapas:
-
Se você criar certificados de cliente diretamente com AWS IoT. Esses certificados de cliente serão registrados automaticamente com AWS IoT Core.
-
Se você criar seus próprios certificados de cliente, siga estas instruções para registrá-los AWS IoT Core.
-
Para ativar seus certificados de cliente, siga estas instruções.
Etapa 2: Criar uma função do Lambda
AWS IoT Core usa autorizadores personalizados para implementar esquemas personalizados de autenticação e autorização. Um autorizador personalizado está associado a uma função Lambda que determina se um dispositivo está autenticado e quais operações o dispositivo tem permissão para realizar. Quando um dispositivo se conecta AWS IoT Core, AWS IoT Core recupera os detalhes do autorizador, incluindo o nome do autorizador e a função Lambda associada, e invoca a função Lambda. A função Lambda recebe um evento que contém um JSON objeto com os dados do certificado do cliente X.509 do dispositivo. Sua função Lambda usa esse JSON objeto de evento para avaliar a solicitação de autenticação, decidir as ações a serem tomadas e enviar uma resposta de volta.
Exemplo de evento da função Lambda
O JSON objeto de exemplo a seguir contém todos os campos possíveis que podem ser incluídos. O JSON objeto real conterá somente campos relevantes para a solicitação de conexão específica.
{ "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
-
Um valor booleano que indica se a assinatura do token configurada no autorizador foi verificada ou não antes de invocar a função Lambda do autorizador. Se o autorizador estiver configurado para desativar a assinatura do token, esse campo será falso.
protocols
-
Uma matriz que contém os protocolos esperados para a solicitação.
protocolData
-
Um objeto que contém informações dos protocolos usados na conexão. Ele fornece detalhes específicos do protocolo que podem ser úteis para autenticação, autorização e muito mais.
tls
- Este objeto contém informações relacionadas ao protocolo TLS (Transport Layer Security).-
serverName
- A string do nome do host de Indicação do Nome do Servidor (SNI). AWS IoT Core exige que os dispositivos enviem a SNIextensão para o protocolo Transport Layer Security (TLS) e forneçam o endereço completo do endpoint no host_name
campo. -
x509CertificatePem
- O certificado X.509 em PEM formato, usado para autenticação do cliente na TLS conexão. -
principalId
- O identificador principal associado ao cliente na TLS conexão.
mqtt
- Este objeto contém informações relacionadas ao protocolo TLS (Transport Layer Security).-
clientId
- Uma string só precisa ser incluída no caso de o dispositivo enviar esse valor. -
username
- O nome de usuário fornecido no pacote MQTT Connect. -
password
- A senha fornecida no pacote MQTT Connect.
-
connectionMetadata
-
Metadados da conexão.
id
- O ID da conexão, que você pode usar para registrar e solucionar problemas.
nota
Neste JSON objeto de evento, x509CertificatePem
e principalId
estão dois novos campos na solicitação. O valor de principalId
é igual ao valor decertificateId
. Para obter mais informações, consulte Certificado.
Exemplo de resposta da função Lambda
A função Lambda deve usar informações do JSON objeto de evento para autenticar a conexão de entrada e decidir quais ações são permitidas na conexão.
O JSON objeto a seguir contém um exemplo de resposta que sua função Lambda pode enviar.
{ "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" } ] } ] }
Neste exemplo, essa função deve enviar uma resposta que contenha os seguintes valores.
isAuthenticated
-
Um valor booleano que indica se a solicitação está autenticada.
principalId
-
Uma sequência alfanumérica que atua como um identificador para o token enviado pela solicitação de autorização personalizada. O valor deve ser uma sequência alfanumérica com pelo menos um e não mais que 128 caracteres. Ele identifica a conexão nos registros. O valor de
principalId
deve ser igual ao valor deprincipalId
no JSON objeto do evento (ou seja, certificateId do certificado X.509). policyDocuments
-
Uma lista de documentos JSON de AWS IoT Core política formatados. O valor é opcional e oferece suporte a variáveis de política de coisas e variáveis de política de certificados. O número máximo de documentos de política é 10. Cada documento de política pode ter, no máximo, 2.048 caracteres. Se você tiver várias políticas anexadas ao seu certificado de cliente e à função Lambda, a permissão é uma coleção de todas as políticas. Para obter mais informações sobre a criação de AWS IoT Core políticas, consulte Políticas.
disconnectAfterInSeconds
-
Um número inteiro que especifica a duração máxima (em segundos) da conexão com o AWS IoT Core gateway. O valor mínimo é 300 segundos e o valor máximo é 86.400 segundos.
disconnectAfterInSeconds
é válido durante a vida útil de uma conexão e não é atualizado em atualizações consecutivas de políticas. refreshAfterInSeconds
-
Um número inteiro que especifica o intervalo entre as atualizações da política. Quando esse intervalo passa, AWS IoT Core invoca a função Lambda para permitir atualizações de políticas. O valor mínimo é de 300 segundos e o valor máximo é de 86.400 segundos.
Exemplo de função do Lambda
Veja a seguir um exemplo da função Lambda do Node.js. A função examina o certificado X.509 do cliente e extrai informações relevantes, como número de série, impressão digital e nome do assunto. Se as informações extraídas corresponderem aos valores esperados, o cliente terá acesso para se conectar. Esse mecanismo garante que somente clientes autorizados com certificados válidos possam estabelecer uma conexão.
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; }
A função Lambda anterior retorna o JSON seguinte quando recebe um certificado com a série, a impressão digital e o assunto esperados. O valor de x509CertificatePem
será o certificado do cliente fornecido no TLS handshake. Para obter mais informações, consulte Definindo sua função 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 }
Etapa 3: criar um autorizador personalizado
Depois de definir a função Lambda, crie um autorizador personalizado para gerenciar sua própria lógica de autenticação e autorização do cliente. Você pode seguir as instruções detalhadas na Etapa 3: Criar um recurso de autorização do cliente e sua autorização. Para obter mais informações, consulte Criação de um autorizador.
No processo de criação do autorizador personalizado, você deve conceder AWS IoT permissão para invocar a função Lambda após sua criação. Para obter instruções detalhadas, consulte Autorização AWS IoT para invocar sua função Lambda.
Etapa 4: definir o tipo de autenticação e o protocolo do aplicativo em uma configuração de domínio
Para autenticar dispositivos usando autenticação personalizada com certificados de cliente X.509, você deve definir o tipo de autenticação e o protocolo do aplicativo em uma configuração de domínio e enviar a extensão. SNI O valor de authenticationType
deve ser CUSTOM_AUTH_X509
e o valor de applicationProtocol
pode ser SECURE_MQTT
ouHTTPS
.
Defina o tipo de autenticação e o protocolo do aplicativo na configuração do domínio (CLI)
Se você não tiver uma configuração de domínio, use o create-domain-configurationcomando para criar uma. O valor de authenticationType
deve ser CUSTOM_AUTH_X509
e o valor de applicationProtocol
pode ser SECURE_MQTT
ouHTTPS
.
aws iot create-domain-configuration \ --domain-configuration-name
domainConfigurationName
\ --authentication-typeCUSTOM_AUTH_X509
\ --application-protocolSECURE_MQTT
\ --authorizer-config '{ "defaultAuthorizerName":my-custom-authorizer
}'
Se você já tiver uma configuração de domínio, use o update-domain-configurationcomando update authenticationType
e, applicationProtocol
se necessário. Observe que você não pode alterar o tipo de autenticação ou o protocolo no endpoint padrão (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
-
O nome da configuração do domínio.
authentication-type
-
O tipo de autenticação da configuração do domínio. Para obter mais informações, consulte Como escolher um tipo de autenticação.
application-protocol
-
O protocolo do aplicativo que os dispositivos usam para se comunicar AWS IoT Core. Para obter mais informações, consulte Como escolher um protocolo de aplicativo.
--authorizer-config
-
Um objeto que especifica a configuração do autorizador em uma configuração de domínio.
defaultAuthorizerName
-
O nome do autorizador para uma configuração de domínio.
Para obter mais informações, consulte CreateDomainConfiguratione UpdateDomainConfigurationa partir da AWS IoT APIReferência. Para obter mais informações sobre configuração de domínio, consulte Configurações de domínio.