Saltar al contenido

¿Cómo soluciono los errores de discordancia de firmas al realizar solicitudes firmadas de SigV4 con autenticación de IAM en API Gateway?

6 minutos de lectura
0

Recibo un error 403 cuando realizo una solicitud firmada de Signature Version 4 (SigV4) a Amazon API Gateway con la autenticación de AWS Identity and Access Management (IAM).

Resolución

Los puntos de enlace de API Gateway que utilizan la autenticación de IAM devuelven errores 403 por varios motivos. Utiliza las siguientes secciones para identificar y resolver la causa en función del mensaje de error que recibas.

Confirmación de la autenticación de IAM

Confirma que la solicitud de API que utiliza la autenticación de IAM esté firmada con SigV4. Para firmar la solicitud, sigue el proceso de firma de SigV4. Si la solicitud de API no está firmada, recibirás el siguiente error:

"Missing Authentication Token."

Para resolver este error, agrega la firma que falta y vuelve a enviar la solicitud.

Verificación de las credenciales de IAM

Comprueba que la clave de acceso y la clave secreta son correctas. Para comprobar las credenciales, sigue estos pasos:

  1. Abre la consola de IAM.
  2. En el panel de navegación, selecciona Users (Usuarios).
  3. Selecciona tu usuario.
  4. Selecciona la pestaña Security credentials (Credenciales de seguridad) para revisar tus claves de acceso.

Si la clave de acceso es incorrecta, se mostrará el siguiente error:

"The security token included in the request is invalid."

Para resolver este error, confirma que la entidad de IAM utilizada para firmar la solicitud tenga los permisos execute-api:Invoke. Para añadir el permiso, adjunta una política de IAM que incluya la acción execute-api:Invoke a la entidad de IAM. Para ver ejemplos de políticas, consulta Ejemplos de políticas de IAM para los permisos de ejecución de API.

Si falta el permiso execute-api:Invoke, la solicitud falla y aparece el siguiente error:

<region><api-id>"User: arn:aws:iam::xxxxxxxxxxxx:user/username is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api::xxxxxxxxxxxx:/stage/method/path because no identity-based policy allows the execute-api:Invoke action."

Solución de la falta de coincidencia de firmas

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de errores de AWS CLI. Además, asegúrate de utilizar la versión más reciente de AWS CLI.

Si la clave de acceso secreta es incorrecta, se mostrará el siguiente error:

"The request signature we calculated does not match the signature you provided."

La clave de acceso secreta y la clave de acceso vienen en pareja. Para validar la clave de acceso secreta y la clave de acceso y aislar cualquier problema potencial durante el proceso de firma, prueba la solicitud con el comando curl.

Para un usuario de IAM, ejecuta el siguiente comando curl:

curl -v --aws-sigv4 'aws:amz:REGION:execute-api' --user 'AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY' API_Gateway_endpoint

Nota: Sustituye REGION por tu región de AWS. Sustituye AWS_ACCESS_KEY_ID por tu ID de clave de acceso de usuario de IAM. Sustituye AWS_SECRET_ACCESS_KEY por tu clave de acceso secreta de usuario de IAM. Sustituye API_Gateway_endpoint por la URL de tu punto de enlace de API Gateway.

Para un rol de IAM, primero obtén las credenciales temporales ejecutando el siguiente comando assume-role de AWS CLI:

aws sts assume-role --role-arn ROLE_ARN --role-session-name SESSION_NAME

Nota: Sustituye ROLE_ARN por el nombre de recurso de Amazon (ARN) del rol de IAM que deseas asumir. Sustituye SESSION_NAME por un nombre para identificar la sesión.

A continuación, utiliza las credenciales temporales devueltas en la acción anterior para ejecutar el siguiente comando:

curl -v --aws-sigv4 'aws:amz:REGION:execute-api' --user 'AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY' --header "x-amz-security-token: AWS_SESSION_TOKEN" API_Gateway_endpoint

Nota: Sustituye REGION por tu región de AWS. Sustituye AWS_ACCESS_KEY_ID por el ID de clave de acceso del resultado assume-role. Sustituye AWS_SECRET_ACCESS_KEY por la clave de acceso secreta del resultado assume-role. Sustituye AWS_SESSION_TOKEN por el token de sesión del resultado assume-role. Sustituye API_Gateway_endpoint por la URL de tu punto de enlace de API Gateway.

Cuando API Gateway recibe una solicitud firmada, vuelve a calcular la firma. Si el parámetro de la solicitud o la carga útil difiere de la que generó la firma original, API Gateway obtiene un resultado diferente.

Compara la solicitud canónica y la cadena para firmar obtenida en el proceso de firma con el valor devuelto en el mensaje de error. Modifica el proceso de firma si hay alguna diferencia. Para obtener orientación sobre cómo corregir el proceso de firma, consulta Solución de problemas de Signature Version 4 para solicitudes de API de AWS.

Usa el siguiente ejemplo como referencia cuando compares tu solicitud canónica con el valor devuelto en el mensaje de error:

GET                                                      -------- HTTP method
/                                                        -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path}
                                                         -------- Query string key-value pair. Leave it blank if the request doesn't have any query string
content-type:application/json                            -------- Header key-value pair. One header per line
host:0123456789.execute-api.us-east-1.amazonaws.com      -------- Host and x-amz-date are required headers for all signed requests
x-amz-date:20220806T024003Z
content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- Hash of the payload

El siguiente es un ejemplo de respuesta de error canónico:

<ErrorResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
The canonical string for this request should have been 'GET / Action=ListGroupsForUser&MaxItems=100&UserName=Test&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential
=AKIAIOSFODNN7EXAMPLE%2F20120223%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20120223T063000Z&X-Amz-SignedHeaders=host
host:iam.amazonaws.com
host
<hashed-value>'
The String-to-Sign should have been
'AWS4-HMAC-SHA256
20120223T063000Z
20120223/us-east-1/iam/aws4_request
<hashed-value>'
</Message>
  </Error>
  <RequestId>4ced6e96-5de8-11e1-aa78-a56908bdf8eb</RequestId>
</ErrorResponse>

Nota: Para los encabezados de API Gateway, solo se requieren los encabezados host y x-amz-date.

Corrección del encabezado de la solicitud de API

Confirma que el encabezado de autorización de SigV4 tenga el formato correcto. El encabezado debe tener el siguiente aspecto:

Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,
SignedHeaders=host;range;x-amz-date,
Signature=example-generated-signature

Si el formato es incorrecto o faltan parámetros, actualiza el encabezado de autorización del código de firma para incluir los siguientes parámetros:

  • Credential
  • SignedHeaders
  • Signature

Los parámetros faltantes o incorrectos producen los siguientes errores:

  • "Authorization header requires 'Credential' parameter."
  • "Authorization header requires 'Signature' parameter."
  • "Authorization header requires 'SignedHeaders' parameter."

Confirma que la solicitud de autorización de SigV4 incluya la fecha de solicitud. Para añadir la fecha, incluye el encabezado HTTP Date o el encabezado x-amz-date en tu solicitud. Para obtener más información, consulta Creación de una solicitud de API de AWS firmada. Si falta el encabezado de fecha, se mostrará el siguiente error:

"Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header."

1 comentario

This article was reviewed and updated on 2026-02-27.

EXPERTO

respondido hace 2 meses