מדיניות CREATEJWS

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

מה

יוצר JWS חתום, עם קבוצת הצהרות שניתנות להגדרה. לאחר מכן אפשר להחזיר את ה-JWS לקוחות מסוימים, משודרים ליעדים בקצה העורפי או משמשים בדרכים אחרות. מבוא מפורט זמין במאמר סקירה כללית של המדיניות של JWS ו-JWT.

לקבלת מידע על החלקים של JWS ועל אופן ההצפנה והחתימה שלהם, עיינו ב RFC7515.

וידאו

כדאי לצפות בסרטון קצר כדי ללמוד איך יוצרים אסימון JWT חתום. אומנם הסרטון הזה ספציפיים ליצירת JWT, רבים מהמושגים זהים ב-JWS.

דוגמאות

יצירת JWS מצורף חתום באמצעות HS256 אלגוריתם

המדיניות לדוגמה הזו יוצרת JWS מצורף וחותמת עליו באמצעות האלגוריתם HS256. HS256 מסתמך בסוד משותף בשביל חתימה ואימות של החתימה.

קובץ JWS מצורף מכיל את הכותרת, המטען הייעודי (payload) והחתימה המקודדים:

header.payload.signature

כדי ליצור תוכן בנפרד, צריך להגדיר את <DetachContent> כ-True. אפשר לקרוא מידע נוסף בקטע חלקים של JWS/JWT. במבנה ובפורמט של JWS.

משתמשים ברכיב <Payload> כדי לציין את המטען הייעודי (payload) של ה-JWS הגולמי ללא הקידוד. בדוגמה הזו, משתנה מכיל את המטען הייעודי (Payload). כשפעולת המדיניות הזו מופעלת, Edge מקודד את הכותרת ואת המטען הייעודי (payload) של ה-JWS ואז מוסיף את החתימה המקודדת כדי לחתום על ה-JWS באופן דיגיטלי.

בהגדרת המדיניות שבהמשך, נוצר JWS ממטען ייעודי (payload) שכלול במשתנה. private.payload

<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="private.payload" />
    <OutputVariable>jws-variable</OutputVariable>
</GenerateJWS>

יצירה של JWS מנותק החתום באמצעות RS256 אלגוריתם

המדיניות לדוגמה הזו יוצרת JWS נפרד וחותמת עליו באמצעות האלגוריתם RS256. יוצר חתימת RS256 מסתמכת על מפתח פרטי RSA, שחייב להיות בפורמט מקודד PEM.

JWS מנותק משמיט את המטען הייעודי (payload) מה-JWS:

header..signature

משתמשים ברכיב <Payload> כדי לציין את המטען הייעודי (payload) של ה-JWS הגולמי ללא הקידוד. כשהמדיניות הזו מופעלת, Edge מקודד את הכותרת ואת המטען הייעודי (payload) של ה-JWS. ואז משתמש בהם כדי ליצור את החתימה המקודדת. עם זאת, ה-JWS שנוצר משמיט את המטען הייעודי (payload). באחריותך להעביר את המטען הייעודי (payload) למדיניות VerifyJWS באמצעות רכיב <DetachedContent> של מדיניות VerifyJWS.

<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="private.payload" />
    <DetachContent>true</DetachContent>
    <OutputVariable>jws-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> הם אופציונליים.

*מידע נוסף על הדרישות העיקריות זמין מידע על אלגוריתמים להצפנת חתימות

חומר עזר של רכיב ליצירת JWS

בחומר העזר בנושא המדיניות מתוארים הרכיבים והמאפיינים של המדיניות 'יצירת JWS'.

הערה: ההגדרות האישיות משתנות מעט בהתאם להצפנה באלגוריתם שבו אתם משתמשים. בקטע דוגמאות תוכלו לראות דוגמאות שממחישות ולהתאים אותם אישית לתרחישים לדוגמה ספציפיים.

מאפיינים החלה על הרכיב ברמה העליונה

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

המאפיינים הבאים משותפים לכל רכיבי ההורה של המדיניות.

מאפיין תיאור ברירת מחדל נוכחות
שם השם הפנימי של המדיניות. תווים שבהם אפשר להשתמש בשם מוגבלים ל: A-Z0-9._\-$ % עם זאת, בממשק המשתמש לניהול Edge אוכפים פקודות נוספות הגבלות, כגון הסרה אוטומטית של תווים שאינם אלפאנומריים.

אפשר להשתמש ברכיב <displayname></displayname> כדי להוסיף תווית למדיניות בעורך ה-Proxy של ממשק המשתמש לניהול בשפה טבעית אחרת שם.

לא רלוונטי חובה
continueOnError צריך להגדיר את הערך false כדי להחזיר שגיאה כשמדיניות נכשלת. המצב הזה צפוי של רוב כללי המדיניות.

יש להגדיר ל-true כדי שביצוע התהליך יימשך גם לאחר המדיניות נכשל.

false אופציונלי
פעיל צריך להגדיר את הערך true כדי לאכוף את המדיניות.

הגדרת הערך false כ'כיבוי' המדיניות. המדיניות לא תיאכף גם אם הוא נשאר מחובר לזרימה.

true אופציונלי
אסינכרוני המאפיין הזה הוצא משימוש. false הוצא משימוש

&lt;DisplayName&gt;

<DisplayName>Policy Display Name</DisplayName>

שימוש בנוסף למאפיין השם כדי להוסיף תווית למדיניות בעורך ה-Proxy של ממשק המשתמש לניהול בשם אחר בשפה טבעית.

ברירת מחדל אם משמיטים את הרכיב הזה, המערכת תשתמש בערך של מאפיין השם של המדיניות.
נוכחות אופציונלי
סוג מחרוזת

&lt;Algorithm&gt;

<Algorithm>algorithm-here</Algorithm>

מציינת את אלגוריתם ההצפנה לצורך חתימה על האסימון.

ברירת מחדל לא רלוונטי
נוכחות חובה
סוג מחרוזת
ערכים חוקיים HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512

&lt;AdditionalHeaders/Claim&gt;

<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 – (אופציונלי) אחת מהאפשרויות: מחרוזת (ברירת מחדל), מספר, ערך בוליאני או מפה
  • מערך – (אופציונלי) מגדירים את הערך true כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: לא נכון.

&lt;CriticalHeaders&gt;

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

or:

<CriticalHeaders ref=’variable_containing_headers’/>

מוסיף את הכותרת הקריטית, crit, ל-JWS. הכותרת crit הוא מערך של שמות כותרות שמקלט ה-JWS צריך להיות מוכר ולזהות אותם. לדוגמה:

{
  “typ: “...”,
  “alg” : “...”,
  “crit” : [ “a”, “b”, “c” ],
}

בזמן הריצה, המדיניות שלVerifyJWS בודקת את הכותרת של crit. בכל כותרת שמופיעה בכותרת crit, המערכת בודקת שהרכיב <KnownHeaders> של מדיניות VerifyJWS כוללת גם את הכותרת הזו. כל כותרת שמופיעה במדיניות VerifyJWS ב-crit שלא מופיע גם ב-<KnownHeaders>, גורמת למדיניות VerifyJWS להיכשל.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מערך מחרוזות מופרדות בפסיקים
ערכים חוקיים מערך או שם של משתנה שמכיל את המערך.

&lt;DetachContent&gt;

<DetachContent>true|false</DetachContent>

המדיניות מציינת אם ליצור את ה-JWS עם מטען ייעודי (payload) מנותק, <DetachContent>true</DetachContent>, או לא, <DetachContent>false</DetachContent>.

אם מציינים False, ברירת המחדל, ה-JWS שנוצר מופיע בצורה הבאה:

header.payload.signature

אם מציינים True כדי ליצור מטען ייעודי (payload) מנותק, ה-JWS שנוצר משמיט את המטען הייעודי (Payload) והוא מופיע בפורמט הבא:

header..signature

אם משתמשים במטען ייעודי (payload) מנותק, באחריותך להעביר את המטען הייעודי (payload) המקורי שאינו מקודד למדיניות בנושא VerifyJWS. באמצעות הרכיב <DetachedContent> של המדיניות VerifyJWS.

ברירת מחדל false
נוכחות אופציונלי
סוג בוליאני
ערכים חוקיים נכון או לא נכון

&lt;IgnoreUnresolvedVariables&gt;

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

יש להגדיר את הערך כ-False אם רוצים שהמדיניות תגרור שגיאה כשמצוין משתנה כלשהו שאליו יש הפניה במדיניות לא ניתן לפתור. יש להגדיר את הערך כ-True כדי להתייחס לכל משתנה שלא ניתן לפתרון כמחרוזת ריקה (null).

ברירת מחדל false
נוכחות אופציונלי
סוג בוליאני
ערכים חוקיים נכון או לא נכון

&lt;OutputVariable&gt;

<OutputVariable>JWS-variable</OutputVariable>

מציינת איפה למקם את ה-JWS שנוצר באמצעות המדיניות הזו. כברירת מחדל הוא ממוקם משתנה הזרימה jws.POLICYNAME.generated_jws.

ברירת מחדל jws.POLICYNAME.generated_jws
נוכחות אופציונלי
סוג מחרוזת (שם של משתנה זרימה)

&lt;Payload&gt;

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

or

<Payload>payload-value</Payload>

מציינת את המטען הייעודי (payload) הגולמי של ה-JWS, ללא קידוד. מציינים משתנה שמכיל את המטען הייעודי (payload) או מחרוזת.

ברירת מחדל לא רלוונטי
נוכחות חובה
סוג מחרוזת, מערך בייטים, סטרימינג או כל ייצוג אחר של המטען הייעודי (payload) של JWS ללא קידוד.

&lt;PrivateKey/Id&gt;

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

or

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

מציינת את מזהה המפתח (ילד) שצריך לכלול בכותרת ה-JWS. שימוש בלבד כשהאלגוריתם הוא RS256/RS384/RS512, PS256/PS384/PS512, או ES256/ES384/ES512.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מחרוזת
ערכים חוקיים משתנה או מחרוזת בזרימה

&lt;PrivateKey/Password&gt;

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

מציינים את הסיסמה שתשמש את המדיניות לפענוח המפתח הפרטי, במקרה הצורך. משתמשים ב ref כדי להעביר את המפתח במשתנה זרימה. שימוש בלבד כשהאלגוריתם הוא RS256/RS384/RS512, PS256/PS384/PS512, או ES256/ES384/ES512.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מחרוזת
ערכים חוקיים הפניה למשתנה זרימה.

הערה: חובה לציין משתנה זרימה. אפליקציית Edge תידחה כלא תקינה של המדיניות שבה הסיסמה מצוינת בטקסט ללא הצפנה. משתנה הזרימה חייב לכלול את התחילית "private". לדוגמה, private.mypassword.

&lt;PrivateKey/Value&gt;

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

מציינת מפתח פרטי בקידוד PEM שמשמש לחתימה על ה-JWS. השתמשו במאפיין ref כדי להעביר את במשתנה הזרימה. יש להשתמש רק כאשר האלגוריתם הוא אחד מהערכים RS256/RS384/RS512, PS256/PS384/PS512, או ב-ES256/ES384/ES512.

ברירת מחדל לא רלוונטי
נוכחות נדרש ליצירת JWS באמצעות האלגוריתם RS256.
סוג מחרוזת
ערכים חוקיים משתנה זרימה שמכיל מחרוזת שמייצגת ערך מפתח פרטי של RSA בקידוד PEM.

הערה: משתנה הזרימה חייב לכלול את התחילית "private". לדוגמה, private.mykey

&lt;SecretKey/Id&gt;

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

or

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

מציינת את מזהה המפתח (ילד) שצריך לכלול בכותרת ה-JWS של מסמך JWS שנחתם באמצעות HMAC באלגוריתם כלשהו. יש להשתמש באפשרות הזו רק כאשר האלגוריתם הוא אחד מהפרמטרים הבאים: HS256/HS384/HS512.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מחרוזת
ערכים חוקיים משתנה או מחרוזת בזרימה

&lt;SecretKey/Value&gt;

<SecretKey>
  <Value ref="private.your-variable-name"/>
</SecretKey>

מספקת את המפתח הסודי המשמש לאימות אסימונים או לחתימה עליהם באמצעות אלגוריתם HMAC. שימוש בלבד כשהאלגוריתם הוא אחד משדות HS256/HS384/HS512. שימוש במאפיין ref כדי להעביר את המפתח במשתנה זרימה.

Edge אוכף חוזק מפתח מינימלי באלגוריתמים HS256/HS384/HS512. האורך המינימלי של המפתח ל-HS256 המספר הוא 32 בייט, ל-HS384 הוא 48 בייט ול-HS512 הוא 64 בייט. שימוש במפתח בעוצמה נמוכה יותר גורם לשגיאה בתחילת ההפעלה.

ברירת מחדל לא רלוונטי
נוכחות נדרש לאלגוריתמים של HMAC.
סוג מחרוזת
ערכים חוקיים משתנה זרימה שמפנה למחרוזת

הערה: אם משתנה זרימה, התחילית שלו חייבת להיות 'private'. עבור לדוגמה, private.mysecret

משתני זרימה

המדיניות Generate JWS לא מגדירה משתני זרימה.

התייחסות לשגיאות

בקטע הזה מתוארים קודי התקלות והודעות השגיאה שמוחזרים, ומשתני השגיאה שמוגדרים על ידי Edge כשהמדיניות הזו גורמת לשגיאה. חשוב לדעת את המידע הזה אם אתם מפתחים כללים לטיפול בתקלות. תוכלו למצוא מידע נוסף במאמרים מה צריך לדעת לגבי שגיאות מדיניות וטיפול בפגמים.

שגיאות בזמן ריצה

השגיאות האלה יכולות להתרחש כשהמדיניות מופעלת.

קוד שגיאה סטטוס HTTP מופיע כאשר
steps.jws.GenerationFailed 401 המדיניות לא הצליחה ליצור את ה-JWS.
steps.jws.InsufficientKeyLength 401 למפתח קטן מ-32 בייטים לאלגוריתם HS256
steps.jws.InvalidClaim 401 כאשר חסרה תלונה על הפרת זכויות יוצרים או תלונה על הפרת זכויות יוצרים, או חוסר התאמה בכותרת או בכותרת חסרה.
steps.jws.InvalidCurve 401 העקומה שצוינה על ידי המפתח אינה חוקית עבור האלגוריתם 'עקומה אליפטית'.
steps.jws.InvalidJsonFormat 401 נמצא JSON לא חוקי בכותרת ה-JWS.
steps.jws.InvalidPayload 401 המטען הייעודי של JWS לא חוקי.
steps.jws.InvalidSignature 401 <DetachedContent> לא נכלל וב-JWS יש מטען ייעודי (payload) נפרד.
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 לאלגוריתם Elliptic Curve, או מפתח עקומה לאלגוריתם 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>