Gerar uma solicitação pré-assinada com a biblioteca WebSocket - AWS IoT Wireless

Gerar uma solicitação pré-assinada com a biblioteca WebSocket

A seguir, descrevemos como gerar uma solicitação pré-assinada para que seja possível utilizar a biblioteca WebSocket para enviar solicitações ao serviço.

Adicionar uma política para solicitações WebSocket ao perfil do IAM

Para usar o protocolo WebSocket para chamar o analisador de rede, anexe a política a seguir ao perfil do AWS Identity and Access Management (IAM) que faz a solicitação.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotwireless:StartNetworkAnalyzerStream", "Resource": "*" } ] }

Criar um URL pré-assinado

Crie um URL para a solicitação WebSocket que contenha as informações necessárias para configurar a comunicação entre o aplicativo e o analisador de rede. Para verificar a identidade da solicitação, o streaming WebSocket usa o processo do Amazon Signature versão 4 para assinar solicitações. Para obter mais informações sobre o Signature versão 4, consulte Assinar solicitações de API da AWS na Referência geral do Amazon Web Services.

Para chamar o analisador de rede, use o URL de solicitação StartNetworkAnalyzerStream. A solicitação será assinada usando as credenciais do perfil do IAM mencionado anteriormente. O URL tem o formato a seguir com quebras de linha adicionadas para facilitar a leitura.

GET wss://api.iotwireless.<region>.amazonaws.com/start-network-analyzer-stream?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=Signature Version 4 credential scope &X-Amz-Date=date &X-Amz-Expires=time in seconds until expiration &X-Amz-Security-Token=security-token &X-Amz-Signature=Signature Version 4 signature &X-Amz-SignedHeaders=host

Use os valores a seguir para os parâmetros de Signature versão 4:

  • X-Amz-Algorithm – O algoritmo que você está usando no processo de assinatura. O único valor válido é AWS4-HMAC-SHA256.

  • X-Amz-Credential – Uma string separada por barras ("/") formada concatenando o ID de chave de acesso e os componentes de escopo de credencial. O escopo de credencial inclui a data no formato AAAAMMDD, a Região da AWS, o nome do serviço e uma string de terminação (aws4_request).

  • X-Amz-Date – A data e a hora em que a assinatura foi criada. Gere a data e a hora seguindo as instruções em Tratamento de datas no Signature versão 4 na Referência geral do Amazon Web Services.

  • X-Amz-Expires – O tempo, em segundos, até que as credenciais expirem. O valor máximo é de 300 segundos (5 minutos).

  • X-Amz-Security-Token – (opcional) Um token do Signature versão 4 para credenciais temporárias. Se você especificar esse parâmetro, inclua-o na solicitação canônica. Para obter mais informações, consulte Solicitação de credenciais de segurança temporárias no Guia do usuário do AWS Identity and Access Management.

  • X-Amz-Signature – A assinatura do Signature versão 4 que você gerou para a solicitação.

  • X-Amz-SignedHeaders – Os cabeçalhos que são assinados ao criar a assinatura para a solicitação. O único valor válido é host.

Crie o URL da solicitação e crie a assinatura do Signature versão 4

Para criar o URL para a solicitação e criar a assinatura do Signature versão 4, siga as etapas a seguir. Os exemplos estão em pseudocódigo.

Crie uma string que inclua as informações da solicitação em um formato padronizado. Isso garante que quando a AWS receber a solicitação, ela poderá calcular a mesma assinatura que você calcular em Tarefa 3: Calcular a assinatura. Para obter mais informações, consulte Criar uma solicitação canônica para o Signature versão 4 na Referência geral do Amazon Web Services.

  1. Defina variáveis para a solicitação no seu aplicativo.

    # HTTP verb method = "GET" # Service name service = "iotwireless" # Região da AWS region = "Região da AWS" # Service streaming endpoint endpoint = "wss://api.iotwireless.region.amazonaws.com" # Host host = "api.iotwireless.<region>.amazonaws.com" # Date and time of request amz-date = YYYYMMDD'T'HHMMSS'Z' # Date without time for credential scope datestamp = YYYYMMDD
  2. Crie um URI canônico (identificador uniforme de recursos). O URI canônico é a parte do URI entre o domínio e a string de consulta.

    canonical_uri = "/start-network-analyzer-stream"
  3. Crie cabeçalhos canônicos e cabeçalhos assinados. Observe o \n que aparece no final dos cabeçalhos canônicos.

    • Anexe o nome do cabeçalho em minúscula seguido por dois pontos.

    • Anexe uma lista separada por vírgulas de valores para esse cabeçalho. Não classifique os valores em cabeçalhos que têm vários valores.

    • Anexe uma nova linha (\n).

    canonical_headers = "host:" + host + "\n" signed_headers = "host"
  4. Faça uma correspondência entre o algoritmo e o algoritmo de hash. Você deve usar SHA-256.

    algorithm = "AWS4-HMAC-SHA256"
  5. Crie o escopo da credencial, que define o escopo da chave derivada como a data, a Região e o serviço ao qual a solicitação foi feita.

    credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
  6. Crie a string de consulta canônica. Os valores de string de consulta devem ser codificados por URI e classificados por nome.

    • Classifique os nomes de parâmetro por ponto de código de caracteres em ordem ascendente. Parâmetros com nomes duplicados devem ser classificados pelo valor. Por exemplo, um nome de parâmetro que começa com a letra maiúscula F precede um nome de parâmetro que começa com uma letra minúscula b.

    • Não codifique em URI nenhum dos caracteres não reservados definidos pela RFC 3986: A–Z, a–z, 0–9, hífen ( - ), sublinhado ( _ ), ponto ( . ) e til ( ~ ).

    • Codifique em percentual todos os outros caracteres com %XY, em que X e Y são caracteres hexadecimais (de 0 a 9 e maiúsculas de A a F). Por exemplo, o caractere de espaço deve ser codificado como %20 (não usando '+', como alguns esquemas de codificação) e deve haver caracteres UTF-8 estendidos na forma %XY%ZA%BC.

    • Codifique duas vezes todos os caracteres de sinal de igual (=) em valores de parâmetro.

    canonical_querystring = "X-Amz-Algorithm=" + algorithm canonical_querystring += "&X-Amz-Credential="+ URI-encode(access key + "/" + credential_scope) canonical_querystring += "&X-Amz-Date=" + amz_date canonical_querystring += "&X-Amz-Expires=300" canonical_querystring += "&X-Amz-Security-Token=" + token canonical_querystring += "&X-Amz-SignedHeaders=" + signed_headers canonical_querystring += "&language-code=en-US&media-encoding=pcm&sample-rate=16000"
  7. Crie um hash da carga útil. Para uma solicitação GET, a carga útil é uma string vazia.

    payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
  8. Combine todos os elementos para criar a solicitação canônica.

    canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash

A string para assinar inclui metainformações sobre sua solicitação. Você usará a string para assinar na próxima etapa, quando calcular a assinatura da solicitação. Para obter mais informações, consulte Criar uma string para assinar o Signature versão 4 na Referência geral do Amazon Web Services.

string_to_sign=algorithm + "\n" + amz_date + "\n" + credential_scope + "\n" + HashSHA256(canonical_request.Encode("utf-8")).HexDigest()

Você derivará uma chave de assinatura da sua chave de acesso secreta da AWS. Para obter um grau maior de proteção, a chave derivada é específica à data, ao serviço e à Região da AWS. Você usa a chave derivada para assinar a solicitação. Para obter mais informações, consulte Calcular a assinatura do Signature versão 4 da AWS na Referência geral do Amazon Web Services.

O código pressupõe que você tenha implementado a função GetSignatureKey para gerar uma chave de assinatura. Para obter mais informações e exemplos de funções, consulte Exemplos de como derivar uma chave de assinatura do Signature versão 4 na Referência geral do Amazon Web Services.

A função HMAC(key, data) representa uma função HMAC-SHA256 que retorna os resultados em formato binário.

#Create the signing key signing_key = GetSignatureKey(secret_key, datestamp, region, service) # Sign the string_to_sign using the signing key signature = HMAC.new(signing_key, (string_to_sign).Encode("utf-8"), Sha256()).HexDigest

Depois de calcular a assinatura, adicione-a à string de consulta. Para obter mais informações, consulte Adicionar a assinatura à solicitação na Referência geral do Amazon Web Services.

#Add the authentication information to the query string canonical_querystring += "&X-Amz-Signature=" + signature # Sign the string_to_sign using the signing key request_url = endpoint + canonical_uri + "?" + canonical_querystring

Próximas etapas

Você pode usar o URL da solicitação com a biblioteca WebSocket para fazer a solicitação ao serviço e observar as mensagens. Para ter mais informações, consulte Mensagens e códigos de status do WebSocket.