71 lines
1.9 KiB
JavaScript
71 lines
1.9 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Obtaining Amazon SES SMTP credentials by converting existing AWS credentials
|
|
*
|
|
* 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();
|
|
} |