Ajouter un certificat à une application à l’aide de Microsoft Graph
Article
9 minutes de lecture
Azure Active Directory (Azure AD) prend en charge trois types d’informations d’identification pour authentifier les applications et les principaux de service : les mots de passe (secrets d’application), les certificats et les informations d’identification d’identité fédérée. Si vous ne pouvez pas utiliser d’informations d’identification d’identité fédérée pour votre application, nous vous recommandons vivement d’utiliser des certificats au lieu de secrets.
Cet article fournit des conseils pour l’utilisation de scripts Microsoft Graph et PowerShell pour mettre à jour les informations d’identification de certificat par programme pour une inscription d’application.
Conditions préalables
Pour suivre ce didacticiel, vous avez besoin des ressources et privilèges suivants :
Un locataire Azure AD actif.
Un client API tel que l’Explorateur Graph. Connectez-vous en tant qu’utilisateur dans un rôle Administrateur d’application ou utilisateur autorisé à créer et gérer des applications dans le locataire.
L’utilisation de certificats est fortement recommandée par rapport aux secrets. Toutefois, nous vous déconseillons d’utiliser des certificats auto-signés. Ils peuvent réduire la barre de sécurité de votre application en raison de divers facteurs tels que l’utilisation d’un hachage et de suites de chiffrement obsolètes ou l’absence de validation. Nous vous recommandons d’obtenir des certificats auprès d’une autorité de certification approuvée connue.
Étape 1 : Lire les détails du certificat
Pour ajouter un certificat par programmation à l’aide de Microsoft Graph, vous avez besoin de la clé du certificat. Vous pouvez éventuellement ajouter l’empreinte numérique du certificat.
[Facultatif] Obtenir l’empreinte numérique du certificat
Il est facultatif d’ajouter l’empreinte numérique du certificat à la charge utile de la demande. Si vous souhaitez ajouter l’empreinte numérique, vous pouvez exécuter la requête PowerShell suivante pour lire l’empreinte numérique du certificat. Cette demande suppose que vous avez généré et exporté le certificat vers votre lecteur local.
Demande
Get-PfxCertificate -Filepath "C:\Users\admin\Desktop\20230112.cer" | Out-File -FilePath "C:\Users\admin\Desktop\20230112.cer.thumbprint.txt" ## Replace the file path with the source of your certificate
Réponse
La sortie enregistrée dans le fichier .txt peut ressembler à ce qui suit.
Pour lire la clé du certificat à l’aide de PowerShell, exécutez la requête suivante.
Demande
[convert]::ToBase64String((Get-Content C:\Users\admin\Desktop\20230112.cer -Encoding byte)) | Out-File -FilePath "C:\Users\admin\Desktop\20230112.key.txt" ## Replace the file path with the location of your certificate
Réponse
La sortie enregistrée dans le fichier .txt peut ressembler à ce qui suit.
Note: La clé présentée ici a été raccourcie pour plus de lisibilité.
Étape 2 : Ajouter les détails du certificat à l’aide de Microsoft Graph
Demande
La requête suivante ajoute les détails du certificat à une application. Les paramètres sont les suivants :
StartDateTime est la date à laquelle ou après la création du certificat.
La valeur endDateTime peut être d’un an au maximum à partir de startDateTime. S’il n’est pas spécifié, le système attribue automatiquement une date un an après startDateTime.
Le type et l’utilisation doivent être AsymmetricX509Cert et Verify respectivement.
Affectez le nom de l’objet du certificat à la propriété displayName .
La clé est la valeur encodée en Base64 que vous avez générée à l’étape précédente.
Remarque
Si votre application dispose d’un certificat valide existant que vous souhaitez continuer à utiliser pour l’authentification, incluez les détails du certificat actuel et du nouveau dans l’objet keyCredentials de l’application. Étant donné qu’il s’agit d’un appel PATCH, qui, par protocole, remplace le contenu de la propriété par les nouvelles valeurs, seul le nouveau certificat remplace les certificats existants par le nouveau.
L’exemple suivant ajoute un nouveau certificat et remplace tous les certificats existants.
Note: La clé présentée ici a été raccourcie pour plus de lisibilité.
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Application
{
KeyCredentials = new List<KeyCredential>
{
new KeyCredential
{
EndDateTime = DateTimeOffset.Parse("2024-01-11T15:31:26Z"),
StartDateTime = DateTimeOffset.Parse("2023-01-12T15:31:26Z"),
Type = "AsymmetricX509Cert",
Usage = "Verify",
Key = Convert.FromBase64String("base64MIIDADCCAeigAwIBAgIQP6HEGDdZ65xJTcK4dCBvZzANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMjAeFw0yMzAxMTIwODExNTZaFw0yNDAxMTIwODMxNTZaMBMxETAPBgNVBAMMCDIwMjMwMTEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAseKf1weEacJ67D6/...laxQPUbuIL+DaXVkKRm1V3GgIpKTBqMzTf4tCpy7rpUZbhcwAFw6h9A=="),
DisplayName = "CN=20230112",
},
},
};
var result = await graphClient.Applications["{application-id}"].PatchAsync(requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new Application();
$keyCredentialsKeyCredential1 = new KeyCredential();
$keyCredentialsKeyCredential1->setEndDateTime(new DateTime('2024-01-11T15:31:26Z'));
$keyCredentialsKeyCredential1->setStartDateTime(new DateTime('2023-01-12T15:31:26Z'));
$keyCredentialsKeyCredential1->setType('AsymmetricX509Cert');
$keyCredentialsKeyCredential1->setUsage('Verify');
$keyCredentialsKeyCredential1->setKey(base64_decode('base64MIIDADCCAeigAwIBAgIQP6HEGDdZ65xJTcK4dCBvZzANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMjAeFw0yMzAxMTIwODExNTZaFw0yNDAxMTIwODMxNTZaMBMxETAPBgNVBAMMCDIwMjMwMTEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAseKf1weEacJ67D6/...laxQPUbuIL+DaXVkKRm1V3GgIpKTBqMzTf4tCpy7rpUZbhcwAFw6h9A=='));
$keyCredentialsKeyCredential1->setDisplayName('CN=20230112');
$keyCredentialsArray []= $keyCredentialsKeyCredential1;
$requestBody->setKeyCredentials($keyCredentialsArray);
$requestResult = $graphServiceClient->applicationsById('application-id')->patch($requestBody);
L’exemple suivant ajoute un nouveau certificat sans remplacer le certificat existant identifié par l’empreinte 52ED9B5038A47B9E2E2190715CC238359D4F8F73numérique .
Note: La clé présentée ici a été raccourcie pour plus de lisibilité.
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new Application();
$keyCredentialsKeyCredential1 = new KeyCredential();
$keyCredentialsKeyCredential1->setEndDateTime(new DateTime('2024-01-11T15:31:26Z'));
$keyCredentialsKeyCredential1->setStartDateTime(new DateTime('2023-01-12T09:31:26Z'));
$keyCredentialsKeyCredential1->setType('AsymmetricX509Cert');
$keyCredentialsKeyCredential1->setUsage('Verify');
$keyCredentialsKeyCredential1->setKey(base64_decode('base64MIIDADCCAeigAwIBAgIQejfrj3S974xI//npv7hFHTANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExNDAeFw0yMzAxMTIwOTA4NThaFw0yNDAxMTIwOTI4NThaMBMxETAPBgNVBAMMCDIwMjMwMTE0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5vEj6j1l5wOVHR4eDGe77HWslaIVJ1NqxrXPm/...+R+U7sboj+kUvmFzXI+Ge73Liu8egL2NzOHHpO43calWgq36a9YW1yhBQR1ioEchu6jmudW3rF6ktmVqQ=='));
$keyCredentialsKeyCredential1->setDisplayName('CN=20230114');
$keyCredentialsArray []= $keyCredentialsKeyCredential1;
$keyCredentialsKeyCredential2 = new KeyCredential();
$keyCredentialsKeyCredential2->setCustomKeyIdentifier(base64_decode('52ED9B5038A47B9E2E2190715CC238359D4F8F73'));
$keyCredentialsKeyCredential2->setType('AsymmetricX509Cert');
$keyCredentialsKeyCredential2->setUsage('Verify');
$keyCredentialsKeyCredential2->setKey(base64_decode('base64MIIDADCCAeigAwIBAgIQfoIvchhpToxKEPI4iMrU1TANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMzAeFw0yMzAxMTIwODI3NTJaFw0yNDAxMTIwODQ3NTJaMBMxETAPBgNVBAMMCDIwMjMwMTEzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw+iqg1nMjYmFcFJh/.../S5X6qoEOyJBgtfpSBANWAdA=='));
$keyCredentialsKeyCredential2->setDisplayName('CN=20230113');
$keyCredentialsArray []= $keyCredentialsKeyCredential2;
$requestBody->setKeyCredentials($keyCredentialsArray);
$requestResult = $graphServiceClient->applicationsById('application-id')->patch($requestBody);
Vous avez utilisé Microsoft Graph pour mettre à jour les informations d’identification de certificat d’un objet d’application. Ce processus est une alternative programmatique à l’utilisation de la Portail Azure. Vous pouvez également mettre à jour les informations d’identification de certificat pour un principal de service en suivant un processus similaire et en appelant le point de https://graph.microsoft.com/v1.0/servicePrincipals/ terminaison.