https://d226lax1qjow5r.cloudfront.net/blog/blogposts/using-private-keys-in-environment-variables/Blog_Private-Keys_Cloud-Enviorment_1200x600.png

Uso de claves privadas en variables de entorno

Publicado el November 8, 2020

Tiempo de lectura: 5 minutos

Este artículo se actualizó en marzo de 2025

Muchas de nuestras nuevas APIs utilizan JWTs (JSON Web Tokens) para la autenticación, lo cual es genial. Sin embargo, como nuestros JWT se firman con claves privadas y estas contienen nuevas líneas, a veces esto puede dificultar algunos de nuestros métodos habituales de gestión de credenciales.

Este post mostrará cómo puedes usar una clave privada en una variable de entorno, y mostrará un ejemplo de esto en acción con el Voice API de Vonage y una función de Netlify.

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

A continuación, siga adelante y cree una aplicación con capacidades de Voice; necesitará el ID de la aplicación y el archivo de clave privada para el siguiente paso.

Puede utilizar su panel de Account para esta parte, o puede utilizar la CLI de esta manera:

vonage apps create private

El comando imprimirá el ID de la aplicación y escribirá la clave privada en el archivo imaginativamente llamado private.key archivo. Ambos elementos se utilizan en el siguiente paso.

¿Por qué no cargar el archivo?

Los datos están en private.key¿verdad? ¿Por qué no podemos utilizar este archivo que tenemos en el disco?

En el caso de una aplicación local, sí que podemos y verás que muchas de nuestras aplicaciones de ejemplo lo hacen.

Sin embargo, para una aplicación "real", el archivo private.key no forma parte de la aplicación y no puede tratarse del mismo modo que los demás archivos.

A private.key nunca debe añadirse al control de código fuente; es una credencial tan secreta como la contraseña de tu Account. También es probable que se utilicen diferentes conjuntos de credenciales con esta aplicación en diferentes plataformas, como su plataforma de desarrollo local, o cuando la aplicación se despliega en una plataforma de ensayo o en vivo.

Con esto en mente, necesito una manera de manejar esta clave privada como una cadena de forma segura de otra manera.

Crear una aplicación básica de llamadas de voz

Una buena forma de ver esto en acción es crear una aplicación que haga uso de la Voice API. Creo que nunca me cansaré de hacer sonar mi teléfono mediante programación.

El ejemplo de hoy utiliza Node.js y realiza una llamada telefónica con un simple anuncio de texto a voz.

Antes de escribir el código instalaré el SDK de Vonage Node dependencia:

npm install @vonage/server-sdk

Ahora es el momento del código. Para una aplicación tan simple yo suelo poner todo en index.jsalgo como esto:

const Vonage = require('@vonage/server-sdk');

const vonage = new Vonage({
  applicationId: process.env.VONAGE_APPLICATION_ID,
  privateKey: Buffer.from(process.env.VONAGE_APPLICATION_PRIVATE_KEY64, 'base64')
})

vonage.calls.create({
  to: [{
    type: 'phone',
    number: process.env.TO_NUMBER
  }],
  from: {
    type: 'phone',
    number: process.env.VONAGE_NUMBER
  },
  ncco: [{
    "action": "talk",
    "text": "Safely handling environment variables makes coding even more fun."
  }]
}, (error, response) => {
  if (error) console.error(error)
  if (response) console.log(response)
})

Echa un vistazo al ejemplo de código y verás que hay bastantes lugares en los que se hace referencia a variables de entorno con process.env.*.

El uso de variables de entorno es una gran manera de hacer que el código se ejecute felizmente en más de un lugar, porque en cada escenario simplemente buscará y utilizará los valores proporcionados.

En particular, prefiero el entorno a los archivos de configuración para plataformas en la nube, donde puedo desplegar desde el control de código fuente pero nunca incluiría credenciales allí.

Para plataformas locales, utilizo dotenv para cargar variables de entorno desde un archivo de configuración. Cuando se utiliza dotenv, o para algunas plataformas en la nube como Netlify y Glitch, no es posible utilizar valores multilínea para una variable de entorno. Para evitarlo, utilizo valores codificados en base64 para mis variables de entorno y hago que mi aplicación decodifique los valores antes de utilizarlos.

Preparación de las variables de entorno

Para el uso local de dotenvo para una plataforma que no maneje variables de entorno multilínea, preparo un archivo .env como este:

TO_NUMBER=44777000777
VONAGE_NUMBER=44777000888
VONAGE_APPLICATION_ID=abcd1234-aaaa-bbbb-cccc-0987654321ef
VONAGE_APPLICATION_PRIVATE_KEY64=LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQ25VaFp3N214cTljZHUKU21oL1UrekovdGRZSUxRVDF5VExjWnFETk11OW44WUVHMmMyR1JUbmR2a2cxeXlBVCtqTk45Zmp5eTg1Zi9EOG9zTzhPdnhRS0Y0aWpoblJlVTVDQStnU0o3UEhLa3U5YjJsMzZ2TmN5WFFCdWRJVk8KV2tBOERraTlFVHpqaG8rRnh0SGJuWGZHa3o3emtzUTJvMjVMemorblFkendCQlc3aXVrNVNqdkdYSkFEK0xQRUIveHhUVEhSRFZJRjNxYWM2dmM5L3NPUStYa0MvVzB4MzgKUDg0T3JpdjhNdytCdktOZlMwMU94Y05PWU9yMENvYWM4Z1VxazljQ2dZRUFtYmFMYjROeEE3ckdkc1B1YU9UOEpSSjN6L2J0VzdnMXF4NUxvCkZ0b1c2Qm9vSnhmb2lhV1YrTURtcEFsL2FJZzRqMGJ1cXFwajU3UjlZWlhTK0xhdU1HUWl0azRPWi9ZS1lZSDUKK3psWTJ0VjhHUTdqM29CWURDd2puWWc9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K

Si está configurando variables de entorno por otros medios, como a través de una interfaz web, puede reutilizar estos valores allí también.

Los valores deben ser:

  • TO_NUMBER el número al que llamar, utilicé mi número de móvil

  • VONAGE_NUMBER un número que poseo en la plataforma Vonage

  • VONAGE_APPLICATION_ID el ID de la aplicación que he creado en la primera sección

  • VONAGE_APPLICATION_PRIVATE_KEY64 el contenido de mi archivo private.key codificado en base64

El comando que uso para obtener el valor base64 es:

cat private.key | base64 -w 0

Póngalo todo junto

Al codificar las variables de entorno con nuevas líneas, podemos transferirlas de forma segura como cadenas. Usando la configuración anterior con el archivo index.js que trajimos antes, puedo ejecutar mi código localmente (añadiendo dotenv en mi aplicación), o en cualquier otra plataforma.

Es una cosa pequeña, pero me encuentro con ella en lugares inesperados al manejar los archivos de claves privadas, por lo que voy a estar refiriéndose de nuevo a este post a mí mismo estoy seguro.

Compartir:

https://a.storyblok.com/f/270183/250x250/e3d3b71060/lornajane.png
Lorna MitchellAntiguos alumnos de Vonage

Lorna es ingeniera de software con un incurable hábito bloguero. Intenta domar las palabras y el código a partes iguales.