aws-delivlib
Version:
A fabulous library for defining continuous pipelines for building, testing and releasing code libraries.
138 lines • 17.7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = __importStar(require("fs"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const util = __importStar(require("util"));
// eslint-disable-next-line import/no-extraneous-dependencies
const client_s3_1 = require("@aws-sdk/client-s3");
// eslint-disable-next-line import/no-extraneous-dependencies
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
const cfn = __importStar(require("./_cloud-formation"));
// eslint-disable-next-line @typescript-eslint/no-require-imports
const _exec = require("./_exec");
// eslint-disable-next-line @typescript-eslint/no-require-imports
const _rmrf = require("./_rmrf");
const mkdtemp = util.promisify(fs.mkdtemp);
const readFile = util.promisify(fs.readFile);
const writeFile = util.promisify(fs.writeFile);
const secretsManager = new client_secrets_manager_1.SecretsManager();
exports.handler = cfn.customResourceHandler(handleEvent);
async function handleEvent(event, _context) {
if (event.RequestType !== cfn.RequestType.DELETE) {
cfn.validateProperties(event.ResourceProperties, {
DnCommonName: true,
DnCountry: true,
DnEmailAddress: true,
DnLocality: true,
DnOrganizationName: true,
DnOrganizationalUnitName: true,
DnStateOrProvince: true,
ExtendedKeyUsage: false,
KeyUsage: true,
PrivateKeySecretId: true,
OutputBucket: true,
});
}
switch (event.RequestType) {
case cfn.RequestType.CREATE:
case cfn.RequestType.UPDATE:
return _createSelfSignedCertificate(event);
case cfn.RequestType.DELETE:
// Nothing to do - this is not a "Physical" resource
return { Ref: event.LogicalResourceId };
}
}
async function _createSelfSignedCertificate(event) {
const tempDir = await mkdtemp(path.join(os.tmpdir(), 'x509CSR-'));
try {
const configFile = await _makeCsrConfig(event, tempDir);
const pkeyFile = await _retrievePrivateKey(event, tempDir);
const csrFile = path.join(tempDir, 'csr.pem');
await _exec('openssl', 'req', '-config', configFile, '-key', pkeyFile, '-out', csrFile, '-new');
const certFile = path.join(tempDir, 'cert.pem');
await _exec('openssl', 'x509', '-in', csrFile, '-out', certFile, '-req', '-signkey', pkeyFile, '-days', '365');
const s3 = new client_s3_1.S3();
const bucketName = event.ResourceProperties.OutputBucket;
await s3.putObject({
Bucket: bucketName,
Key: 'certificate-signing-request.pem',
Body: await readFile(csrFile, { encoding: 'utf8' }),
ContentType: 'application/x-pem-file',
});
await s3.putObject({
Bucket: bucketName,
Key: 'self-signed-certificate.pem',
Body: await readFile(certFile, { encoding: 'utf8' }),
ContentType: 'application/x-pem-file',
});
return {
Ref: event.LogicalResourceId,
CSR: `s3://${bucketName}/certificate-signing-request.pem`,
SelfSignedCertificate: `s3://${bucketName}/self-signed-certificate.pem`,
};
}
finally {
await _rmrf(tempDir);
}
}
async function _makeCsrConfig(event, dir) {
const file = path.join(dir, 'csr.config');
await writeFile(file, [
'[ req ]',
'default_md = sha256',
'distinguished_name = dn',
'prompt = no',
'req_extensions = extensions',
'string_mask = utf8only',
'utf8 = yes',
'',
'[ dn ]',
`CN = ${event.ResourceProperties.DnCommonName}`,
`C = ${event.ResourceProperties.DnCountry}`,
`ST = ${event.ResourceProperties.DnStateOrProvince}`,
`L = ${event.ResourceProperties.DnLocality}`,
`O = ${event.ResourceProperties.DnOrganizationName}`,
`OU = ${event.ResourceProperties.DnOrganizationalUnitName}`,
`emailAddress = ${event.ResourceProperties.DnEmailAddress}`,
'',
'[ extensions ]',
`extendedKeyUsage = ${event.ResourceProperties.ExtendedKeyUsage}`,
`keyUsage = ${event.ResourceProperties.KeyUsage}`,
'subjectKeyIdentifier = hash',
].join('\n'), { encoding: 'utf8' });
return file;
}
async function _retrievePrivateKey(event, dir) {
const file = path.join(dir, 'private_key.pem');
const secret = await secretsManager.getSecretValue({
SecretId: event.ResourceProperties.PrivateKeySecretId,
VersionStage: 'AWSCURRENT',
});
await writeFile(file, secret.SecretString, { encoding: 'utf8' });
return file;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtc2lnbmluZy1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2VydGlmaWNhdGUtc2lnbmluZy1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwyQ0FBNkI7QUFDN0IsNkRBQTZEO0FBQzdELGtEQUF3QztBQUN4Qyw2REFBNkQ7QUFDN0QsNEVBQWlFO0FBRWpFLHdEQUEwQztBQUMxQyxpRUFBaUU7QUFDakUsaUNBQWtDO0FBRWxDLGlFQUFpRTtBQUNqRSxpQ0FBa0M7QUFFbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFL0MsTUFBTSxjQUFjLEdBQUcsSUFBSSx1Q0FBYyxFQUFFLENBQUM7QUFFNUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7QUFPekQsS0FBSyxVQUFVLFdBQVcsQ0FBQyxLQUFnQixFQUFFLFFBQXdCO0lBQ25FLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtRQUNoRCxHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFO1lBQy9DLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsY0FBYyxFQUFFLElBQUk7WUFDcEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4Qix3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QUMsa0JBQWtCO1FBQ3JELFlBQVksRUFBRSxZQUFZO0tBQzNCLENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsWUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbEUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBTMyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBTZWNyZXRzTWFuYWdlciB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zZWNyZXRzLW1hbmFnZXInO1xuXG5pbXBvcnQgKiBhcyBjZm4gZnJvbSAnLi9fY2xvdWQtZm9ybWF0aW9uJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5pbXBvcnQgX2V4ZWMgPSByZXF1aXJlKCcuL19leGVjJyk7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnLi9fbGFtYmRhJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5pbXBvcnQgX3JtcmYgPSByZXF1aXJlKCcuL19ybXJmJyk7XG5cbmNvbnN0IG1rZHRlbXAgPSB1dGlsLnByb21pc2lmeShmcy5ta2R0ZW1wKTtcbmNvbnN0IHJlYWRGaWxlID0gdXRpbC5wcm9taXNpZnkoZnMucmVhZEZpbGUpO1xuY29uc3Qgd3JpdGVGaWxlID0gdXRpbC5wcm9taXNpZnkoZnMud3JpdGVGaWxlKTtcblxuY29uc3Qgc2VjcmV0c01hbmFnZXIgPSBuZXcgU2VjcmV0c01hbmFnZXIoKTtcblxuZXhwb3J0cy5oYW5kbGVyID0gY2ZuLmN1c3RvbVJlc291cmNlSGFuZGxlcihoYW5kbGVFdmVudCk7XG5cbmludGVyZmFjZSBSZXNvdXJjZUF0dHJpYnV0ZXMgZXh0ZW5kcyBjZm4uUmVzb3VyY2VBdHRyaWJ1dGVzIHtcbiAgQ1NSOiBzdHJpbmc7XG4gIFNlbGZTaWduZWRDZXJ0aWZpY2F0ZTogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudDogY2ZuLkV2ZW50LCBfY29udGV4dDogbGFtYmRhLkNvbnRleHQpOiBQcm9taXNlPGNmbi5SZXNvdXJjZUF0dHJpYnV0ZXM+IHtcbiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlICE9PSBjZm4uUmVxdWVzdFR5cGUuREVMRVRFKSB7XG4gICAgY2ZuLnZhbGlkYXRlUHJvcGVydGllcyhldmVudC5SZXNvdXJjZVByb3BlcnRpZXMsIHtcbiAgICAgIERuQ29tbW9uTmFtZTogdHJ1ZSxcbiAgICAgIERuQ291bnRyeTogdHJ1ZSxcbiAgICAgIERuRW1haWxBZGRyZXNzOiB0cnVlLFxuICAgICAgRG5Mb2NhbGl0eTogdHJ1ZSxcbiAgICAgIERuT3JnYW5pemF0aW9uTmFtZTogdHJ1ZSxcbiAgICAgIERuT3JnYW5pemF0aW9uYWxVbml0TmFtZTogdHJ1ZSxcbiAgICAgIERuU3RhdGVPclByb3ZpbmNlOiB0cnVlLFxuICAgICAgRXh0ZW5kZWRLZXlVc2FnZTogZmFsc2UsXG4gICAgICBLZXlVc2FnZTogdHJ1ZSxcbiAgICAgIFByaXZhdGVLZXlTZWNyZXRJZDogdHJ1ZSxcbiAgICAgIE91dHB1dEJ1Y2tldDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICBjYXNlIGNmbi5SZXF1ZXN0VHlwZS5DUkVBVEU6XG4gICAgY2FzZSBjZm4uUmVxdWVzdFR5cGUuVVBEQVRFOlxuICAgICAgcmV0dXJuIF9jcmVhdGVTZWxmU2lnbmVkQ2VydGlmaWNhdGUoZXZlbnQpO1xuICAgIGNhc2UgY2ZuLlJlcXVlc3RUeXBlLkRFTEVURTpcbiAgICAvLyBOb3RoaW5nIHRvIGRvIC0gdGhpcyBpcyBub3QgYSBcIlBoeXNpY2FsXCIgcmVzb3VyY2VcbiAgICAgIHJldHVybiB7IFJlZjogZXZlbnQuTG9naWNhbFJlc291cmNlSWQgfTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfY3JlYXRlU2VsZlNpZ25lZENlcnRpZmljYXRlKGV2ZW50OiBjZm4uRXZlbnQpOiBQcm9taXNlPFJlc291cmNlQXR0cmlidXRlcz4ge1xuICBjb25zdCB0ZW1wRGlyID0gYXdhaXQgbWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksICd4NTA5Q1NSLScpKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gYXdhaXQgX21ha2VDc3JDb25maWcoZXZlbnQsIHRlbXBEaXIpO1xuICAgIGNvbnN0IHBrZXlGaWxlID0gYXdhaXQgX3JldHJpZXZlUHJpdmF0ZUtleShldmVudCwgdGVtcERpcik7XG4gICAgY29uc3QgY3NyRmlsZSA9IHBhdGguam9pbih0ZW1wRGlyLCAnY3NyLnBlbScpO1xuICAgIGF3YWl0IF9leGVjKCdvcGVuc3NsJywgJ3JlcScsICctY29uZmlnJywgY29uZmlnRmlsZSxcbiAgICAgICcta2V5JywgcGtleUZpbGUsXG4gICAgICAnLW91dCcsIGNzckZpbGUsXG4gICAgICAnLW5ldycpO1xuICAgIGNvbnN0IGNlcnRGaWxlID0gcGF0aC5qb2luKHRlbXBEaXIsICdjZXJ0LnBlbScpO1xuICAgIGF3YWl0IF9leGVjKCdvcGVuc3NsJywgJ3g1MDknLCAnLWluJywgY3NyRmlsZSxcbiAgICAgICctb3V0JywgY2VydEZpbGUsXG4gICAgICAnLXJlcScsXG4gICAgICAnLXNpZ25rZXknLCBwa2V5RmlsZSxcbiAgICAgICctZGF5cycsICczNjUnKTtcblxuICAgIGNvbnN0IHMzID0gbmV3IFMzKCk7XG4gICAgY29uc3QgYnVja2V0TmFtZTogc3RyaW5nID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLk91dHB1dEJ1Y2tldDtcbiAgICBhd2FpdCBzMy5wdXRPYmplY3Qoe1xuICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgS2V5OiAnY2VydGlmaWNhdGUtc2lnbmluZy1yZXF1ZXN0LnBlbScsXG4gICAgICBCb2R5OiBhd2FpdCByZWFkRmlsZShjc3JGaWxlLCB7IGVuY29kaW5nOiAndXRmOCcgfSksXG4gICAgICBDb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gtcGVtLWZpbGUnLFxuICAgIH0pO1xuICAgIGF3YWl0IHMzLnB1dE9iamVjdCh7XG4gICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICBLZXk6ICdzZWxmLXNpZ25lZC1jZXJ0aWZpY2F0ZS5wZW0nLFxuICAgICAgQm9keTogYXdhaXQgcmVhZEZpbGUoY2VydEZpbGUsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KSxcbiAgICAgIENvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veC1wZW0tZmlsZScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgUmVmOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICAgIENTUjogYHMzOi8vJHtidWNrZXROYW1lfS9jZXJ0aWZpY2F0ZS1zaWduaW5nLXJlcXVlc3QucGVtYCxcbiAgICAgIFNlbGZTaWduZWRDZXJ0aWZpY2F0ZTogYHMzOi8vJHtidWNrZXROYW1lfS9zZWxmLXNpZ25lZC1jZXJ0aWZpY2F0ZS5wZW1gLFxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgX3JtcmYodGVtcERpcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX21ha2VDc3JDb25maWcoZXZlbnQ6IGNmbi5FdmVudCwgZGlyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlID0gcGF0aC5qb2luKGRpciwgJ2Nzci5jb25maWcnKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGZpbGUsIFtcbiAgICAnWyByZXEgXScsXG4gICAgJ2RlZmF1bHRfbWQgICAgICAgICAgID0gc2hhMjU2JyxcbiAgICAnZGlzdGluZ3Vpc2hlZF9uYW1lICAgPSBkbicsXG4gICAgJ3Byb21wdCAgICAgICAgICAgICAgID0gbm8nLFxuICAgICdyZXFfZXh0ZW5zaW9ucyAgICAgICA9IGV4dGVuc2lvbnMnLFxuICAgICdzdHJpbmdfbWFzayAgICAgICAgICA9IHV0Zjhvbmx5JyxcbiAgICAndXRmOCAgICAgICAgICAgICAgICAgPSB5ZXMnLFxuICAgICcnLFxuICAgICdbIGRuIF0nLFxuICAgIGBDTiAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuQ29tbW9uTmFtZX1gLFxuICAgIGBDICAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuQ291bnRyeX1gLFxuICAgIGBTVCAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuU3RhdGVPclByb3ZpbmNlfWAsXG4gICAgYEwgICAgICAgICAgICAgICAgICAgID0gJHtldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuRG5Mb2NhbGl0eX1gLFxuICAgIGBPICAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuT3JnYW5pemF0aW9uTmFtZX1gLFxuICAgIGBPVSAgICAgICAgICAgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuT3JnYW5pemF0aW9uYWxVbml0TmFtZX1gLFxuICAgIGBlbWFpbEFkZHJlc3MgICAgICAgICA9ICR7ZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkRuRW1haWxBZGRyZXNzfWAsXG4gICAgJycsXG4gICAgJ1sgZXh0ZW5zaW9ucyBdJyxcbiAgICBgZXh0ZW5kZWRLZXlVc2FnZSAgICAgPSAke2V2ZW50LlJlc291cmNlUHJvcGVydGllcy5FeHRlbmRlZEtleVVzYWdlfWAsXG4gICAgYGtleVVzYWdlICAgICAgICAgICAgID0gJHtldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuS2V5VXNhZ2V9YCxcbiAgICAnc3ViamVjdEtleUlkZW50aWZpZXIgPSBoYXNoJyxcbiAgXS5qb2luKCdcXG4nKSwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICByZXR1cm4gZmlsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JldHJpZXZlUHJpdmF0ZUtleShldmVudDogY2ZuLkV2ZW50LCBkaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGUgPSBwYXRoLmpvaW4oZGlyLCAncHJpdmF0ZV9rZXkucGVtJyk7XG4gIGNvbnN0IHNlY3JldCA9IGF3YWl0IHNlY3JldHNNYW5hZ2VyLmdldFNlY3JldFZhbHVlKHtcbiAgICBTZWNyZXRJZDogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlByaXZhdGVLZXlTZWNyZXRJZCxcbiAgICBWZXJzaW9uU3RhZ2U6ICdBV1NDVVJSRU5UJyxcbiAgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShmaWxlLCBzZWNyZXQuU2VjcmV0U3RyaW5nISwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICByZXR1cm4gZmlsZTtcbn1cbiJdfQ==