Share via


搭配憑證式驗證使用 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"
}

除非您將憑證儲存在 金鑰保存庫,否則輸出會包含 fileWithCertAndPrivateKey 金鑰。 此金鑰的值會告訴您產生的憑證儲存位置。 將憑證複製到安全的位置。 如果您無法存取憑證的私密金鑰,請 重設服務主體認證

您可以使用文字編輯器來檢視 PEM 檔案的內容。 以下是 PEM 檔案範例:

Screenshot of PEM file

使用現有的憑證建立服務主體

使用 --cert 參數建立具有現有憑證的服務主體。 任何使用此服務主體的工具都必須能夠存取憑證的私密金鑰。 憑證的格式應為 ASCII 格式,例如 PEM、CER 或 DER。 以字串形式傳遞 certi897ficate ,或使用 @path 格式從檔案載入憑證。

當您使用 PEM 檔案時, 憑證 必須附加至 檔案內的私密金鑰

# 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 金鑰保存庫

--keyvault您可以新增 參數,以在 Azure 金鑰保存庫中建立或擷取憑證。 當您使用 --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 金鑰保存庫擷取憑證

針對儲存在 Azure 金鑰保存庫 中的憑證,使用 az keyvault secret show 擷取其私密金鑰的憑證,並將其轉換為 PEM 檔案。 在 Azure 金鑰保存庫中,憑證秘密的名稱與憑證名稱相同。

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:

將憑證附加至服務主體

--append使用 az ad sp credential reset 中的 參數,將憑證附加至現有的服務主體。 根據預設,此命令會清除所有密碼和金鑰,因此請小心使用。

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"
}

使用憑證使用服務主體登入

若要使用憑證登入,憑證必須以 ASCII 格式以 PEM 或 DER 檔案的形式在本機使用。 PKCS#12 檔案 (.p12/.pfx) 無法運作。 當您使用 PEM 檔案時, 私密金鑰 CERTIFICATE 必須在檔案內一起附加。 您不需要像使用其他 az 命令一樣,在路徑 @ 前面加上前置詞。

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

後續步驟

既然您已瞭解如何使用憑證來處理服務主體,請繼續進行下一個步驟,以瞭解如何擷取現有的服務主體。