Biblioteca cliente de claves de Azure Key Vault para .NET: versión 4.5.0
Azure Key Vault es un servicio en la nube que proporciona almacenamiento seguro de claves para cifrar los datos. Se pueden conservar varias claves y varias versiones de la misma clave en azure Key Vault. Las claves criptográficas de Azure Key Vault se representan como objetos JSON Web Key (JWK).
Azure Key Vault HSM administrado es un servicio en la nube totalmente administrado, de alta disponibilidad, de inquilino único y compatible con estándares que le permite proteger las claves criptográficas para las aplicaciones en la nube mediante HSM validados de nivel 3 de FIPS 140-2.
El cliente de la biblioteca de claves de Azure Key Vault admite claves RSA y claves de curva elíptica (EC), cada una con la compatibilidad correspondiente en módulos de seguridad de hardware (HSM). Ofrece operaciones para crear, recuperar, actualizar, eliminar, purgar, realizar copias de seguridad, restaurar y enumerar las claves y sus versiones.
Código | fuente Paquete (NuGet) | Documentación | de referencia de APIDocumentación | del producto Muestras | Guía de migración
Introducción
Instalar el paquete
Instale la biblioteca cliente de claves de Azure Key Vault para .NET con NuGet:
dotnet add package Azure.Security.KeyVault.Keys
Prerrequisitos
- Una suscripción de Azure.
- Un Key Vault de Azure existente. Si necesita crear una Key Vault de Azure, puede usar Azure Portal o la CLI de Azure.
- Autorización en una instancia de Azure Key Vault existente mediante RBAC (recomendado) o control de acceso.
Si va a crear un recurso de Key Vault estándar, ejecute el siguiente comando de la CLI reemplazando <your-resource-group-name>
y <your-key-vault-name>
por sus propios nombres únicos:
az keyvault create --resource-group <your-resource-group-name> --name <your-key-vault-name>
Si va a crear un recurso de HSM administrado, ejecute el siguiente comando de la CLI:
az keyvault create --hsm-name <your-key-vault-name> --resource-group <your-resource-group-name> --administrators <your-user-object-id> --location <your-azure-location>
Para obtener <your-user-object-id>
, puede ejecutar el siguiente comando de la CLI:
az ad user show --id <your-user-principal> --query id
Autenticar el cliente
Para interactuar con el servicio azure Key Vault, deberá crear una instancia de la clase KeyClient. Necesita una dirección URL del almacén, que puede ver como "Nombre DNS" en el portal y credenciales para crear instancias de un objeto de cliente.
Los ejemplos que se muestran a continuación usan , DefaultAzureCredential
que es adecuado para la mayoría de los escenarios, incluidos los entornos de desarrollo y producción locales que usan la autenticación de identidad administrada.
Además, se recomienda usar una identidad administrada para la autenticación en entornos de producción.
Puede encontrar más información sobre las distintas formas de autenticación y sus tipos de credenciales correspondientes en la documentación de Azure Identity .
Para usar el DefaultAzureCredential
proveedor que se muestra a continuación u otros proveedores de credenciales proporcionados con el SDK de Azure, primero debe instalar el paquete Azure.Identity:
dotnet add package Azure.Identity
Activación de un HSM administrado
Esta sección solo se aplica si va a crear un HSM administrado. Todos los comandos de plano de datos estarán deshabilitados hasta que se active el HSM. No podrá crear claves ni asignar roles. El HSM solo pueden activarlo los administradores designados que se asignaron durante el comando create. Para activar el HSM, debe descargar el dominio de seguridad.
Para activar el HSM necesita:
- Tres pares de claves RSA como mínimo (diez como máximo).
- Especificar el número mínimo de claves necesarias para descifrar el dominio de seguridad (cuórum)
Para activar el HSM, envíe al menos tres claves públicas RSA (diez como máximo) al HSM. El HSM cifra el dominio de seguridad con estas claves y lo devuelve. Una vez descargado correctamente este dominio de seguridad, el HSM está listo para usarse. También debe especificar el cuórum, que es el número mínimo de claves privadas necesarias para descifrar el dominio de seguridad.
En el ejemplo siguiente se muestra cómo usar openssl para generar 3 certificados autofirmados.
openssl req -newkey rsa:2048 -nodes -keyout cert_0.key -x509 -days 365 -out cert_0.cer
openssl req -newkey rsa:2048 -nodes -keyout cert_1.key -x509 -days 365 -out cert_1.cer
openssl req -newkey rsa:2048 -nodes -keyout cert_2.key -x509 -days 365 -out cert_2.cer
Use el comando az keyvault security-domain download
para descargar el dominio de seguridad y activar el HSM administrado.
En el ejemplo siguiente se usan 3 pares de claves RSA (solo se necesitan claves públicas para este comando) y se establece el cuórum en 2.
az keyvault security-domain download --hsm-name <your-key-vault-name> --sd-wrapping-keys ./certs/cert_0.cer ./certs/cert_1.cer ./certs/cert_2.cer --sd-quorum 2 --security-domain-file ContosoMHSM-SD.json
Creación de KeyClient
Cree una instancia de para DefaultAzureCredential
pasar al cliente.
La misma instancia de una credencial de token se puede usar con varios clientes si se autenticarán con la misma identidad.
// Create a new key client using the default credential from Azure.Identity using environment variables previously set,
// including AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, and AZURE_TENANT_ID.
var client = new KeyClient(vaultUri: new Uri(vaultUrl), credential: new DefaultAzureCredential());
// Create a new key using the key client.
KeyVaultKey key = client.CreateKey("key-name", KeyType.Rsa);
// Retrieve a key using the key client.
key = client.GetKey("key-name");
Creación de CryptographyClient
Una vez que haya creado un KeyVaultKey
elemento en azure Key Vault, también puede crear CryptographyClient:
// Create a new cryptography client using the same Key Vault or Managed HSM endpoint, service version,
// and options as the KeyClient created earlier.
CryptographyClient cryptoClient = client.GetCryptographyClient(key.Name, key.Properties.Version);
Conceptos clave
KeyVaultKey
Azure Key Vault admite varios tipos de clave y algoritmos, y permite el uso de módulos de seguridad de hardware (HSM) para claves de alto valor.
KeyClient
Existe una KeyClient
provisión de operaciones sincrónicas y asincrónicas en el SDK que permite la selección de un cliente en función del caso de uso de una aplicación. Una vez que haya inicializado un KeyClient
, puede interactuar con los tipos de recursos principales en Azure Key Vault.
CryptographyClient
Existe una CryptographyClient
provisión de operaciones sincrónicas y asincrónicas en el SDK que permite la selección de un cliente en función del caso de uso de una aplicación. Una vez que haya inicializado un CryptographyClient
, puede usarlo para realizar operaciones criptográficas con claves almacenadas en Azure Key Vault.
Seguridad para subprocesos
Garantizamos que todos los métodos de instancia de cliente sean seguros para subprocesos e independientes entre sí (guía). Esto garantiza que la recomendación de reutilizar instancias de cliente siempre es segura, incluso entre subprocesos.
Conceptos adicionales
Opciones | de cliente Acceso a la respuesta | Operaciones | de larga duraciónControl de errores | Diagnóstico | Burla | Duración del cliente
Ejemplos
El paquete Azure.Security.KeyVault.Keys admite API sincrónicas y asincrónicas.
En la sección siguiente se proporcionan varios fragmentos de código mediante el client
creado anteriormente, que abarcan algunas de las tareas relacionadas con el servicio clave de Azure Key Vault más comunes:
Ejemplos de sincronización
- Crear una clave
- Recuperación de una clave
- Actualización de una clave existente
- Eliminar una clave
- Eliminar y purgar una clave
- Enumeración de claves
- Cifrar y descifrar
Ejemplos asincrónicos
- Creación de una clave de forma asincrónica
- Enumerar claves de forma asincrónica
- Eliminar una clave de forma asincrónica
Crear una clave
Cree una clave que se almacenará en azure Key Vault. Si ya existe una clave con el mismo nombre, se crea una nueva versión de la clave.
// Create a key. Note that you can specify the type of key
// i.e. Elliptic curve, Hardware Elliptic Curve, RSA
KeyVaultKey key = client.CreateKey("key-name", KeyType.Rsa);
Console.WriteLine(key.Name);
Console.WriteLine(key.KeyType);
// Create a software RSA key
var rsaCreateKey = new CreateRsaKeyOptions("rsa-key-name", hardwareProtected: false);
KeyVaultKey rsaKey = client.CreateRsaKey(rsaCreateKey);
Console.WriteLine(rsaKey.Name);
Console.WriteLine(rsaKey.KeyType);
// Create a hardware Elliptic Curve key
// Because only premium Azure Key Vault supports HSM backed keys , please ensure your Azure Key Vault
// SKU is premium when you set "hardwareProtected" value to true
var echsmkey = new CreateEcKeyOptions("ec-key-name", hardwareProtected: true);
KeyVaultKey ecKey = client.CreateEcKey(echsmkey);
Console.WriteLine(ecKey.Name);
Console.WriteLine(ecKey.KeyType);
Recuperación de una clave
GetKey
recupera una clave almacenada anteriormente en azure Key Vault.
KeyVaultKey key = client.GetKey("key-name");
Console.WriteLine(key.Name);
Console.WriteLine(key.KeyType);
Actualización de una clave existente
UpdateKeyProperties
actualiza una clave almacenada anteriormente en azure Key Vault.
KeyVaultKey key = client.CreateKey("key-name", KeyType.Rsa);
// You can specify additional application-specific metadata in the form of tags.
key.Properties.Tags["foo"] = "updated tag";
KeyVaultKey updatedKey = client.UpdateKeyProperties(key.Properties);
Console.WriteLine(updatedKey.Name);
Console.WriteLine(updatedKey.Properties.Version);
Console.WriteLine(updatedKey.Properties.UpdatedOn);
Eliminación de una clave
StartDeleteKey
inicia una operación de ejecución prolongada para eliminar una clave almacenada anteriormente en Azure Key Vault.
Puede recuperar la clave inmediatamente sin esperar a que se complete la operación.
Cuando la eliminación temporal no está habilitada para Azure Key Vault, esta operación elimina permanentemente la clave.
DeleteKeyOperation operation = client.StartDeleteKey("key-name");
DeletedKey key = operation.Value;
Console.WriteLine(key.Name);
Console.WriteLine(key.DeletedOn);
Eliminar y purgar una clave
Tendrá que esperar a que se complete la operación de ejecución prolongada antes de intentar purgar o recuperar la clave.
DeleteKeyOperation operation = client.StartDeleteKey("key-name");
// You only need to wait for completion if you want to purge or recover the key.
while (!operation.HasCompleted)
{
Thread.Sleep(2000);
operation.UpdateStatus();
}
DeletedKey key = operation.Value;
client.PurgeDeletedKey(key.Name);
Enumera las claves
En este ejemplo se enumeran todas las claves de la Key Vault de Azure especificada.
Pageable<KeyProperties> allKeys = client.GetPropertiesOfKeys();
foreach (KeyProperties keyProperties in allKeys)
{
Console.WriteLine(keyProperties.Name);
}
Cifrar y descifrar
En este ejemplo se crea y CryptographyClient
se usa para cifrar y descifrar con una clave en Azure Key Vault.
// Create a new cryptography client using the same Key Vault or Managed HSM endpoint, service version,
// and options as the KeyClient created earlier.
var cryptoClient = client.GetCryptographyClient(key.Name, key.Properties.Version);
byte[] plaintext = Encoding.UTF8.GetBytes("A single block of plaintext");
// encrypt the data using the algorithm RSAOAEP
EncryptResult encryptResult = cryptoClient.Encrypt(EncryptionAlgorithm.RsaOaep, plaintext);
// decrypt the encrypted data.
DecryptResult decryptResult = cryptoClient.Decrypt(EncryptionAlgorithm.RsaOaep, encryptResult.Ciphertext);
Creación de una clave de forma asincrónica
Las API asincrónicas son idénticas a sus homólogos sincrónicos, pero devuelven con el sufijo "asincrónico" típico para los métodos asincrónicos y devuelven una tarea.
// Create a key of any type
KeyVaultKey key = await client.CreateKeyAsync("key-name", KeyType.Rsa);
Console.WriteLine(key.Name);
Console.WriteLine(key.KeyType);
// Create a software RSA key
var rsaCreateKey = new CreateRsaKeyOptions("rsa-key-name", hardwareProtected: false);
KeyVaultKey rsaKey = await client.CreateRsaKeyAsync(rsaCreateKey);
Console.WriteLine(rsaKey.Name);
Console.WriteLine(rsaKey.KeyType);
// Create a hardware Elliptic Curve key
// Because only premium Azure Key Vault supports HSM backed keys , please ensure your Azure Key Vault
// SKU is premium when you set "hardwareProtected" value to true
var echsmkey = new CreateEcKeyOptions("ec-key-name", hardwareProtected: true);
KeyVaultKey ecKey = await client.CreateEcKeyAsync(echsmkey);
Console.WriteLine(ecKey.Name);
Console.WriteLine(ecKey.KeyType);
Enumerar claves de forma asincrónica
La enumeración de claves no se basa en esperar el GetPropertiesOfKeysAsync
método, pero devuelve un AsyncPageable<KeyProperties>
valor que se puede usar con la await foreach
instrucción :
AsyncPageable<KeyProperties> allKeys = client.GetPropertiesOfKeysAsync();
await foreach (KeyProperties keyProperties in allKeys)
{
Console.WriteLine(keyProperties.Name);
}
Eliminar una clave de forma asincrónica
Al eliminar una clave de forma asincrónica antes de purgarla, puede esperar el WaitForCompletionAsync
método en la operación.
De forma predeterminada, este bucle se realiza indefinidamente, pero puede cancelarlo pasando un CancellationToken
.
DeleteKeyOperation operation = await client.StartDeleteKeyAsync("key-name");
// You only need to wait for completion if you want to purge or recover the key.
await operation.WaitForCompletionAsync();
DeletedKey key = operation.Value;
await client.PurgeDeletedKeyAsync(key.Name);
Solución de problemas
Consulte nuestra guía de solución de problemas para obtener más información sobre cómo diagnosticar varios escenarios de error.
General
Al interactuar con la biblioteca cliente de claves de Azure Key Vault mediante el SDK de .NET, los errores devueltos por el servicio corresponden a los mismos códigos de estado HTTP devueltos para las solicitudes de la API REST.
Por ejemplo, si intenta recuperar una clave que no existe en azure Key Vault, se devuelve un 404
error que indica "No encontrado".
try
{
KeyVaultKey key = client.GetKey("some_key");
}
catch (RequestFailedException ex)
{
Console.WriteLine(ex.ToString());
}
Observará que se registra información adicional, como el identificador de solicitud de cliente de la operación.
Message:
Azure.RequestFailedException : Service request failed.
Status: 404 (Not Found)
Content:
{"error":{"code":"KeyNotFound","message":"Key not found: some_key"}}
Headers:
Cache-Control: no-cache
Pragma: no-cache
Server: Microsoft-IIS/10.0
x-ms-keyvault-region: westus
x-ms-request-id: 625f870e-10ea-41e5-8380-282e5cf768f2
x-ms-keyvault-service-version: 1.1.0.866
x-ms-keyvault-network-info: addr=131.107.174.199;act_addr_fam=InterNetwork;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Strict-Transport-Security: max-age=31536000;includeSubDomains
X-Content-Type-Options: nosniff
Date: Tue, 18 Jun 2019 16:02:11 GMT
Content-Length: 75
Content-Type: application/json; charset=utf-8
Expires: -1
Pasos siguientes
Hay varios ejemplos de biblioteca cliente de claves de Azure Key Vault disponibles en este repositorio de GitHub. Estos ejemplos proporcionan código de ejemplo para escenarios adicionales que se suelen encontrar al trabajar con Azure Key Vault:
Sample1_HelloWorld.md: para trabajar con Azure Key Vault, entre los que se incluyen:
- Crear una clave
- Obtención de una clave existente
- Actualización de una clave existente
- Eliminación de una clave
Sample2_BackupAndRestore.md: contiene los fragmentos de código que funcionan con claves de Azure Key Vault, entre las que se incluyen:
- Copia de seguridad y recuperación de una clave
Sample3_GetKeys.md: código de ejemplo para trabajar con claves de Azure Key Vault, entre las que se incluyen:
- Crear claves
- Enumerar todas las claves del Key Vault
- Actualización de claves en el Key Vault
- Enumeración de versiones de una clave especificada
- Eliminación de claves del Key Vault
- Enumerar las claves eliminadas en el Key Vault
Sample4_EncryptDecrypt.md: código de ejemplo para realizar operaciones criptográficas con claves de Azure Key Vault, entre las que se incluyen:
- Cifrado y descifrado de datos con CryptographyClient
Sample5_SignVerify.md: código de ejemplo para trabajar con claves de Azure Key Vault, entre las que se incluyen:
- Firmar un resumen precalculado y comprobar la firma con Firmar y comprobar
- Firmar datos sin procesar y comprobar la firma con SignData y VerifyData
Sample6_WrapUnwrap.md: código de ejemplo para trabajar con claves de Azure Key Vault, entre las que se incluyen:
- Encapsular y desencapsular una clave simétrica
Documentación adicional
- Para obtener documentación más amplia sobre Azure Key Vault, consulte la documentación de referencia de api.
- Para la biblioteca cliente de secretos, consulte Biblioteca cliente de secretos.
- Para la biblioteca cliente de certificados, consulte Biblioteca cliente de certificados.
Contribuir
Consulte el CONTRIBUTING.md para obtener más información sobre la compilación, las pruebas y la contribución a estas bibliotecas.
Este proyecto agradece las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Contrato de licencia para el colaborador (CLA) que declara que tiene el derecho a concedernos y nos concede los derechos para usar su contribución. Para más detalles, visite https://cla.microsoft.com.
Cuando se envía una solicitud de incorporación de cambios, un bot de CLA determinará de forma automática si tiene que aportar un CLA y completar la PR adecuadamente (por ejemplo, la etiqueta, el comentario). Solo siga las instrucciones que le dará el bot. Solo será necesario que lo haga una vez en todos los repositorios con nuestro CLA.
Este proyecto ha adoptado el Código de conducta de Microsoft Open Source. Para más información, consulte las preguntas más frecuentes del código de conducta o póngase en contacto con opencode@microsoft.com si tiene cualquier otra pregunta o comentario.
Azure SDK for .NET