Démarrage rapide : bibliothèque de client de certificats Azure Key Vault pour JavaScript
Démarrez avec la bibliothèque de client de certificats Azure Key Vault pour JavaScript. Azure Key Vault est un service cloud qui fournit un magasin de certificats sécurisé. Vous pouvez stocker des clés, des mots de passe, des certificats et d’autres secrets en toute sécurité. Vous pouvez créer et gérer des coffres de clés Azure grâce au portail Azure. Dans ce guide de démarrage rapide, vous allez découvrir comment créer, récupérer et supprimer des certificats dans un coffre de clés Azure en utilisant la bibliothèque de client JavaScript.
Ressources de la bibliothèque de client Key Vault :
Documentation de référence sur les API | Code source de la bibliothèque | Package (npm)
Pour plus d’informations sur Key Vault et les certificats, consultez :
Prérequis
- Un abonnement Azure - En créer un gratuitement
- Actuellement Node.js LTS.
- Azure CLI
- Un coffre-fort de clé existant - vous pouvez en créer un à l’aide des éléments ci-après :
- Un abonnement Azure - En créer un gratuitement
- Actuellement Node.js LTS.
- TypeScript 5+
- Azure CLI
- Un coffre-fort de clé existant - vous pouvez en créer un à l’aide des éléments ci-après :
Ce guide de démarrage rapide suppose que vous exécutez l’interface Azure CLI.
Connexion à Azure
Exécutez la commande
login
.az login
Si l’interface CLI peut ouvrir votre navigateur par défaut, elle le fait et charge une page de connexion Azure par la même occasion.
Sinon, ouvrez une page de navigateur à l’adresse https://aka.ms/devicelogin et entrez le code d’autorisation affiché dans votre terminal.
Dans le navigateur, connectez-vous avec les informations d’identification de votre compte.
Créer une application Node.js
Créez une application Node.js qui utilise votre coffre-fort de clé.
Dans un terminal, créez un dossier nommé
key-vault-node-app
et modifiez-le dans ce dossier :mkdir key-vault-node-app && cd key-vault-node-app
Initialiser le projet Node.js :
npm init -y
Installer des packages Key Vault
À l’aide du terminal, installez la bibliothèque de secrets Azure Key Vault, @azure/keyvault-certificates pour Node.js.
npm install @azure/keyvault-certificates
Installez la bibliothèque de client Azure Identity, @azure/identity pour vous authentifier dans Key Vault.
npm install @azure/identity
Accorder l’accès à votre coffre de clés
Pour obtenir des autorisations sur votre coffre de clés par le Contrôle d’accès en fonction du rôle (RBAC), attribuez un rôle à votre « nom d’utilisateur principal » (UPN) à l’aide de la commande Azure CLI az role assignment create.
az role assignment create --role "Key Vault Certificate Officer" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
Remplacez <upn>, <subscription-id>, <resource-group-name> et <your-unique-keyvault-name> par vos valeurs réelles. Votre nom d’utilisateur principal (UPN) se présente généralement sous la forme d’une adresse électronique (par exemple username@domain.com).
Définir des variables d’environnement
Cette application utilise le point de terminaison Key Vault comme variable d’environnement appelée KEY_VAULT_URL
.
set KEY_VAULT_URL=<your-key-vault-endpoint>
Authentifier et créer un client
Les requêtes d’application vers les Services Azure doivent être autorisées. L’utilisation de la méthode DefaultAzureCredential fournie par la bibliothèque de client Azure Identity est l’approche recommandée pour implémenter des connexions sans mot de passe aux services Azure dans votre code. DefaultAzureCredential
prend en charge plusieurs méthodes d’authentification et détermine quelle méthode doit être utilisée au moment de l’exécution. Cette approche permet à votre application d’utiliser différentes méthodes d’authentification dans différents environnements (local ou production) sans implémenter de code spécifique à l’environnement.
Dans ce guide de démarrage rapide, DefaultAzureCredential
s’authentifie auprès du coffre de clés à l’aide des informations d’identification de l’utilisateur de développement local connecté à Azure CLI. Quand l’application est déployée sur Azure, le même code DefaultAzureCredential
peut découvrir et utiliser automatiquement une identité managée affectée à un service d’application, une machine virtuelle ou d’autres services. Pour plus d’informations, consultez Vue d’ensemble des identités managées.
Dans ce code, le point de terminaison de votre coffre de clés est utilisé pour créer le client Key Vault. Le format de point de terminaison ressemble à https://<your-key-vault-name>.vault.azure.net
, mais peut changer pour les clouds souverains. Pour plus d’informations sur l’authentification auprès du coffre de clés, consultez le Guide du développeur.
Exemple de code
Ce code utilise les classes et méthodes de certificat Key Vault suivantes :
Configurer le framework d’application
Créez un fichier texte et collez le code suivant dans le fichier index.js.
const { CertificateClient, DefaultCertificatePolicy } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); async function main() { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant // - AZURE_CLIENT_SECRET: The client secret for the registered application const credential = new DefaultAzureCredential(); const keyVaultUrl = process.env["KEY_VAULT_URL"]; if(!keyVaultUrl) throw new Error("KEY_VAULT_URL is empty"); const client = new CertificateClient(keyVaultUrl, credential); const uniqueString = new Date().getTime(); const certificateName = `cert${uniqueString}`; // Creating a self-signed certificate const createPoller = await client.beginCreateCertificate( certificateName, DefaultCertificatePolicy ); const pendingCertificate = createPoller.getResult(); console.log("Certificate: ", pendingCertificate); // To read a certificate with their policy: let certificateWithPolicy = await client.getCertificate(certificateName); // Note: It will always read the latest version of the certificate. console.log("Certificate with policy:", certificateWithPolicy); // To read a certificate from a specific version: const certificateFromVersion = await client.getCertificateVersion( certificateName, certificateWithPolicy.properties.version ); // Note: It will not retrieve the certificate's policy. console.log("Certificate from a specific version:", certificateFromVersion); const updatedCertificate = await client.updateCertificateProperties(certificateName, "", { tags: { customTag: "value" } }); console.log("Updated certificate:", updatedCertificate); // Updating the certificate's policy: await client.updateCertificatePolicy(certificateName, { issuerName: "Self", subject: "cn=MyOtherCert" }); certificateWithPolicy = await client.getCertificate(certificateName); console.log("updatedCertificate certificate's policy:", certificateWithPolicy.policy); // delete certificate const deletePoller = await client.beginDeleteCertificate(certificateName); const deletedCertificate = await deletePoller.pollUntilDone(); console.log("Recovery Id: ", deletedCertificate.recoveryId); console.log("Deleted Date: ", deletedCertificate.deletedOn); console.log("Scheduled Purge Date: ", deletedCertificate.scheduledPurgeDate); } main().catch((error) => { console.error("An error occurred:", error); process.exit(1); });
Exécuter l’exemple d’application
Exécutez l’application :
node index.js
Les méthodes de création et d’obtenir retournent un objet JSON complet pour le certificat :
{ "keyId": undefined, "secretId": undefined, "name": "YOUR-CERTIFICATE-NAME", "reuseKey": false, "keyCurveName": undefined, "exportable": true, "issuerName": 'Self', "certificateType": undefined, "certificateTransparency": undefined }, "properties": { "createdOn": 2021-11-29T20:17:45.000Z, "updatedOn": 2021-11-29T20:17:45.000Z, "expiresOn": 2022-11-29T20:17:45.000Z, "id": "https://YOUR-KEY-VAULT-NAME-ENDPOINT/certificates/YOUR-CERTIFICATE-NAME/YOUR-CERTIFICATE-VERSION", "enabled": false, "notBefore": 2021-11-29T20:07:45.000Z, "recoveryLevel": "Recoverable+Purgeable", "name": "YOUR-CERTIFICATE-NAME", "vaultUrl": "https://YOUR-KEY-VAULT-NAME-ENDPOINT", "version": "YOUR-CERTIFICATE-VERSION", "tags": undefined, "x509Thumbprint": undefined, "recoverableDays": 90 } }
Créez un fichier texte et collez le code suivant dans le fichier index.ts.
import { CertificateClient, DefaultCertificatePolicy, KeyVaultCertificate, DeletedCertificate, CertificatePolicy, KeyVaultCertificateWithPolicy, } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; import "dotenv/config"; const credential = new DefaultAzureCredential(); // Get Key Vault name from environment variables // such as `https://${keyVaultName}.vault.azure.net` const keyVaultUrl = process.env.KEY_VAULT_URL; if (!keyVaultUrl) throw new Error("KEY_VAULT_URL is empty"); function printCertificate( certificate: KeyVaultCertificate | KeyVaultCertificateWithPolicy ): void { console.log("-- printCertificate ---------------------------"); // if policy is defined, it's a KeyVaultCertificateWithPolicy if ((certificate as KeyVaultCertificateWithPolicy).policy) { const { name, properties, policy } = certificate as KeyVaultCertificateWithPolicy; const { createdOn, updatedOn, expiresOn, vaultUrl, version, tags } = properties; console.log("Certificate: ", { name, createdOn, updatedOn, expiresOn, vaultUrl, version, }); console.log("Certificate Policy: ", policy); printObjectProperties(tags); return; } else { const { name, properties } = certificate; const { createdOn, updatedOn, expiresOn, vaultUrl, version, tags } = properties; console.log("Certificate: ", { name, createdOn, updatedOn, expiresOn, vaultUrl, version, }); printObjectProperties(tags); } } // Object properties are tags and CertificatePolicy function printObjectProperties(obj: Record<string, any>): void { if (!obj) return; console.log("-- printObjectProperties ---------------------------"); Object.entries(obj).forEach(([key, value]) => { if (key === "lifetimeActions") { console.log(`${key}: ${JSON.stringify(value)}`); } else { console.log(`${key}: ${value}`); } }); } function printDeletedCertificate(deletedCertificate: DeletedCertificate): void { const { recoveryId, deletedOn, scheduledPurgeDate } = deletedCertificate; console.log("Deleted Certificate: ", { recoveryId, deletedOn, scheduledPurgeDate, }); } async function main(): Promise<void> { // Create a new CertificateClient const client = new CertificateClient(keyVaultUrl, credential); // Create a unique certificate name const uniqueString = new Date().getTime().toString(); const certificateName = `cert${uniqueString}`; // Creating a self-signed certificate const createPoller = await client.beginCreateCertificate( certificateName, DefaultCertificatePolicy ); // Get the created certificate const pendingCertificate = await createPoller.getResult(); printCertificate(pendingCertificate); // Get certificate by name let certificateWithPolicy = await client.getCertificate(certificateName); printCertificate(pendingCertificate); // Get certificate by version const certificateFromVersion = await client.getCertificateVersion( certificateName, certificateWithPolicy.properties.version! ); printCertificate(certificateFromVersion); // Update properties of the certificate const updatedCertificate = await client.updateCertificateProperties( certificateName, certificateWithPolicy.properties.version!, { tags: { customTag: "my value", }, } ); printCertificate(updatedCertificate); // Updating the certificate's policy const certificatePolicy = await client.updateCertificatePolicy( certificateName, { issuerName: "Self", subject: "cn=MyOtherCert", } ); printObjectProperties(certificatePolicy); // Get certificate again to see the updated policy certificateWithPolicy = await client.getCertificate(certificateName); printCertificate(certificateWithPolicy); // Delete certificate const deletePoller = await client.beginDeleteCertificate(certificateName); const deletedCertificate = await deletePoller.pollUntilDone(); printDeletedCertificate(deletedCertificate); } main().catch((error) => { console.error("An error occurred:", error); process.exit(1); });
Exécuter l’exemple d’application
Générez l’application TypeScript :
tsc
Exécutez l’application :
node index.js
Les méthodes de création et d’obtenir retournent un objet JSON complet pour le certificat :
{ "keyId": undefined, "secretId": undefined, "name": "YOUR-CERTIFICATE-NAME", "reuseKey": false, "keyCurveName": undefined, "exportable": true, "issuerName": 'Self', "certificateType": undefined, "certificateTransparency": undefined }, "properties": { "createdOn": 2021-11-29T20:17:45.000Z, "updatedOn": 2021-11-29T20:17:45.000Z, "expiresOn": 2022-11-29T20:17:45.000Z, "id": "https://YOUR-KEY-VAULT-NAME-ENDPOINT/certificates/YOUR-CERTIFICATE-NAME/YOUR-CERTIFICATE-VERSION", "enabled": false, "notBefore": 2021-11-29T20:07:45.000Z, "recoveryLevel": "Recoverable+Purgeable", "name": "YOUR-CERTIFICATE-NAME", "vaultUrl": "https://YOUR-KEY-VAULT-NAME-ENDPOINT", "version": "YOUR-CERTIFICATE-VERSION", "tags": undefined, "x509Thumbprint": undefined, "recoverableDays": 90 } }
Intégration à la configuration de l’application
Le kit SDK Azure fournit une méthode d’assistance, parseKeyVaultCertificateIdentifier, pour analyser l’ID de certificat Key Vault donné, ce qui est nécessaire si vous utilisez des références App Configuration à Key Vault. La config d’application stocke l’ID de certificat de clé Vault. Vous avez besoin de la méthode parseKeyVaultCertificateIdentifier pour analyser cet ID et obtenir le nom du certificat. Une fois que vous avez le nom du certificat, vous pouvez obtenir le certificat actuel à l’aide du code de ce démarrage rapide.
Étapes suivantes
Dans ce guide de démarrage rapide, vous avez créé un coffre de clés, stocké un certificat et récupéré ce certificat. Pour en savoir plus sur la solution Key Vault et sur la manière de l’intégrer à vos applications, consultez ces articles.
- Lire la vue d’ensemble Azure Key Vault
- Lire la vue d’ensemble des certificats
- Consultez un Tutoriel sur l’accès à Key Vault depuis une application App Service
- Consultez un Tutoriel sur l’accès à Key Vault depuis une machine virtuelle
- Consulter le Guide du développeur Azure Key Vault
- Passer en revue la Vue d’ensemble de la sécurité de Key Vault