你当前正在访问 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
密钥。 此密钥的值指示所生成的证书的存储位置。 将证书复制到安全位置。 该证书包含私钥和公共证书,可用于 az login
该证书。 如果无法访问证书的私钥,请重置服务主体凭据。
可以使用文本编辑器查看 PEM 文件的内容。 下面是 PEM 文件示例:
-----BEGIN PRIVATE KEY-----
MIIEvQ...
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICoT...
-----END CERTIFICATE-----
使用现有证书创建服务主体
使用--cert
参数通过现有证书创建服务主体。 任何使用此服务主体的工具都必须有权访问该证书的私钥。 证书应采用 PEM、CER 或 DER 等 ASCII 格式。 请将证书作为字符串传递,或使用 @path
格式从文件加载证书。 上传证书时,只需要公共证书。 为了获得最佳安全性,请勿包含私钥。 行-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
是可选的。
# 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 "MIICoT..."
# or provide -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- lines
az ad sp create-for-rbac --name myServicePrincipalName \
--role roleName \
--scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
--cert "-----BEGIN CERTIFICATE-----
MIICoT...
-----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
下面是用于上传的 PEM 文件示例:
-----BEGIN CERTIFICATE-----
MIICoT...
-----END CERTIFICATE-----
使用 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: -passout pass: -out cert.pem -nodes
转换现有的 PKCS12 文件
如果已有 PKCS#12 文件,可以使用 OpenSSL 将其转换为 PEM 格式。 如果有密码,请更改 passin
参数。
openssl pkcs12 -in fileName.p12 -clcerts -nodes -out fileName.pem -passin pass: -passout 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 APP_ID --certificate /path/to/cert.pem --tenant TENANT_ID
后续步骤
了解如何通过证书使用服务主体后,请继续执行下一步,了解如何检索现有服务主体。