Error: Invalid signature or credentials (Amazon SES)
AWS could not match the request to your access key. The Access Key ID or Secret Access Key is wrong, inactive, or the server clock is off.
This article is for sites using the Amazon SES mailer where a send fails because AWS rejected the access key or the request signature.
The error as you see it
SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided.
or InvalidClientTokenId: The security token included in the request is invalid.
Shown by the Amazon SES mailer, in the failed-send banner, in Tools → Debug Events and in the Email Log.
What this error means
Every request the plugin sends to SES is signed with your Secret Access Key and labelled with your Access Key ID (AWS calls this Signature Version 4). AWS repeats the calculation on its side. The two messages above mean:
- InvalidClientTokenId — AWS does not know the Access Key ID. It is mistyped, deleted, inactive, or from another AWS partition.
- SignatureDoesNotMatch — AWS knows the key, but the signature does not match. The secret is wrong, or the request time is off.
Neither has anything to do with your domain or recipients.
Common causes
- The Secret Access Key was copied with a missing character or an extra space.
- The Access Key ID and secret come from different keys, for example after creating a second key.
- The access key was deactivated or deleted in IAM.
- The server clock is wrong. Signed requests include the time, and AWS refuses requests that are too far from its own clock.
- The key belongs to a different AWS partition, such as AWS GovCloud or the China regions, while the Region is a standard one.
How to fix
- Check the server clock
In WordPress, Settings → General shows "Universal time". If it differs from real UTC time by more than a minute or two, ask your host to turn on clock synchronisation (NTP). If this was the cause, you can stop here and test.
- Open the IAM user
Sign in to
https://console.aws.amazon.com/iam/, go to Users, open the user the site uses, and choose the Security credentials tab. - Check the access key
Under Access keys, find the key whose ID matches the plugin's Access Key ID. Its status must be Active.
- Create a new key if unsure
The secret cannot be shown again after creation. If you do not have it, choose Create access key, pick the use case for an application running outside AWS, and copy both the Access key ID and the Secret access key.
- Check permissions
Under Permissions, the user needs
ses:SendRawEmail(or the AmazonSESFullAccess policy). A missing permission gives an access denied error, but check it while you are here. - Update CRM-NG SMTP
In CRM-NG SMTP → Settings → General, with Amazon SES selected, paste the Access Key ID, use Remove Secret Key, paste the new Secret Access Key, check Region, and press Save Settings.
- Retire the old key
Back in IAM, deactivate and then delete any key the site no longer uses.
- Send a test
Go to CRM-NG SMTP → Tools → Email Test, fill in Send To and press Send Email.
Verify it worked
The test page shows "Test email sent successfully! Check your inbox to confirm delivery." In IAM, the key's Last used column updates to today.
Notes
- Give the site its own IAM user with only the SES send permission. Never use the AWS root account's keys.
- If you set the keys with
CRMNG_SMTP_*constants inwp-config.php, change them there; the settings page cannot override constants.
