Azure 金鑰保存庫 REST API 錯誤碼

Azure 金鑰保存庫 Web 服務上的作業可能會傳回下列錯誤碼。

HTTP 401:未驗證的要求

401 表示要求未經驗證,金鑰保存庫。

如果:

  • 金鑰保存庫知道呼叫者的身分識別;和
  • 允許呼叫端嘗試存取金鑰保存庫資源。

要求可能會傳回 401 有幾個原因。

沒有附加至要求的驗證權杖

以下是 PUT 要求的範例,設定秘密的值:

PUT https://putreqexample.vault.azure.net//secrets/DatabaseRotatingPassword?api-version=7.0 HTTP/1.1
x-ms-client-request-id: 03d275a2-52a4-4bed-82c8-6fe15165affb
accept-language: en-US
Authorization: Bearer     eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im5iQ3dXMTF3M1hrQi14VWFYd0tSU0xqTUhHUSIsImtpZCI6Im5iQ3dXMTF3M1hrQi14VWFYd0tSU0xqTUhHUSJ9.eyJhdWQiOiJodHRwczovL3ZhdWx0LmF6dXJlLm5ldCIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0Ny8iLCJpYXQiOjE1NDg2OTc1MTMsIm5iZiI6MTU0ODY5NzUxMywiZXhwIjoxNTQ4NzAxNDEzLCJhaW8iOiI0MkpnWUhoODVqaVBnZHF5ZlRGZE5TdHY3bGUvQkFBPSIsImFwcGlkIjoiZmFkN2Q1YjMtNjlkNi00YjQ4LTkyNTktOGQxMjEyNGUxY2YxIiwiYXBwaWRhY3IiOiIxIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvNzJmOTg4YmYtODZmMS00MWFmLTkxYWItMmQ3Y2QwMTFkYjQ3LyIsIm9pZCI6IjM5NzVhZWVkLTdkMDgtNDUzYi1iNmY0LTQ0NWYzMjY5ODA5MSIsInN1YiI6IjM5NzVhZWVkLTdkMDgtNDUzYi1iNmY0LTQ0NWYzMjY5ODA5MSIsInRpZCI6IjcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0NyIsInV0aSI6IjItZ3JoUmtlSWs2QmVZLUxuNDJtQUEiLCJ2ZXIiOiIxLjAifQ.fgubiz1MKqTJTXI8dHIV7t9Fle6FdHrkaGYKcBeVRX1WtLVuk1QVxzIFDlZKLXJ7QPNs0KWpeiWQI9IWIRK-8wO38yCqKTfDlfHOiNWGOpkKddlG729KFqakVf2w0GPyGPFCONRDAR5wjQarN9Bt8I8YbHwZQz_M1hztlnv-Lmsk1jBmech9ujD9-lTMBmSfFFbHcqquev119V7sneI-zxBZLf8C0pIDkaXf1t8y6Xr8CUJDMdlWLslCf3pBCNIOy65_TyGvy4Z4AJryTPBarNBPwOkNAtjCfZ4BDc2KqUZM5QN_VK4foP64sVzUL6mSr0Gh7lQJIL5b1qIpJxjxyQ
User-Agent: FxVersion/4.7.3324.0 OSName/Windows OSVersion/6.2.9200.0 Microsoft.Azure.KeyVault.KeyVaultClient/3.0.3.0
Content-Type: application/json; charset=utf-8
Host: putreqexample.vault.azure.net
Content-Length: 31

{
   "value": "m*gBJ7$Zuoz)"
}

「授權」標頭是資料平面作業的每個呼叫金鑰保存庫所需的存取權杖。 如果標頭遺失,則回應必須是 401。

權杖缺少與其相關聯的正確資源

從 Azure OAUTH 端點要求存取權杖時,必須有稱為「資源」的參數。 對於權杖提供者而言,此值很重要,因為它會將權杖的範圍限定為其預定用途。 所有要存取金鑰保存庫之權杖的資源 https://vault.keyvault.net (沒有尾端斜線)。

權杖已過期

權杖會經過 base64 編碼,而且這些值可以在網站解碼,例如 http://jwt.calebb.net 。 以下是已解碼的上述權杖:

    {
 typ: "JWT",
 alg: "RS256",
 x5t: "nbCwW11w3XkB-xUaXwKRSLjMHGQ",
 kid: "nbCwW11w3XkB-xUaXwKRSLjMHGQ"
}.
{
 aud: "https://vault.azure.net",
 iss: "https://sts.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47/",
 iat: 1548697513,
 nbf: 1548697513,
 exp: 1548701413,
 aio: "42JgYHh85jiPgdqyfTFdNStv7le/BAA=",
 appid: "fad7d5b3-69d6-4b48-9259-8d12124e1cf1",
 appidacr: "1",
 idp: "https://sts.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47/",
 oid: "3975aeed-7d08-453b-b6f4-445f32698091",
 sub: "3975aeed-7d08-453b-b6f4-445f32698091",
 tid: "72f988bf-86f1-41af-91ab-2d7cd011db47",
 uti: "2-grhRkeIk6BeY-Ln42mAA",
 ver: "1.0"
}.
[signature]

我們可以看到此權杖中的許多重要部分:

  • aud (audience):權杖的資源。 請注意,這是 https://vault.azure.net 。 此權杖不適用於未明確符合此值的任何資源,例如 graph。
  • iat (發行于):發行權杖時自 epoch 開始以來的刻度數目。
  • nbf (不是之前):當這個權杖變成有效時,自 epoch 開頭以來的刻度數。
  • exp (到期):自此權杖到期後,自 epoch 開頭以來的刻度數。
  • appid (應用程式識別碼):提出此要求之應用程式識別碼的 GUID。
  • tid (租使用者識別碼):提出此要求之主體之租使用者識別碼的 GUID

請務必在權杖中正確識別所有值,以便要求能夠運作。 如果一切正確,則要求不會產生 401。

疑難排解 401

在對金鑰保存庫提出要求之前,應該先從權杖產生點調查 401。 一般而言,程式碼是用來要求權杖。 一旦收到權杖,它就會傳遞至金鑰保存庫要求。 如果程式碼在本機執行,您可以使用 Fiddler 來擷取對 https://login.microsoftonline.com 的要求/回應。 要求看起來像這樣:


POST https://login.microsoftonline.com/<key vault tenant ID>/oauth2/token HTTP/1.1
Accept: application/json
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: login.microsoftonline.com
Content-Length: 192

resource=https%3A%2F%2Fvault.azure.net&client_id=<registered-app-ID>&client_secret=<registered-app-secret>&client_info=1&grant_type=client_credentials

下列使用者提供的資訊必須正確:

  • 金鑰保存庫租使用者識別碼
  • 資源值設定為 HTTPs%3A%2F%2Fvault.azure.net (URL 編碼)
  • 用戶端識別碼
  • 用戶端密碼

請確定要求的其餘部分幾乎完全相同。

如果您只能取得回應存取權杖,則可以將它解碼,以確保租使用者識別碼、用戶端識別碼(應用程式識別碼)和資源。

HTTP 403:權限不足

HTTP 403 表示已驗證要求(它知道要求身分識別),但身分識別沒有存取要求資源的許可權。 有兩個原因:

  • 身分識別沒有存取原則。
  • 要求資源的 IP 位址未在金鑰保存庫的防火牆設定中核准。

當客戶的應用程式未使用客戶認為的用戶端識別碼時,通常會發生 HTTP 403。 這通常表示無法正確設定實際呼叫身分識別的存取原則。

如果您在將身分識別新增至存取原則之後立即收到 403 錯誤,您可以藉由新增定期重試來處理它。

疑難排解 403

首先,開啟記錄。 如需如何執行此作業的指示,請參閱 Azure 金鑰保存庫記錄

開啟記錄之後,您可以判斷 403 是否因為存取原則或防火牆原則所致。

因為防火牆原則而發生錯誤

「用戶端位址 (00.00.00.00.00) 未獲授權,且呼叫者不是受信任的服務」

「Azure 信任的服務」清單有限。 Azure 網站 不是 受信任的 Azure 服務。 如需詳細資訊,請參閱部落格文章 金鑰保存庫Azure App 服務防火牆 存取。

您必須將 Azure 網站的 IP 位址新增至金鑰保存庫,才能運作。

如果由於存取原則:尋找要求的物件識別碼,並確定物件識別碼符合使用者嘗試指派存取原則的物件。 Microsoft Entra ID 中通常會有多個物件具有相同的名稱,因此選擇正確的物件很重要。 藉由刪除和讀取存取原則,就可以查看多個物件是否存在同名。

此外,大部分的存取原則都不需要使用「已授權的應用程式」,如入口網站所示。 授權的應用程式會用於「代表」驗證案例,這是罕見的。

HTTP 429:太多要求

當要求數目超過指定時間範圍的最大值時,就會進行節流。 如果發生節流,Key Vault 的回應將會是 HTTP 429。 所提出要求類型的最大數目。 例如:建立 HSM 2048 位金鑰是每 10 秒 10 個要求,但所有其他 HSM 交易的限制為 2,000 個要求/10 秒。 因此,請務必瞭解判斷節流原因時,要進行哪種類型的呼叫。 一般而言,對金鑰保存庫的要求限制為 4,000 個要求/10 秒。 例外狀況是金鑰作業,如金鑰保存庫服務限制中所述

疑難排解 429

節流是使用下列技術來解決的:

  • 藉由判斷要求的資源是否有模式,並嘗試在呼叫的應用程式中加以快取,減少對 Key Vault 提出的要求數目。

  • 發生金鑰保存庫節流時,請調整要求程式碼以使用指數輪詢重試。 此處將說明演算法: 如何節流您的應用程式

  • 如果快取無法減少要求數目,且計時輪詢無法運作,請考慮將金鑰分割成多個 Key Vault。 單一訂用帳戶的服務限制是個別 Key Vault 限制的 5 倍。 如果使用五個以上的金鑰保存庫,應該考慮使用多個訂用帳戶。

如需詳細指引,包括增加限制的要求,請參閱這裡: 金鑰保存庫節流指引