¿Cómo puedo solucionar los errores de incompatibilidad de firmas al realizar solicitudes firmadas por SigV4 con autenticación IAM para API Gateway?

Última actualización: 22/09/2022

La solicitud firmada de Signature Version 4 (SigV4) para Amazon API Gateway ha fallado con una respuesta 403 y un error similar al siguiente:

“La firma de la solicitud que calculamos no coincide con la firma que ha proporcionado. Compruebe la clave de acceso secreta de AWS y el método de firma.”

¿Cómo puedo solucionar este problema?

Descripción corta

Los puntos de conexión de API Gateway que utilizan la autenticación de AWS Identity and Access Management (IAM) podrían devolver errores 403 si:

  • La solicitud de la API no está firmada y la solicitud de la API utiliza la autenticación IAM.
  • Las credenciales de IAM utilizadas para firmar la solicitud son incorrectas o no tienen permisos para invocar la API.
  • La firma de la solicitud de API firmada no coincide con la firma del punto de conexión de API Gateway.
  • El encabezado de la solicitud de la API es incorrecto.

Resolución

Autenticación IAM

Asegúrese de que la solicitud de la API que utiliza la autenticación IAM está firmada con SigV4. Si la solicitud de API no está firmada, es posible que reciba el siguiente error: “Missing Authentication Token” (Falta el token de autenticación)

Credenciales IAM

Compruebe que las credenciales de autenticación de la clave de acceso y la clave secreta son correctas. En caso de que la clave de acceso sea incorrecta, es posible que reciba el siguiente error “The security token included in the request is invalid” (El token de seguridad incluido en la solicitud no es válido).

Asegúrese de que la entidad IAM utilizada para firmar la solicitud tiene permisos execute-api:Invoke. Si la entidad IAM no tiene permisos execute-api:Invoke, entonces es posible que reciba el siguiente error “User: arn:aws:iam::xxxxxxxxxxxx:user/username is not authorized to perform: execute-api:Invoke on resource” (El usuario: arn:aws:iam::xxxxxxxxxxxx:usuario/nombre de usuario no está autorizado a realizar: execute-api:Invoke on resource)

Incompatibilidad de firmas

Si la clave de acceso secreta es incorrecta, es posible que reciba el siguiente error “The request signature we calculated does not match the signature you provided” (La firma de la solicitud que hemos calculado no coincide con la firma que ha proporcionado).

La clave de acceso secreta debe coincidir con el ID de clave de acceso del parámetro Credencial. Para ver las instrucciones, consulte la sección Enviar una solicitud para probar la configuración de autenticación en ¿Cómo puedo activar la autenticación de IAM para las API de REST de API Gateway?

Asegúrese de haber seguido las instrucciones para el proceso de firma de SigV4. Si alguno de los valores del cálculo de la firma es incorrecto, es posible que reciba el siguiente error “The request signature we calculated does not match the signature you provided” (La firma de la solicitud que hemos calculado no coincide con la firma que ha proporcionado).

Cuando la API Gateway recibe una solicitud firmada, vuelve a calcular la firma. En caso de que haya diferencias en los valores, la API Gateway obtiene una firma diferente. Compare la solicitud canónica y la cadena de su solicitud firmada con el valor del mensaje de error. Modifica el proceso de firma si hay diferencias.

Ejemplo de solicitud canónica:

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-data are required headers for all signed request                       
x-amz-date:20220806T024003Z                              

content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- hash of the payload

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 el encabezado de la API gateway, solo son necesarios los encabezados host y x-amz-date.

Encabezado de solicitud de la API

Asegúrese de que el encabezado de autorización SigV4 incluye una clave de credencial correcta similar a la siguiente:

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

En caso de que la clave de credencial falte o sea incorrecta, es posible que reciba el siguiente error: “Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter” (El encabezado de autorización requiere el parámetro “Credencial”. El encabezado de autorización requiere el parámetro “Firma”).

Asegúrese de que la solicitud de autorización SigV4 también incluya la fecha de la solicitud mediante HTTP Date o el encabezado x-amz-date.

Para obtener más información, consulte Solución de errores de firma de claves y Solución de errores de AWS Signature Version 4.