Estrenamos blog: te contamos lo que hacemos de forma más rápida, cercana y transparente.
DinaupBlog
← Volver al blog

Dinaup Vault: gestiona secretos en .NET sin meterlos en el código

Saca claves API, contraseñas y cadenas de conexión de tu código .NET y léelas cifradas con Dinaup Vault. Un solo paquete, dos variables de entorno y unas pocas líneas.

Equipo Dinaup1 de octubre de 20244 min de lectura

Una clave API commiteada en GitHub sigue en el historial aunque la borres. Una contraseña de producción en appsettings.json viaja con cada copia del repositorio. Gestionar secretos a mano es lento y se rota mal.

Dinaup Vault resuelve esto. Guardas los secretos cifrados en tu cuenta de Dinaup y los lees desde .NET con dos líneas. En tu servidor solo viven las credenciales del propio Vault. El resto se queda fuera del código y del repositorio.

Qué ganas

  • Cero secretos en el repo. Las claves no viven en el código ni en archivos de configuración.
  • Una sola fuente de verdad. Cambias una contraseña en un sitio, no servidor por servidor.
  • Secretos compartidos. Varias apps leen el mismo valor sin duplicarlo en cada una.
  • Gestión desde la web. Añades y editas secretos en tu panel, sin redeploy.

Instalación

Vault viene en el SDK base de Dinaup. Instala un paquete y tienes la clase Dinaup.Vault.VaultData lista.

dotnet add package Dinaup

El paquete NuGet se llama Dinaup. La clase de Vault vive en el namespace Dinaup.Vault. En los ejemplos importas los dos: Dinaup para el cliente y Dinaup.Vault para VaultData.

Cómo funciona

El flujo tiene tres pasos. Das de alta los secretos en la web, dejas las credenciales del Vault en variables de entorno e inicializas el Vault en arranque para leer lo que necesites.

Añade tus secretos en la web

Entra en tu cuenta de Dinaup, ve a la sección de API y crea cada secreto con una clave y su valor. Agrúpalos con una convención de puntos: dinaup.endpoint, dinaup.secretkey, db.connectionstring. Guarda.

Define las dos variables de entorno

Las únicas credenciales que salen del Vault y van a tu entorno son las del propio Vault:

VAULT_URL=...
VAULT_PASSWORD=...

Cópialas de tu panel de Dinaup. Nada más vive en el entorno.

Inicializa y lee

using Dinaup;
using Dinaup.Vault;

// Las únicas credenciales que vienen del entorno
var vault = new VaultData(
    Environment.GetEnvironmentVariable("VAULT_URL"),
    Environment.GetEnvironmentVariable("VAULT_PASSWORD")
);

vault.Initialize();

// El resto sale cifrado del Vault
string secretKey = vault.Read("dinaup.secretkey");
string dbConnection = vault.Read("db.connectionstring");

Read devuelve siempre una cadena, nunca null.

El caso típico: conectar el cliente Dinaup

El uso más habitual es leer del Vault las credenciales de la API de Dinaup y conectar el cliente. Todo cifrado, nada en el código. Elige según montes una app de consola o una web con DI. El recorrido completo del SDK —informes, escrituras, archivos— está en Conecta tu app .NET a Dinaup.

using Dinaup;
using Dinaup.Vault;

var vault = new VaultData(
    Environment.GetEnvironmentVariable("VAULT_URL"),
    Environment.GetEnvironmentVariable("VAULT_PASSWORD")
);
vault.Initialize();

var client = await DinaupClientC.ConnectAsync(
    endPoint: vault.Read("dinaup.endpoint"),
    publicKey: vault.Read("dinaup.publickey"),
    secretKey: vault.Read("dinaup.secretkey")
);

if (client == null || client.IsConnected == false)
    throw new Exception("No se pudo conectar a Dinaup");

En una app web, conecta una vez en arranque y registra el cliente como singleton:

using Dinaup;
using Dinaup.Vault;

var builder = WebApplication.CreateBuilder(args);

var vault = new VaultData(
    Environment.GetEnvironmentVariable("VAULT_URL"),
    Environment.GetEnvironmentVariable("VAULT_PASSWORD")
);
vault.Initialize();

var client = await DinaupClientC.ConnectAsync(
    endPoint: vault.Read("dinaup.endpoint"),
    publicKey: vault.Read("dinaup.publickey"),
    secretKey: vault.Read("dinaup.secretkey")
);

if (client == null || client.IsConnected == false)
    throw new Exception("No se pudo conectar a Dinaup");

builder.Services.AddSingleton(client);

var app = builder.Build();

Preguntas frecuentes

Siguiente paso

Sigue leyendo