GenerateJWS 政策

本頁適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

政策圖示

結果

產生已簽署的 JWS,並提供可設定的陳述式集。接著,JSW 可傳回至用戶端、傳輸至後端目標,或以其他方式使用。如需詳細介紹,請參閱「JWS 和 JWT 政策總覽」。

如要瞭解 JWS 的各個部分,以及如何加密及簽署,請參閱 RFC7515

這項政策是可擴充的政策,視您的 Apigee 授權而定,使用這項政策可能會產生費用或使用量影響。如要瞭解政策類型和使用相關性,請參閱「政策類型」。

影片

請觀看這部短片,瞭解如何產生已簽署的 JWT。雖然這部影片專門說明如何產生 JWT,但許多概念與 JWS 相同。

範例

產生使用 HS256 簽署的 JWS

這個範例政策會產生使用 HS256 演算法簽署的 JWS。HS256 會使用共用密鑰簽署及驗證簽名。這個 JWS 使用「附加」內容,也就是說,編碼的標頭、酬載和簽名會以點號串連,產生最終的 JWS:

[header].[payload].[signature]

使用 <Payload> 元素指定原始未編碼的 JWS 酬載。在本範例中,變數包含酬載。觸發這項政策動作時,Apigee 會對 JWS 標頭和酬載進行編碼,然後加入經過編碼的簽章,為 JWS 簽署數位簽章。

下列政策設定會根據變數 my-payload 中包含的酬載建立 JWS,並將產生的 JWS 儲存在變數 output-variable 中。

<GenerateJWS name="JWS-Generate-HS256">
    <DisplayName>JWS Generate HS256</DisplayName>
    <Algorithm>HS256</Algorithm>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <SecretKey>
        <Value ref="private.secretkey"/>
        <Id>1918290</Id>
    </SecretKey>
    <Payload ref="my-payload"/>
    <OutputVariable>output-variable</OutputVariable>
</GenerateJWS>

產生 HS256 簽署的 JWT

這個範例也會產生 JWS,其中附加的內容是使用 HS256 演算法簽署。在這種情況下,酬載為 JSON。將 typ 標頭設為 JWT 會產生已簽署的 JWS,而這也是已簽署的 JWT。(參考資料)

下列政策設定會根據變數 json-content 中包含的酬載建立 JWS,並將產生的 JWS 儲存在變數 output-variable 中。只有在 json-content 變數包含 JSON 酬載,且該 JSON 酬載中的屬性對 JWT 有效時,結果才會是已簽署的 JWT。舉例來說,如果有 exp 屬性,則必須保留數值。如果有 aud 屬性,則必須是字串或字串陣列。依此類推。如要進一步瞭解 JWT 要求的有效值,請參閱 IETF RFC7519

<GenerateJWS name="JWS-Generate-HS256-JWT">
    <Algorithm>HS256</Algorithm>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <SecretKey>
        <Value ref="private.secretkey"/>
    </SecretKey>
    <Payload ref="json-content"/>
    <AdditionalHeaders>
        <Claim name="typ">JWT</Claim>
    </AdditionalHeaders>
    <OutputVariable>output-variable</OutputVariable>
</GenerateJWS>

產生未連結的 JWS

這個範例政策會產生含有分離內容的 JWS,並使用 RS256 演算法簽署。產生 RS256 簽名需要使用 RSA 私密金鑰,且必須以 PEM 編碼形式提供。

含有分離內容的 JWS 會從產生的 JWS 中省略酬載:

[header]..[signature]

使用 <Payload> 元素指定原始未編碼的 JWS 酬載。觸發這項政策時,Apigee 會將 JWS 標頭和酬載編碼,然後使用這些項目產生已編碼的簽名。不過,產生的 JWS 會省略序列化 JWS 中的已編碼酬載。當簽署內容很大,或為二進位檔案 (例如圖片或 PDF),或兩者皆是時,這項功能就很實用。如要進行驗證,您必須將 JWS 和已簽署內容所包含的酬載,兩者皆傳送給驗證方。如果您使用 VerifyJWS 政策驗證 JWS,可以使用 VerifyJWS 政策的 <DetachedContent> 元素,指定包含酬載的變數。

<GenerateJWS name="JWS-Generate-RS256">
    <DisplayName>JWS Generate RS256</DisplayName>
    <Algorithm>RS256</Algorithm>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <PrivateKey>
        <Value ref="private.privatekey"/>
        <Password ref="private.privatekey-password"/>
        <Id ref="private.privatekey-id"/>
    </PrivateKey>
    <Payload ref="my-payload"/>
    <DetachContent>true</DetachContent>
    <OutputVariable>output-variable</OutputVariable>
</GenerateJWS>

設定關鍵元素

您用來指定用於產生 JWS 的金鑰的元素取決於所選演算法,如以下表格所示:

演算法 重要元素
HS{256/384/512}*
<SecretKey>
  <Value ref="private.secretkey"/>
  <Id>1918290</Id>
</SecretKey>
RS/PS/ES{256/384/512}*
<PrivateKey>
  <Value ref="private.privatekey"/>
  <Password ref="private.privatekey-password"/>
  <Id ref="private.privatekey-id"/>
</PrivateKey>

<Password><Id> 元素為選用項目。

*如要進一步瞭解金鑰規定,請參閱「關於簽名加密演算法」一文。

Generate JWS 的元素參考

政策參考資料會說明「產生 JWS」政策的元素和屬性。

注意:設定會因使用的加密演算法而有所不同。如需特定用途的設定範例,請參閱「範例」。

套用至頂層元素的屬性

<GenerateJWS name="JWS" continueOnError="false" enabled="true" async="false">

以下屬性適用於所有政策父元素。

屬性 說明 預設 在家狀態
名稱 政策的內部名稱。您可以在名稱中使用的字元僅限: A-Z0-9._\-$ %。不過,Apigee UI 會強制執行其他限制,例如自動移除非英數字元的字元。

您可以選擇使用 <displayname></displayname> 元素,在 Apigee UI 代理程式編輯器中為政策加上不同自然語言的名稱標籤。

不適用 必填
continueOnError 將其設為 false,即可在政策失敗時傳回錯誤。這是大多數政策的預期行為。

將其設為 true,即使政策失敗,流程執行作業仍會繼續。

false 選用
已啟用 設為 true 即可強制執行政策。

將其設為 false 可「關閉」政策。即使政策仍附加至流程,也不會強制執行。

選用
非同步 此屬性已淘汰。 false 已淘汰

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

除了使用名稱屬性,您也可以在 Apigee UI 代理程式編輯器中使用其他自然語言名稱標示政策。

預設 如果省略這個元素,系統會使用政策的 name 屬性值。
在家狀態 選用
類型 字串

<Algorithm>

<Algorithm>algorithm-here</Algorithm>

指定用來簽署權杖的加密演算法。

預設 不適用
在家狀態 必填
類型 字串
有效值 HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、ES512、PS256、PS384、PS512

<AdditionalHeaders/Claim>

<AdditionalHeaders>
    <Claim name='claim1'>explicit-value-of-claim-here</Claim>
    <Claim name='claim2' ref='variable-name-here'/>
    <Claim name='claim3' ref='variable-name-here' type='boolean'/>
    <Claim name='claim4' ref='variable-name' type='string' array='true'/>
 </AdditionalHeaders>

將額外的憑證附加資訊名稱/值組放入 JWS 的標頭。

預設 不適用
在家狀態 選用
有效值 您要用於額外聲明的任何值。您可以明確將聲明指定為字串、數字、布林值、地圖或陣列。

<Claim> 元素的屬性如下:

  • name - (必要) 權利要求名稱,也稱為參數。
  • ref - (選用) 流程變數的名稱。如果有此值,政策會使用這個變數的值做為宣告。如果您同時指定 ref 屬性和明確的聲明值,則明確值會是預設值,並在參照的流程變數未解析時使用。
  • type - (選用) 下列任一值:字串 (預設)、數字、布林值或地圖
  • array - (選用) 將此屬性設為 true,表示值是否為類型的陣列。預設值:false。

<CriticalHeaders>

<CriticalHeaders>a,b,c</CriticalHeaders>

or:

<CriticalHeaders ref="variable_containing_headers"/>

將關鍵標頭 crit 新增至 JWS。crit 標頭是標頭名稱的陣列,必須由 JWS 接收器知曉及辨識。舉例來說,您可以使用這個設定元素產生 JWS 標頭,在解碼後會如下所示:

{
  "typ": "...",
  "alg" : "...",
  "hyb" : "some-value-here",
  "crit" : [ "hyb" ],
}

這個 JWS 標頭會斷言 hyb 標頭參數的重要性,且 JWS 的任何收件者都必須瞭解該參數的意義和值。

根據 IETF RFC 7515 的規定,如果收件者無法理解 crit 參數中參照的一或多個參數,就應將 JWS 視為無效並拒絕。在 Apigee 中,VerifyJWS 政策符合此行為。 針對 crit 參數中列出的每個參數,檢查 VerifyJWS 政策的 <KnownHeaders> 元素是否也列出該參數。如果 VerifyJWS 政策在 crit 中找到的標頭未列於 <KnownHeaders> 中,就會導致 VerifyJWS 政策拒絕 JWS。

預設 不適用
在家狀態 選用
類型 以半形逗號分隔的一或多個字串陣列
有效值 陣列或包含陣列的變數參照。

<DetachContent>

<DetachContent>true|false</DetachContent>

指定是否要使用已分離的酬載 (<DetachContent>true</DetachContent>) 或不使用 (<DetachContent>false</DetachContent>) 來產生 JWS。

如果您指定預設值 false,系統產生的 JWS 會採用以下格式:

[header].[payload].[signature]

如果您指定為 true 來建立含有分離酬載的 JWS,系統會省略酬載,並產生以下格式的 JWS:

[header]..[signature]

如果 JWS 使用的是分離酬載,您必須將原始未編碼酬載,連同序列化的 JWS 傳遞給驗證方。

預設 false
在家狀態 選用
類型 布林值
有效值 是或否

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

如果您希望政策在無法解析政策中指定的任何參照變數時擲回錯誤,請將此屬性設為 false。將其設為 true,即可將任何無法解析的變數視為空字串 (空值)。

預設 false
在家狀態 選用
類型 布林值
有效值 是或否

<OutputVariable>

<OutputVariable>output-variable</OutputVariable>

指定政策會使用產生的 JWS 設定的內容變數名稱。根據預設,政策會將 JWS 放入名為 jws.POLICYNAME.generated_jws 的內容變數中。

預設 jws.POLICYNAME.generated_jws
在家狀態 選用
類型 字串 (流程變數名稱)

<Payload>

<Payload ref="flow-variable-name-here" />

or

<Payload>payload-value</Payload>

指定原始未編碼的 JWS 酬載。指定含有酬載的變數或字串。

預設 不適用
在家狀態 必填
類型 未編碼 JWS 酬載的字串、位元組陣列、串流或任何其他表示法。
有效值 訊息範本或包含酬載的變數參照。

<PrivateKey> 元素

這是選用項目,只有在 <Algorithm> 為 RS*、PS* 或 ES* 選項時才會使用。它會指定用於簽署的私密金鑰,以及與私密金鑰相關的其他資訊。此值會在演算法為非對稱演算法時使用。

<PrivateKey>
   <Value ref="private.privatekey"</Value>
</PrivateKey>
預設值: 不適用
外觀狀態: (選用步驟) 不過,您必須加入 <PrivateKey><SecretKey> 元素。如果演算法是 RS*、PS* 或 ES*,請使用 <PrivateKey> 元素;如果演算法是 HS*,請使用 <SecretKey> 元素。
類型: 不適用

<PrivateKey/Id>

<PrivateKey>
  <Id ref="flow-variable-name-here"/>
</PrivateKey>

or

<PrivateKey>
  <Id>your-id-value-here</Id>
</PrivateKey>

指定要納入 JWS 標頭的金鑰 ID (kid)。

預設 不適用
在家狀態 選用
類型 字串
有效值 流程變數或字串

<PrivateKey/Password>

<PrivateKey>
  <Password ref="private.privatekey-password"/>
</PrivateKey>

視需要指定政策應使用的密碼,用於解密私密金鑰。使用 ref 屬性,在流程變數中傳遞鍵。

預設 不適用
在家狀態 選用
類型 字串
有效值

流程變數參照。注意:您必須使用 ref 屬性指定流程變數。如果密碼是以純文字形式指定,Apigee 會將政策設定視為無效。流程變數必須包含「private」前置字元。例如:private.mypassword

<PrivateKey/Value>

<PrivateKey>
  <Value ref="private.variable-name-here"/>
</PrivateKey>

指定用於簽署 JWS 的 PEM 編碼私密金鑰。使用 ref 屬性,在流程變數中傳遞鍵。

預設 不適用
在家狀態 使用這項政策產生 JWS 時,必須使用 RS*、PS* 或 ES* 演算法之一。
類型 字串
有效值 流程變數,其中包含代表 PEM 編碼私密金鑰值的字串。

注意:流程變數必須包含「private」前置字串。例如: private.mykey

<SecretKey>

<SecretKey encoding="base16|hex|base64|base64url" >
  <Id ref="variable-containing-key-id-here">secret-key-id</Id>
  <Value ref="private.variable-here"/>
</SecretKey>

指定產生使用對稱 (HS*) 演算法 (HS256、HS384 或 HS512 其中之一) 的 JWS 時要使用的秘密金鑰。

此元素為選用元素。不過,您必須加入 <PrivateKey><SecretKey> 元素。產生使用非對稱演算法 (RS*、PS* 或 ES*) 簽署的 JWS 時,請使用 <PrivateKey> 元素;產生使用對稱演算法 (HS* 等演算法) 簽署的 JWS 時,請使用 <SecretKey> 元素。

<SecretKey> 的子項

下表說明 <SecretKey> 的子元素和屬性:

子項 存在必要性 說明
編碼 (屬性) 選用

指定在參照變數中如何編碼金鑰。根據預設,如果沒有 encoding 屬性,系統會將金鑰的編碼視為 UTF-8。有效值為十六進位、base16、base64 或 base64url。編碼值「hex」和「base16」是同義詞。

<SecretKey encoding="hex" >
  <Id ref="variable-containing-key-id-here">secret-key-id</Id>
  <Value ref="private.secretkey"/>
</SecretKey>

在上述範例中,由於編碼為 hex,如果變數 private.secretkey 的內容為 494c6f766541504973,則索引鍵會解碼為一組 9 個位元組,以十六進制表示為 49 4c 6f 76 65 41 50 49 73

Id (元素) 選用

金鑰 ID。這個值可以是任何字串。您可以使用 ref 屬性,將值指定為常值文字值,或間接透過變數參照來指定。

<SecretKey>
  <Id ref="flow-variable-name-here"/>
  <Value ref="private.variable-here"/>
</SecretKey>

or

<SecretKey>
  <Id>your-id-value-here</Id>
  <Value ref="private.variable-here"/>
</SecretKey>

這項政策會在產生的 JWS 標頭中,將此金鑰 ID 納入為 kid 宣告。

值 (元素) 必填

已編碼的密鑰。指定用來簽署酬載的密鑰。使用 ref 屬性,透過變數 (例如 private.secret-key) 間接提供鍵。

<SecretKey>
  <Id ref="flow-variable-name-here"/>
  <Value ref="private.my-secret-variable"/>
</SecretKey>

Apigee 會強制執行 HS256/HS384/HS512 演算法的最低金鑰強度。HS256 的金鑰長度下限為 32 個位元組,HS384 為 48 個位元組,HS512 為 64 個位元組。使用強度較低的金鑰會導致執行階段錯誤。

<Type>

<Type>type-string-here</Type>

選用元素,其唯一允許的值為 Signed,可指定政策產生已簽署的 JWS。<Type> 只是為了與 GenerateJWT 和 VerifyJWT 政策的對應元素相符 (可採用 SignedEncrypted 的任一值)。

預設 不適用
在家狀態 選用
類型 字串
有效值 Signed

流程變數

「產生 JWS」政策不會設定流程變數。

錯誤參考資料

本節說明這項政策觸發錯誤時,Apigee 傳回的錯誤代碼和錯誤訊息,以及 Apigee 設定的錯誤變數。如果您要開發錯誤處理規則,就必須瞭解這項資訊。如需更多資訊,請參閱「政策錯誤的相關資訊」和「處理錯誤」。

執行階段錯誤

政策執行時可能會發生這些錯誤。

錯誤代碼 HTTP 狀態 發生時機
steps.jws.GenerationFailed 401 政策無法產生 JWS。
steps.jws.InsufficientKeyLength 401 針對 HS256 演算法,金鑰長度必須小於 32 位元組
steps.jws.InvalidClaim 401 缺少聲明或聲明不相符,或是缺少標頭或標頭不相符。
steps.jws.InvalidCurve 401 金鑰指定的曲線不適用於橢圓曲線演算法。
steps.jws.InvalidJsonFormat 401 JWS 標頭中發現無效的 JSON。
steps.jws.InvalidPayload 401 JWS 酬載無效。
steps.jws.InvalidSignature 401 <DetachedContent> 已省略,且 JWS 具有分離的內容酬載。
steps.jws.KeyIdMissing 401 驗證政策使用 JWKS 做為公開金鑰來源,但已簽署的 JWS 不會在標頭中加入 kid 屬性。
steps.jws.KeyParsingFailed 401 無法從指定的金鑰資訊剖析公開金鑰。
steps.jws.MissingPayload 401 缺少 JWS 酬載。
steps.jws.NoAlgorithmFoundInHeader 401 發生於 JWS 省略演算法標頭時。
steps.jws.SigningFailed 401 在 GenerateJWS 中,金鑰大小小於 HS384 或 HS512 演算法的最小大小
steps.jws.UnknownException 401 發生不明例外狀況。
steps.jws.WrongKeyType 401 指定的金鑰類型有誤。例如,如果您為橢圓曲線演算法指定 RSA 金鑰,或為 RSA 演算法指定曲線金鑰。

部署錯誤

部署含有這項政策的 Proxy 時,可能會發生這些錯誤。

錯誤名稱 發生時機
InvalidAlgorithm 唯一有效的值為 RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512, HS256, HS384, HS512

EmptyElementForKeyConfiguration

FailedToResolveVariable

InvalidConfigurationForActionAndAlgorithmFamily

InvalidConfigurationForVerify

InvalidEmptyElement

InvalidFamiliesForAlgorithm

InvalidKeyConfiguration

InvalidNameForAdditionalClaim

InvalidNameForAdditionalHeader

InvalidPublicKeyId

InvalidPublicKeyValue

InvalidSecretInConfig

InvalidTypeForAdditionalClaim

InvalidTypeForAdditionalHeader

InvalidValueForElement

InvalidValueOfArrayAttribute

InvalidVariableNameForSecret

MissingConfigurationElement

MissingElementForKeyConfiguration

MissingNameForAdditionalClaim

MissingNameForAdditionalHeader

其他可能的部署錯誤。

錯誤變數

系統會在發生執行階段錯誤時設定這些變數。詳情請參閱重要須知 政策錯誤。

變數 地點 範例
fault.name="fault_name" fault_name 是錯誤的名稱,如上方「執行階段錯誤」表格所列。錯誤名稱是錯誤程式碼的最後部分。 fault.name Matches "TokenExpired"
JWS.failed 如果作業失敗,所有 JWS 政策都會設定相同的變數。 jws.JWS-Policy.failed = true

錯誤回應範例

針對錯誤處理,最佳做法是將錯誤的 errorcode 部分加以包裝 回應。請勿參考 faultstring 中的文字,因為可能會變動。

錯誤規則範例

<FaultRules>
    <FaultRule name="JWS Policy Errors">
        <Step>
            <Name>JavaScript-1</Name>
            <Condition>(fault.name Matches "TokenExpired")</Condition>
        </Step>
        <Condition>JWS.failed=true</Condition>
    </FaultRule>
</FaultRules>