PowerShell:为 Exchange Online (Azure) 配置基于证书的身份验证

Jacki

Microsoft Entra ID(例如 Azure AD)支持基于证书的身份验证 (CBA)。这意味着你可以使用证书身份验证自动运行 PowerShell 脚本,无需输入密码,也无需使用 Azure MFA。借助基于证书的身份验证,您不再需要担心在 PowerShell 脚本中安全存储密码或通过 SecretManagement 模块使用第三方保管库存储。

以下介绍了如何使用证书从 PowerShell 脚本针对 Microsoft Entra ID (Azure AD) 和 Exchange Online 进行身份验证。

您必须首先创建一个证书并将其安装在您的计算机上。您可以从 CA 获取证书或颁发自签名证书。在此示例中,我们将使用 New-SelfSignedCertificate cmdlet 创建自签名证书。

生成有效期为3年的自签名证书:

$certvalid = (Get-Date).AddYears(3)
$newcert = New-SelfSignedCertificate -DnsName "pre_prod.woshub.com" -CertStoreLocation "cert:LocalMachineMy" -NotAfter $certvalid -KeySpec KeyExchange -FriendlyName "Azure Microsoft Entra ID PowerShell Auth cert"
$newcert|fl Subject,Thumbprint,NotBefore,NotAfter

复制证书指纹的值。

然后将证书导出到CER和PFX文件:

$newcert | Export-Certificate -FilePath "C:PSazure-auth.cer"
$newcert | Export-PfxCertificate -FilePath "C:PSazure-auth.pfx" -Password $(ConvertTo-SecureString -String "S3dPswrd@123" -AsPlainText -Force)

现在您需要在 Azure Microsoft Entra 中创建一个应用程序:

  1. 登录 Azure 门户并转到 Microsoft Entra ID -> 应用程序注册 ->新注册;
  2. 指定应用程序名称(testCertAuthPowerShell), 选择仅此组织目录中的帐户(单个租户),然后单击登记;
  3. 复制申请(客户 ID)价值;
  4. 然后为您的应用分配权限。前往API权限->添加权限。在此示例中,我们将授予管理 Exchange Online 配置的权限(我的组织使用的 API ->Office 365 在线交换)Azure -> 应用程序权限 ->Exchange.ManageAsApp -> 添加权限 -> 授予管理员同意);
  5. 然后去证书和秘密并从您的计算机上传自签名证书文件;
  6. 接下来,分配交换管理员您的应用程序的角色前往Azure Active Directory -> 角色和管理员-> 选择交换管理员角色 -> 添加分配 -> 从列表中选择您的应用程序 (testCertAuthPowerShell)。

完成后,您可以尝试使用证书从计算机上的 PowerShell 脚本连接到 Exchange Online。请注意,在此示例中,计算机上已安装 Exchange Online PowerShell 模块 (EXO)。

您将需要以下变量的值(之前复制的变量):

$certThumbprint = "9CF05589A4B29BECEE6456F08A76EBC3DC2BC581"
$AzureAppID = "111111-2222-3333-4444-123456789"
$tenant="woshub.onmicrosoft.com"

现在您可以使用证书连接到 Exchange Online 租户:

Connect-ExchangeOnline -AppId $AzureAppID -CertificateThumbprint $certThumbprint -Organization $tenant

连接到 Microsoft Entra ID 时,不会出现密码提示,也不会出现新式身份验证表单。

列出 Exchange 租户中的邮箱:

Get-EXOMailbox

请记住在 PowerShell 脚本末尾添加用于断开 Exchange Online 会话的命令:

Disconnect-ExchangeOnline -Confirm:$false

同样,您也可以为其他 Microsoft 365 服务配置基于证书的身份验证。这里重要的是为您的 Azure 应用程序正确分配权限。

例如,如果您使用 Teams PowerShell 模块,则可以运行以下命令来使用证书进行身份验证:

Connect-MicrosoftTeams -CertificateThumbprint $certThumbprint -ApplicationId $AzureAppID -TenantId $tenant

要将 Azure AD PowerShell 模块与证书结合使用来连接到 Microsoft Entra ID:

推荐阅读:在本地 Exchange 中配置混合现代身份验证

Connect-AzureAD -TenantId $tenant -ApplicationId $AzureAppID -CertificateThumbprint $certThumbprint

详细了解如何在 Azure 中创建应用、分配权限以及在 PowerShell 中使用 Microsoft Graph API。

此外,您可以使用包含受密码保护的私钥的 PFX 文件将证书导入到另一台 Windows 主机。使用证书 MMC 管理单元或 PowerShell 导入证书:

$password = ConvertTo-SecureString -String "S3dPswrd@123" -Force -AsPlainText
Import-PfxCertificate -Password $password -FilePath "C:PSazure-auth.pfx" -CertStoreLocation Cert:CurrentUserMy

然后,您可以在该计算机上的 PowerShell 脚本中使用基于 Azure 证书的身份验证。