Добавление сертификата в приложение с помощью Microsoft Graph
Статья
Azure Active Directory (Azure AD) поддерживает три типа учетных данных для проверки подлинности приложений и субъектов-служб: пароли (секреты приложений), сертификаты и учетные данные федеративного удостоверения. Если вы не можете использовать учетные данные федеративного удостоверения для приложения, настоятельно рекомендуется использовать сертификаты вместо секретов.
В этой статье содержатся рекомендации по использованию сценариев Microsoft Graph и PowerShell для программного обновления учетных данных сертификата для регистрации приложения.
Предварительные требования
Для работы с этим руководством вам потребуются следующие ресурсы и привилегии:
Активный клиент Azure AD.
Клиент API, например Graph Обозреватель. Войдите как пользователь с ролью администратора приложений или пользователь, которому разрешено создавать приложения в клиенте и управлять ими.
Настоятельно рекомендуется использовать сертификаты вместо секретов; Однако мы не рекомендуем использовать самозаверяемые сертификаты. Они могут снизить уровень безопасности приложения из-за различных факторов, таких как использование устаревших наборов хэша и шифров или отсутствие проверки. Рекомендуется приобретать сертификаты из хорошо известного доверенного центра сертификации.
Шаг 1. Чтение сведений о сертификате
Чтобы добавить сертификат программным способом с помощью Microsoft Graph, вам потребуется ключ сертификата. При необходимости можно добавить отпечаток сертификата.
[Необязательно] Получение отпечатка сертификата
Необязательно добавить отпечаток сертификата в полезные данные запроса. Если вы хотите добавить отпечаток, можно выполнить следующий запрос PowerShell, чтобы прочитать отпечаток сертификата. Этот запрос предполагает, что вы создали и экспортировали сертификат на локальный диск.
Запрос
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
Отклик
Выходные данные, сохраненные в файле.txt , могут выглядеть следующим образом.
Чтобы прочитать ключ сертификата с помощью PowerShell, выполните следующий запрос.
Запрос
[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
Отклик
Выходные данные, сохраненные в файле.txt , могут выглядеть следующим образом.
Примечание: Показанный здесь ключ был сокращен для удобства чтения.
Шаг 2. Добавление сведений о сертификате с помощью Microsoft Graph
Запрос
Следующий запрос добавляет сведения о сертификате в приложение. Ниже приведены параметры.
StartDateTime — это дата создания или после создания сертификата.
Значение endDateTime может быть не более одного года с момента началаDateTime. Если это не указано, система автоматически назначит дату через год после startDateTime.
Тип и использование должны быть AsymmetricX509Cert и Verify соответственно.
Назначьте имя субъекта сертификата свойству displayName .
Ключ — это значение в кодировке Base64, созданное на предыдущем шаге.
Примечание.
Если в вашем приложении есть действительный сертификат, который вы хотите продолжать использовать для проверки подлинности, добавьте сведения о текущем и новом сертификате в объект keyCredentials приложения. Так как это вызов PATCH, который по протоколу заменяет содержимое свойства новыми значениями, включая только новый сертификат, заменит существующие сертификаты новым.
В следующем примере добавляется новый сертификат и заменяются все существующие сертификаты.
Примечание: Показанный здесь ключ был сокращен для удобства чтения.
// Code snippets are only available for the latest version. Current version is 5.x
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);
$result = $graphServiceClient->applications()->byApplicationId('application-id')->patch($requestBody);
В следующем примере добавляется новый сертификат, не заменяя существующий сертификат, идентифицируемый отпечатком 52ED9B5038A47B9E2E2190715CC238359D4F8F73.
Примечание: Показанный здесь ключ был сокращен для удобства чтения.
// Code snippets are only available for the latest version. Current version is 5.x
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-12T09:31:26Z"),
Type = "AsymmetricX509Cert",
Usage = "Verify",
Key = Convert.FromBase64String("base64MIIDADCCAeigAwIBAgIQejfrj3S974xI//npv7hFHTANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExNDAeFw0yMzAxMTIwOTA4NThaFw0yNDAxMTIwOTI4NThaMBMxETAPBgNVBAMMCDIwMjMwMTE0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5vEj6j1l5wOVHR4eDGe77HWslaIVJ1NqxrXPm/...+R+U7sboj+kUvmFzXI+Ge73Liu8egL2NzOHHpO43calWgq36a9YW1yhBQR1ioEchu6jmudW3rF6ktmVqQ=="),
DisplayName = "CN=20230114",
},
new KeyCredential
{
CustomKeyIdentifier = Convert.FromBase64String("52ED9B5038A47B9E2E2190715CC238359D4F8F73"),
Type = "AsymmetricX509Cert",
Usage = "Verify",
Key = Convert.FromBase64String("base64MIIDADCCAeigAwIBAgIQfoIvchhpToxKEPI4iMrU1TANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMzAeFw0yMzAxMTIwODI3NTJaFw0yNDAxMTIwODQ3NTJaMBMxETAPBgNVBAMMCDIwMjMwMTEzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw+iqg1nMjYmFcFJh/.../S5X6qoEOyJBgtfpSBANWAdA=="),
DisplayName = "CN=20230113",
},
},
};
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-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);
$result = $graphServiceClient->applications()->byApplicationId('application-id')->patch($requestBody);
Вы использовали Microsoft Graph для обновления учетных данных сертификата для объекта приложения. Этот процесс является программной альтернативой использованию портал Azure. Вы также можете обновить учетные данные сертификата для субъекта-службы, выполнив аналогичный процесс и вызвав конечную точку https://graph.microsoft.com/v1.0/servicePrincipals/ .