acme-http-01-azure-key-vault-middleware
Version:
Use Let's Encrypt and other RFC 8555 providers natively and securely on Azure
42 lines (30 loc) • 1.35 kB
JavaScript
const { SecretClient } = require('@azure/keyvault-secrets');
const debug = require('debug')('acme:middleware');
const createAzureKeyVaultURL = require('../util/createAzureKeyVaultURL');
const createChallengeSecretName = require('../util/createChallengeSecretName');
const BASE64URL_PATTERN = /^[A-Za-z0-9-_]+$/u;
module.exports = async function fetchChallengeResponse({ azureCredential, azureKeyVaultName, token }) {
if (!azureCredential) {
throw new TypeError('"azureCredential" must be specified');
} else if (!azureKeyVaultName) {
throw new TypeError('"azureKeyVaultName" must be specified');
} else if (!BASE64URL_PATTERN.test(token)) {
throw new TypeError(`"token" is not a valid ACME challenge`);
}
const secretClient = new SecretClient(createAzureKeyVaultURL(azureKeyVaultName), azureCredential);
debug(`received an ACME challenge for token "${token}"`);
try {
for await (let { tags } of secretClient.listPropertiesOfSecretVersions(createChallengeSecretName(token))) {
return tags.response;
}
} catch (err) {
if (err.code === 'SecretNotFound') {
const error = new Error('ACME challenge not found');
error.code = 'ENOENT';
throw error;
}
const error = new Error('Failed to get ACME challenge from Azure Key Vault');
error.code = 'EACCES';
throw err;
}
};