﻿# 如何在 Microsoft Entra ID 中建立一個 100 年都不會過期的 Client Secret 金鑰

我最近的 Azure 與 Azure DevOps 的顧問案很多，我在很多不同客戶與學員之間被問到一個相同的問題，他們問：「在 Azure 建立 Service Principal (服務主體) 並產生 Client Secret 金鑰時，為什麼到期日最長[只能設定 2 年](https://devblogs.microsoft.com/microsoft365dev/client-secret-expiration-now-limited-to-a-maximum-of-two-years/?WT.mc_id=DT-MVP-4015686)？那不就代表 2 年後如果忘記要手動更新，自動化的服務或 Pipeline 不就會自動停擺了嗎？」這個問題其實有標準答案，就是不要建立 Client Secret 金鑰，而是改用 **Managed Identity** (MI) 即可。不過，在你還沒學會 MI 之前，我先教你怎樣建立一個 100 年都不會過期的 Client Secret 金鑰！😆

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/794ade0885d8676a7f00-b28680c1-4d14-46bf-9be7-576eecdfb9e6.webp)

廢話不多說，直接講結論：「**你其實可以透過 Azure PowerShell 建立一個 100 年都不會過期的 Client Secret 金鑰！**」

建立的命令如下：

```powershell
# 登入 Azure 帳戶
Connect-AzAccount

# 建立新的 Azure AD 應用程式
$app = New-AzADApplication -DisplayName "MyNewApplication"

# 指定應用程式的 ID (Client Id)
$appId = $app.AppId

# 建立 Service Principal 服務主體
$sp = New-AzADServicePrincipal -AppId $appId

# 為指定的 Azure AD 應用程式建立新的憑證
$passwordCredential = New-Object -TypeName 'Microsoft.Azure.PowerShell.Cmdlets.Resources.MSGraph.Models.ApiV10.MicrosoftGraphPasswordCredential'
$passwordCredential.DisplayName = 'Created from PowerShell'
$passwordCredential.EndDateTime = [DateTime]::Now.AddYears(100)

# 應用新憑證到應用程式
$appCredential = New-AzADAppCredential -ApplicationId $appId -PasswordCredential $passwordCredential

# 取得你的憑證密碼 (Client Secret)
$appCredential.SecretText
```

建立完成後，你也可以到 Azure PowerShell 查看建立的這筆 Client secret 金鑰，看「到期日」是不是在 100 年以後，這可以讓你工作做到退休都不用去變更服務主體的密碼！😅

![MyNewApplication | Certificates & secrets](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/bc138a6faefeac434098-e57467f0-bbb7-4b95-91d9-7abf7cfd9bb1.jpg)

然而，你要是從 Azure Portal 來建立的話，最長只能設定 2 年，這是因為 Azure Portal 上面的設定是有限制的，原因無他，就是「安全性」物，因為你手動建立的這些 Client Secret，只要有人看的到密碼，就有「保存」與「管理」的需求，當然也就有金鑰外洩的風險。

![從 Azure Portal 來建立 Client secret](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/896e2995bc63d0bd9638-0f51ba09-b6ed-4682-9867-feac1c0ec432.jpg)

### 相關連結

-   [Client Secret expiration now limited to a maximum of two years](https://devblogs.microsoft.com/microsoft365dev/client-secret-expiration-now-limited-to-a-maximum-of-two-years/?WT.mc_id=DT-MVP-4015686)
-   Azure PowerShell
    -   Application
        -   [Get-AzADApplication](https://learn.microsoft.com/en-us/powershell/module/az.resources/get-azadapplication?view=azps-11.3.0&WT.mc_id=DT-MVP-4015686)
        -   [Get-AzADAppCredential](https://learn.microsoft.com/en-us/powershell/module/az.resources/get-azadappcredential?view=azps-11.3.0&WT.mc_id=DT-MVP-4015686)
        -   [New-AzADApplication](https://learn.microsoft.com/en-us/powershell/module/az.resources/new-azadapplication?view=azps-11.3.0&WT.mc_id=DT-MVP-4015686)
        -   [New-AzADAppCredential](https://learn.microsoft.com/en-us/powershell/module/az.resources/new-azadappcredential?view=azps-11.3.0&WT.mc_id=DT-MVP-4015686)
    -   Service Principal
        -   [Get-AzADServicePrincipal](https://learn.microsoft.com/en-us/powershell/module/az.resources/get-azadserviceprincipal?view=azps-11.3.0&WT.mc_id=DT-MVP-4015686)
        -   [Get-AzADSpCredential](https://learn.microsoft.com/en-us/powershell/module/az.resources/get-azadspcredential?view=azps-11.3.0&WT.mc_id=DT-MVP-4015686)
        -   [New-AzADServicePrincipal](https://learn.microsoft.com/en-us/powershell/module/az.resources/new-azadserviceprincipal?view=azps-11.3.0&WT.mc_id=DT-MVP-4015686)
        -   [New-AzADSpCredential](https://learn.microsoft.com/en-us/powershell/module/az.resources/new-azadspcredential?view=azps-11.3.0&WT.mc_id=DT-MVP-4015686)
