Skip to content

Instantly share code, notes, and snippets.

@jesusgoku
Created November 15, 2022 21:19
Show Gist options
  • Save jesusgoku/533ba67ea218608c5a74a6d341d75189 to your computer and use it in GitHub Desktop.
Save jesusgoku/533ba67ea218608c5a74a6d341d75189 to your computer and use it in GitHub Desktop.
Obtaining Amazon SES SMTP credentials by converting existing AWS credentials (NodeJS version)
#!/usr/bin/env node
/**
* Obtaining Amazon SES SMTP credentials by converting existing AWS credentials
*
* @author Jesus Urrutia <[email protected]>
*
* Script based on:
* https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html
*/
const crypto = require('crypto');
const SMTP_REGIONS = [
'us-east-2', // US East (Ohio)
'us-east-1', // US East (N. Virginia)
'us-west-2', // US West (Oregon)
'ap-south-1', // Asia Pacific (Mumbai)
'ap-northeast-2', // Asia Pacific (Seoul)
'ap-southeast-1', // Asia Pacific (Singapore)
'ap-southeast-2', // Asia Pacific (Sydney)
'ap-northeast-1', // Asia Pacific (Tokyo)
'ca-central-1', // Canada (Central)
'eu-central-1', // Europe (Frankfurt)
'eu-west-1', // Europe (Ireland)
'eu-west-2', // Europe (London)
'sa-east-1', // South America (Sao Paulo)
'us-gov-west-1', // AWS GovCloud (US)
];
// These values are required to calculate the signature. Do not change them.
const DATE = '11111111';
const SERVICE = 'ses';
const MESSAGE = 'SendRawEmail';
const TERMINAL = 'aws4_request';
const VERSION = [0x04];
function sign(key, msg) {
return crypto.createHmac('sha256', key).update(msg).digest();
}
function calculate_key(secret_access_key, region) {
if (!SMTP_REGIONS.includes(region)) {
throw new Error(`The ${region} Region doesn't have an SMTP endpoint`);
}
let signature;
signature = sign(`AWS4${secret_access_key}`, DATE);
signature = sign(signature, region);
signature = sign(signature, SERVICE);
signature = sign(signature, TERMINAL);
signature = sign(signature, MESSAGE);
const signature_and_version = Buffer.concat([
Buffer.from(VERSION),
signature,
]);
const smtp_password = Buffer.from(signature_and_version).toString('base64');
return smtp_password;
}
function main() {
const [secret, region] = process.argv.slice(2);
console.log(calculate_key(secret, region));
}
if (require.main === module) {
main();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment