Как получить отпечаток сертификата, связанного с субъектом службы в AzureAD, когда sp создается независимо без App и Cred - PullRequest
1 голос
/ 05 февраля 2020

У меня есть участник службы, который я создал, используя приведенную ниже powershell.

$sp3 = New-AzureRmADServicePrincipal `
    -DisplayName "<service-principal-name>" `
    -CertValue $certValue3 `
    -EndDate ([System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($cert3.Certificate.GetExpirationDateString(), [System.TimeZoneInfo]::Local.Id, 'GMT Standard Time'))

, где certValue3 - это Base64String RawCertData. Этот принципал службы работает нормально, и я могу получить токен при использовании сертификата.

После создания субъекта службы в Azure AD, как посмотреть отпечаток сертификата, связанного с субъектом службы, с помощью Powershell ?

Я пробовал это , но я получаю Forbidden при попытке выполнить Get-AzureADApplicationKeyCredential

Я также проверил манифест в Azure Портал в субъект службы, который создается в Azure Active Directory → Регистрация приложений → → Манифест, но узел keyCredentials пуст

"keyCredentials": [],

Обратите внимание, что когда я создаю приложение, используя New-AzureRmADApplication, затем учетные данные New-AzureRmADAppCredential, а затем New-AzureRmADServicePrincipal, я вижу keyCredentials с customKeyIdentifier установленным на отпечаток сертификата. Пример сценария ниже -

$adapp = New-AzureRmADApplication -DisplayName "<application-name>" `
    -HomePage "<home-page-url>" `
    -IdentifierUris "<identifier-url>" `
    -CertValue $certValue `
    -StartDate ([System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($cert.Certificate.GetEffectiveDateString(), [System.TimeZoneInfo]::Local.Id, 'GMT Standard Time')) `
    -EndDate ([System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($cert.Certificate.GetExpirationDateString(), [System.TimeZoneInfo]::Local.Id, 'GMT Standard Time'))

New-AzureRmADAppCredential -ApplicationId $adapp.ApplicationId -CertValue $certValue2 

$sp2 = New-AzureRmADServicePrincipal -ApplicationId $adapp.ApplicationId -DisplayName "<application-name>"

Как получить отпечаток сертификата, связанного с субъектом службы в Azure AD, с использованием powershell, когда субъект службы создается независимо без AzureRmADApplication и AzureRmADAppCredential?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Согласно моему тесту, мы можем использовать следующий Azure API Graph API, чтобы получить ключевые учетные данные sp. CustomKeyIdentifier в KeyCredential - это отпечаток сертификата

GET https://graph.windows.net/<your teanant id>/servicePrincipals/<your sp object id>/keyCredentials?api-version=1.6

Например

  1. Создать sp и получить отпечаток
$tenantId ="<tenant id>"
#use the goabl admin account to login 
Connect-AzureRmAccount -Tenant $tenantId

$certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$certificateObject.Import("E:\Cert\examplecert.pfx","Password0123!", [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet)
Write-Host "the thumbrint of cert"
$certificateObject.Thumbprint

$keyValue = [System.Convert]::ToBase64String($certificateObject.GetRawCertData())

$sp =New-AzureRmADServicePrincipal -DisplayName "jimtestsample" -CertValue $keyValue -EndDate $endDate
$context=Get-AzureRmContext
$token=$context.TokenCache.ReadItems() |Where-Object { ($_.TenantId -eq $tenantId) -and ($_.Resource -eq "https://graph.windows.net/")  }
$accesstoken=$token.AccessToken

$url = "https://graph.windows.net/$tenantId/servicePrincipals/"+$sp.Id+"/keyCredentials?api-version=1.6"

$keyCreds = Invoke-RestMethod -Uri $url  -Method Get -Headers @{"Authorization" = "Bearer $accesstoken"}
Write-Host "--------------------------------------------"
$keyCreds.value | Select-Object customKeyIdentifier

enter image description here

enter image description here

0 голосов
/ 06 февраля 2020

Я проверяю вашу команду, она должна работать. При использовании New-AzADServicePrincipal для создания субъекта службы он автоматически создаст для вас приложение AD (т.е. регистрация приложения), и сертификат также появится в Certificates & secrets вашего приложения AD.

В моем Например, я использую новый модуль Az, для старого модуля AzureRm, который вы использовали, он также должен работать (не совсем уверен, я рекомендую использовать новый модуль Az, потому что модуль AzureRm устарел и не будет обновляться). И убедитесь, что вы ищете правильное приложение AD на портале, потому что DisplayName приложения AD можно повторить.

$cert=New-SelfSignedCertificate -Subject "CN=TodoListDaemonWithCert" -CertStoreLocation "Cert:\CurrentUser\My"  -KeyExportPolicy Exportable -KeySpec Signature
$bin = $cert.RawData
$base64Value = [System.Convert]::ToBase64String($bin)

New-AzADServicePrincipal -DisplayName joy134 -CertValue $base64Value 

enter image description here

Регистрация на портале:

enter image description here

enter image description here

Тогда вы можете использовать Таким образом, вы пытались исправить ошибку Forbidden, ваша учетная запись должна быть как минимум Owner приложения AD, или если ваша учетная запись имеет роль администратора в арендаторе, например, Application administrator, Groups administrator, это также будет работать.

$CustomKeyIdentifier = (Get-AzureADApplicationKeyCredential -ObjectId "<object-id>").CustomKeyIdentifier
$Thumbprint = [System.Convert]::ToBase64String($CustomKeyIdentifier)

enter image description here


Помимо , вы должны отметить, что различные комбинации команд будут привести к другим результатам, см. ссылку . Поэтому при тестировании я рекомендую использовать разные значения параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...