Generar una solicitud prefirmada con la biblioteca WebSocket - AWS IoT Wireless

Generar una solicitud prefirmada con la biblioteca WebSocket

A continuación, se muestra cómo generar una solicitud prefirmada con el fin de poder usar la biblioteca WebSocket para enviar solicitudes al servicio.

Agregar una política para solicitudes de WebSocket a su rol de IAM

Si desea utilizar el protocolo WebSocket para llamar al analizador de redes, debe asociar la siguiente política al rol AWS Identity and Access Management de IAM que realiza la solicitud.

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

Crear una URL prefirmada

Cree una URL para la solicitud de WebSocket que contenga la información necesaria para configurar la comunicación entre la aplicación y el analizador de redes. Para verificar la identidad de la solicitud, el streaming de WebSocket utiliza el proceso Signature Version 4 de Amazon para firmar solicitudes. Para obtener más información acerca de Signature Version 4, consulte Firma de solicitudes de la API de AWS en la Referencia general de Amazon Web Services.

Para llamar al analizador de redes, utilice la URL de solicitud StartNetworkAnalyzerStream. La solicitud se firmará con las credenciales del rol de IAM mencionado anteriormente. La URL tiene el siguiente formato con saltos de línea agregados para facilitar la lectura.

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

Utilice los siguientes valores para los parámetros de Signature Version 4:

  • X-Amz-Algorithm: el algoritmo que está utilizando en el proceso de firma. El único valor válido es AWS4-HMAC-SHA256.

  • X-Amz-Credential: una cadena separada por barras diagonales ("/") que se forma concatenando sus componentes de ID de clave de acceso y ámbito de credenciales. El ámbito de credenciales incluye la fecha con el formato AAAAMMDD, la región de AWS, el nombre del servicio, así como una cadena de terminación (aws4_request).

  • X-Amz-Date: la fecha y hora en que se creó la firma. Genere la fecha y la hora siguiendo las instrucciones de Control de fechas en Signature Version 4 en la Referencia general de Amazon Web Services.

  • X-Amz-Expires: el tiempo en segundos que transcurre hasta que caduquen las credenciales. El valor máximo es de 300 segundos (5 minutos).

  • X-Amz-Security-Token: (opcional) un token de Signature Version 4 para credenciales temporales. Si especifica este parámetro, inclúyalo en la solicitud canónica. Para obtener más información, consulte Solicitud de credenciales de seguridad temporales en la AWSGuía del usuario de Administración de identidades y accesos.

  • X-Amz-Signature: la firma de Signature Version 4 que generó para la solicitud.

  • X-AMZ-SignedHeaders: los encabezados que se firman al crear la firma de la solicitud. El único valor válido es host.

Construya la URL de la solicitud y cree la firma de Signature Version 4

Para construir la URL de la solicitud y crear la firma de Signature Version 4, utilice los siguientes pasos. Los ejemplos están en pseudocódigo.

Cree una cadena que incluya información de su solicitud en un formato estandarizado. Esto garantiza que, cuando AWS reciba la solicitud, pueda calcular la misma firma que ha calculado en Tarea 3: Calcular la firma. Para obtener más información, consulte Creación de una solicitud canónica para Signature Version 4 en la Referencia general de Amazon Web Services.

  1. Defina variables para la solicitud en su aplicación.

    # HTTP verb method = "GET" # Service name service = "iotwireless" # Región de AWS region = "Región de 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. Cree un URI canónico (identificador uniforme de recursos). El URI canónico es la parte del URI entre el dominio y la cadena de consulta.

    canonical_uri = "/start-network-analyzer-stream"
  3. Cree los encabezados canónicos y los encabezados firmados. Tenga en cuenta la \n final en los encabezados canónicos.

    • Agregue el nombre de encabezado en minúsculas seguido de un signo de dos puntos.

    • Agregue una lista de valores separados por comas para ese encabezado. No ordene los valores de los encabezados que tienen múltiples valores.

    • Agregue una nueva línea (\n).

    canonical_headers = "host:" + host + "\n" signed_headers = "host"
  4. Haga coincidir el algoritmo con el algoritmo de hash. Debe utilizar SHA-256.

    algorithm = "AWS4-HMAC-SHA256"
  5. Cree el ámbito de credenciales, que abarca la clave derivada de la fecha, la región y el servicio para el que se realiza la solicitud.

    credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
  6. Cree la cadena de consulta canónica. Los valores de cadena de la consulta deben estar codificados en URI y ordenados por nombre.

    • Ordene los nombres de los parámetros en orden ascendente según el punto del código de caracteres. Los parámetros con nombres duplicados deben ordenarse por valor. Por ejemplo, un nombre de parámetro que comienza por la letra mayúscula F precede a un nombre de parámetro que empieza por la letra minúscula b.

    • No codifique según las normas de los URI ninguno de los caracteres no reservados definidos en la norma RFC 3986: A-Z, a-z, 0-9, guion (-), guion bajo (_), punto (. ) y tilde ( ~ ).

    • Codifique con signos de porcentaje el resto de los caracteres con %XY, donde X e Y son caracteres hexadecimales (0-9 y A-F mayúsculas). Por ejemplo, el carácter de espacio debe codificarse como %20 (no mediante el signo “+” como en algunos esquemas de codificación) y los caracteres extendidos UTF-8 deben indicarse con el formato %XY%ZA%BC.

    • Codifique dos veces los caracteres de equivalencia (=) en los valores de los parámetros.

    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. Cree un hash de la carga. Para una solicitud GET, la carga es una cadena vacía.

    payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
  8. Combine todos los elementos para crear la solicitud canónica.

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

La cadena para firmar contiene metainformación sobre su solicitud. Puede utilizar la cadena para firmar en el siguiente paso cuando calcule la firma de la solicitud. Para obtener más información, consulte Crear una cadena para firmar de Signature Version 4 en la Referencia general de Amazon Web Services.

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

Genere una clave de firma a partir de la clave de acceso secreta de AWS. Para un mayor grado de protección, la clave derivada es específica de la fecha, el servicio y la región de AWS. Utilice la clave derivada para firmar la solicitud. Para obtener más información, consulte Calcular la firma para AWS Signature Version 4 en la Referencia general de Amazon Web Services.

El código se supone que ha implementado la función GetSignatureKey para generar una clave de firma. Para obtener más información y funciones de ejemplo, consulte Ejemplos de cómo generar una clave de firma para Signature Version 4 en la Referencia general de Amazon Web Services.

La función HMAC(key, data) representa una función HMAC-SHA256 que devuelve los resultados en formato binario.

#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

Después de calcular la firma, agréguesela a la cadena de la solicitud. Para obtener más información, consulte Agregar la firma a la solicitud de la API en la Referencia general de 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

Siguientes pasos

Puede utilizar la URL de la solicitud con su biblioteca de WebSocket para realizar la solicitud al servicio y observar los mensajes. Para obtener más información, consulte Mensajes y códigos de estado de WebSocket.