Estoy tratando de escribir un script para probar mi API que se implementa en AWS EKS en Cloudwatch Synthetics (Canary). Pero no veo la disposición para agregar mi certificado y clave junto con mi solicitud de API.
¿Cómo puedo insertar el certificado junto con el encabezado de solicitud de la API? En mi local, agrego los certificados usando fs y los agrego a los encabezados de axios. Si es necesario agregar el certificado en el script del titiritero, ¿cómo puedo lograrlo?
ERROR: Solicitud fallida. Solicitud: https://myapirequestdns.com/api/v1.0/testroute/testdomain ERROR: Motivo de la falla: Error: leer ECONNRESET Pila: Error: leer ECONNRESET en TLSWrap.onStreamRead (internal/stream_base_commons.js:209:20) en TLSWrap.callbackTrampoline (interno/async_hooks.js:130:17)
Este es el código que usamos en la parte superior de nuestra función Canary que ejecuta syn-nodejs-puppeteer-3.5 para recuperar y usar un certificado, una clave privada y una CA del administrador de secretos de AWS:
const synthetics = require('Synthetics'); const log = require('SyntheticsLogger'); const syntheticsConfiguration = synthetics.getConfiguration(); const AWS = require('aws-sdk'); AWS.config.update({region: 'us-east-1'}); const secretsManager = new AWS.SecretsManager(); // We need to load a client certificate to authenticate to endpoints that require mTLS, specified in these env variables const secretName = process.env.SECRET_NAME const keyItemName = process.env.KEY_ITEM_NAME const certItemName = process.env.CERT_ITEM_NAME const caItemName = process.env.CA_ITEM_NAME // Function to retrieve specified key/cert from specified secret and return them as plain strings const getKeyAndCertAndCA = async function () { // Retrieve secret const data = await secretsManager.getSecretValue({SecretId: process.env.SECRET_NAME}).promise(); // Turn secret string into object const secret = JSON.parse(data.SecretString); // Base64 decode the cert and key and return them const key = Buffer.from(secret[keyItemName], 'base64').toString('ascii'); const cert = Buffer.from(secret[certItemName], 'base64').toString('ascii'); const ca = Buffer.from(secret[caItemName], 'base64').toString('ascii'); return [ key, cert, ca ]; } Luego, justo dentro de la función apiCanaryBlueprint , cargue la clave/cert/CA
const apiCanaryBlueprint = async function () { // Load TLS client cert and key for calls requiring TLS const [ key, cert, ca ] = await getKeyAndCertAndCA(); y luego, al configurar requestOptions , especifique los parámetros key , cert y ca :
let requestOptions = { hostname: url.host, method: 'GET', path: url.path, port: '443', protocol: 'https:', body: "", headers: {}, key: key, cert: cert, ca: ca };