Service Principal的preferredTokenSigningKeyThumbprint与证书关联匹配问题
解决preferredTokenSigningKeyThumbprint与keyCredentials证书指纹不匹配的问题
问题根源
preferredTokenSigningKeyThumbprint返回的是十六进制字符串格式的证书指纹,而你当前对keyCredentials.CustomKeyIdentifier使用[System.Convert]::ToBase64String()转换,得到的是Base64格式的字符串,两种格式天然不匹配。
修复后的PowerShell函数
把ThumbPrint字段的转换逻辑改成将字节数组转为十六进制字符串,就能和preferredTokenSigningKeyThumbprint的格式统一:
Function Get-MgEnterpriseAppSamlInfo { try { $servicePrincipalsList = Get-MgServicePrincipal -Filter "preferredSingleSignOnMode eq 'saml'" $servicePrincipals = @() foreach ($ServicePrincipal in $servicePrincipalsList) { foreach ($Cert in $ServicePrincipal.keyCredentials) { # 将CustomKeyIdentifier字节数组转为十六进制指纹字符串 $thumbprintHex = -join ($Cert.CustomKeyIdentifier | ForEach-Object { $_.ToString("X2") }) $servicePrincipals += [PSCustomObject]@{ DisplayName = $ServicePrincipal.DisplayName KeyType = 'SAML {0} Certificate' -f $cert.usage ExpirationDate = $Cert.endDateTime DaysUntilExpiration = (($Cert.EndDateTime) - (Get-Date) | Select-Object -ExpandProperty TotalDays) -as [int] preferredTokenSigningKeyThumbprint = $ServicePrincipal.preferredTokenSigningKeyThumbprint ThumbPrint = $thumbprintHex Description = $Cert.DisplayName } } } Write-Output $servicePrincipals | Sort-Object DaysUntilExpiration } catch { Write-Error $_.Exception.Message } }
关联首选签名证书的方法
修复格式后,直接对比结果中的preferredTokenSigningKeyThumbprint和ThumbPrint字段值:
- 当两者值完全相等时,该条记录对应的证书就是当前Service Principal设置的首选令牌签名证书
- 注意:一个Service Principal可能有多个证书(Sign/Verify用途),只有签名用途(
KeyType为SAML Sign Certificate)且指纹匹配的才是有效首选签名证书
内容的提问来源于stack exchange,提问作者Claus-Ole Olsen
相关产品推荐
相关产品推荐

