你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过基于证书的身份验证使用 Azure 服务主体

在创建服务主体时,需选择其使用的登录身份验证的类型。 Azure 服务主体可以使用两种类型的身份验证:基于密码的身份验证基于证书的身份验证

由于基于密码的身份验证的安全限制,因此建议使用基于证书的身份验证。 基于证书的身份验证使你能够使用条件访问策略来采用防钓鱼身份验证,从而更好地保护 Azure 资源。 要详细了解基于证书的身份验证为什么更安全,请参阅基于 Microsoft Entra 证书的身份验证

本教程中的此步骤介绍如何使用服务主体证书访问 Azure 资源。

创建包含新证书的服务主体

若要创建自签名证书以用于身份验证,请使用 --create-cert 参数:

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert

控制台输出:

{
  "appId": "myServicePrincipalID",
  "displayName": "myServicePrincipalName",
  "fileWithCertAndPrivateKey": "certFilePath\certFileName.pem",
  "password": null,
  "tenant": "myOrganizationTenantID"
}

除非将证书存储在 Key Vault 中,否则输出将包括 fileWithCertAndPrivateKey 密钥。 此密钥的值指示所生成的证书的存储位置。 将证书复制到安全位置。 如果无法访问证书的私钥,请重置服务主体凭据

可以使用文本编辑器查看 PEM 文件的内容。 下面是 PEM 文件示例:

Screenshot of PEM file

使用现有证书创建服务主体

使用--cert参数通过现有证书创建服务主体。 任何使用此服务主体的工具都必须有权访问该证书的私钥。 证书应采用 PEM、CER 或 DER 等 ASCII 格式。 请将certi897ficate作为字符串传递,或使用@path格式从文件加载证书。

使用 PEM 文件时,必须将 CERTIFICATE 追加到文件中的 PRIVATE KEY 之后

# create a service principal with the certificate as a string
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert "-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"
# create a service principal with the certificate file location
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert @/path/to/cert.pem

使用 Azure Key Vault

可以添加--keyvault参数,以在 Azure Key Vault 中创建或检索证书。 使用 --keyvault 参数时,还需要 --cert 参数。 在此示例中,--cert值是证书名称。

# Create a service principal storing the certificate in Azure Key Vault
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert \
                         --cert myCertificateName \
                         --keyvault myVaultName
# Create a service principal using an existing certificate in Azure Key Vault
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert myCertificateName \
                         --keyvault myVaultName

在 Azure Key Vault 中检索证书

对于 Azure Key Vault 中存储的证书,请使用 az keyvault secret show 检索证书及其私钥,然后将其转换为 PEM 文件。 在 Azure Key Vault 中,证书机密的名称与证书名称相同。

az keyvault secret download --file /path/to/cert.pfx \
                            --vault-name VaultName \
                            --name CertName \
                            --encoding base64
openssl pkcs12 -in cert.pfx -passin pass: -out cert.pem -nodes

转换现有的 PKCS12 文件

如果已有 PKCS#12 文件,可以使用 OpenSSL 将其转换为 PEM 格式。 如果有密码,请更改 passin 参数。

openssl pkcs12 -in fileName.p12 -clcerts -nodes -out fileName.pem -passin pass:

将证书追加到服务主体

使用az ad sp credential reset 中的--append参数将证书追加到现有服务主体。 默认情况下,此命令会清除所有密码和密钥,因此请谨慎使用。

az ad sp credential reset --id myServicePrincipalID \
                          --append \
                          --cert @/path/to/cert.pem

控制台输出:

Certificate expires yyyy-mm-dd hh:mm:ss+00:00. Adjusting key credential end date to match.
The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli
{
  "appId": "myServicePrincipalID",
  "password": null,
  "tenant": "myOrganizationTenantID"
}

通过证书使用服务主体登录

要使用证书登录,证书必须在本地以 PEM 或 DER 文件的形式存在(采用 ASCII 格式)。 PKCS#12 文件 (.p12/.pfx) 不起作用。 使用 PEM 文件时,必须将私钥证书一起追加到该文件中。 无需像对 az 命令那样使用@作为路径前缀。

az login --service-principal \
         --username myServicePrincipalID \
         --tenant myOwnerOrganizationId \
         --password /path/to/cert

后续步骤

了解如何通过证书使用服务主体后,请继续执行下一步,了解如何检索现有服务主体。