คุณกำลังดูเอกสารประกอบ Apigee Edge
ไปที่
เอกสารประกอบเกี่ยวกับ Apigee X. ข้อมูล
หัวข้อนี้ให้ข้อมูลทั่วไปเกี่ยวกับ JWT (JSON Web Token) และ JWS (JSON Web Signature) และนโยบายของ Apigee JWS/JWT ที่นักพัฒนาพร็อกซี Apigee อาจสนใจ
บทนำ
ทั้ง JWS และ JWT มักใช้เพื่อแชร์คำกล่าวอ้างหรือการยืนยันระหว่างความสัมพันธ์ แอปพลิเคชัน นโยบาย JWS/JWT เปิดใช้พร็อกซี Edge API เพื่อดำเนินการต่อไปนี้
- สร้าง JWT ที่ลงนาม หรือ JWS
- ยืนยัน JWT ที่ลงนาม หรือ JWS และการอ้างสิทธิ์ภายใน JWS/JWT
- ถอดรหัส JWT ที่ลงนาม หรือ JWS โดยไม่ตรวจสอบลายเซ็น
ในสองกรณีหลัง นโยบายจะกำหนดตัวแปรที่อนุญาตให้มีนโยบายเพิ่มเติม หรือ แบ็กเอนด์ด้วยตนเอง เพื่อตรวจสอบการกล่าวอ้างที่ผ่านการตรวจสอบแล้ว และเพื่อตัดสินใจโดยอิงตามการอ้างสิทธิ์เหล่านั้น การอ้างสิทธิ์
เมื่อใช้นโยบาย "ยืนยัน JWS/JWT" ระบบจะปฏิเสธ JWS/JWT ที่ไม่ถูกต้องและจะทำให้เกิดข้อผิดพลาด ในทำนองเดียวกัน เมื่อใช้นโยบายถอดรหัส JWS/JWT JWS/JWT ที่มีรูปแบบไม่ถูกต้องจะทำให้เกิดข้อผิดพลาด
วิดีโอ
ชมวิดีโอสั้นๆ เพื่อเรียนรู้ข้อมูลเบื้องต้นเกี่ยวกับ JWT ขณะที่วิดีโอนี้ สำหรับการสร้าง JWT โดยเฉพาะ ซึ่งแนวคิดส่วนใหญ่ของ JWS จะเหมือนกัน
วิดีโอสั้นๆ สำหรับดูข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างของ JWT
กรณีการใช้งาน
คุณใช้นโยบาย JWS/JWT เพื่อทำสิ่งต่อไปนี้ได้
- สร้าง JWS/JWT ใหม่บนด้านในพร็อกซีหรือปลายทางเป้าหมายของพร็อกซี Edge สำหรับ เช่น คุณอาจสร้างโฟลว์คำขอพร็อกซีที่สร้าง JWS/JWT และส่งคืนไปยังไคลเอ็นต์ หรือคุณอาจออกแบบพร็อกซีให้สร้าง JWS/JWT ในขั้นตอนคำขอเป้าหมาย และ แนบไปกับคำขอที่ส่งไปยังเป้าหมาย การอ้างสิทธิ์เหล่านั้นจึงจะเปิดใช้ได้ เพื่อใช้การประมวลผลความปลอดภัยเพิ่มเติม
- ยืนยันและแยกการอ้างสิทธิ์จาก JWS/JWT ที่ได้รับจากคำขอของไคลเอ็นต์ขาเข้าจากเป้าหมาย การตอบกลับบริการ จากการตอบกลับนโยบายคำขอราคาเสนอบริการ หรือจากแหล่งที่มาอื่นๆ Edge จะ ยืนยันลายเซ็นใน JWS/JWT ไม่ว่า JWS/JWT นั้นสร้างโดยบุคคลที่สาม หรือ Edge โดยใช้อัลกอริทึม RSA หรือ HMAC
- ถอดรหัส JWS/JWT การถอดรหัสจะมีประโยชน์มากที่สุดเมื่อใช้ร่วมกับนโยบาย Verify JWS/JWT เมื่อ ต้องทราบค่าของการอ้างสิทธิ์ (JWT) หรือส่วนหัว (JWS/JWT) จากภายใน JWS/JWT ก่อนที่จะยืนยัน JWS/JWT
ส่วนต่างๆ ของ JWS/JWT
JWS/JWT ที่มีการลงชื่อจะเข้ารหัสข้อมูลออกเป็น 3 ส่วนโดยคั่นด้วยจุด ได้แก่ ส่วนหัว เพย์โหลด และ ลายเซ็น:
header.payload.signature
- นโยบาย Generate JWS/JWT สร้างทั้ง 3 ส่วน
- นโยบาย Verify JWS/JWT จะตรวจสอบทั้ง 3 ส่วน
- นโยบายการถอดรหัส JWS/JWT จะตรวจสอบส่วนหัวและเพย์โหลดเท่านั้น
JWS ยังรองรับรูปแบบเดี่ยวที่ไม่มีเพย์โหลดจาก JWS ดังนี้
header..signature
เมื่อใช้ JWS ที่แยกออกมา ระบบจะส่งเพย์โหลดแยกจาก JWS คุณใช้
องค์ประกอบ <DetachedContent>
ของนโยบาย "ยืนยัน JWS" เพื่อระบุเพย์โหลด JWS ที่เป็นข้อมูลดิบและไม่มีการเข้ารหัส
จากนั้นนโยบาย Verify JWS จะยืนยัน JWS โดยใช้ส่วนหัวและลายเซ็นใน JWS และเพย์โหลด
ที่ระบุโดยองค์ประกอบ <DetachedContent>
ดูข้อมูลเพิ่มเติมเกี่ยวกับโทเค็นและวิธีเข้ารหัสและลงนามได้ที่
- JWT: IETF RFC7519
- JWS: IETF RFC7515
ความแตกต่างระหว่าง JWS และ JWT
คุณสามารถใช้ JWT หรือ JWS เพื่อแชร์คำกล่าวอ้างหรือการยืนยันระหว่างแอปพลิเคชันที่เชื่อมต่อได้ ความแตกต่างที่สำคัญระหว่างข้อมูล 2 ประเภทนี้คือการแสดงเพย์โหลด
- JWT
- เพย์โหลดจะเป็นออบเจ็กต์ JSON เสมอ
- เพย์โหลดจะแนบอยู่กับ JWT เสมอ
- ส่วนหัว
typ
ของโทเค็นจะตั้งค่าเป็นJWT
เสมอ
- JWS
- เพย์โหลดอาจแสดงในรูปแบบใดก็ได้ เช่น ออบเจ็กต์ JSON, ไบต์สตรีม, สตรีมอ็อกเท็ต และอื่นๆ
- เพย์โหลดไม่จำเป็นต้องแนบกับ JWS
เนื่องจากรูปแบบ JWT จะใช้ออบเจ็กต์ JSON เพื่อแสดงเพย์โหลดเสมอ Edge Generate JWT และยืนยันว่านโยบาย JWT มีการสนับสนุนในตัวเพื่อจัดการชื่อการอ้างสิทธิ์ที่จดทะเบียนทั่วไป เช่น aud iss, sub และอื่นๆ ซึ่งหมายความว่าคุณสามารถใช้องค์ประกอบของ สร้างนโยบาย JWT เพื่อตั้งค่าการอ้างสิทธิ์เหล่านี้ในเพย์โหลด และองค์ประกอบของนโยบาย Verify JWT เพื่อยืนยันค่า ดูชื่อการอ้างสิทธิ์ที่จดทะเบียน ในข้อกำหนด JWT สำหรับข้อมูลเพิ่มเติม
นโยบาย Generate JWT โดยตรงควบคู่ไปกับการสนับสนุนชื่อการอ้างสิทธิ์ที่จดทะเบียนบางประเภท สนับสนุนการเพิ่มการอ้างสิทธิ์ด้วยชื่อที่กำหนดเองลงใน JWT การอ้างสิทธิ์แต่ละรายการจะเป็นคู่ชื่อ/ค่าง่ายๆ โดยที่ค่าสามารถเป็นประเภทตัวเลข บูลีน สตริง แผนที่ หรืออาร์เรย์
เนื่องจาก JWS ใช้การนำเสนอข้อมูลใดก็ได้สำหรับเพย์โหลด คุณจึงเพิ่มการอ้างสิทธิ์ไปยังเพย์โหลดไม่ได้ นโยบาย Generate JWS รองรับการเพิ่มการอ้างสิทธิ์ที่มีชื่อที่กำหนดเองในส่วนหัวของ JWS นอกจากนี้ นโยบาย JWS ยังรองรับเพย์โหลดที่ถูกแยกออก ซึ่ง JWS จะละเว้นเพย์โหลดดังกล่าว เพย์โหลดที่แยกออกมาจะช่วยให้คุณส่ง JWS และเพย์โหลดแยกกันได้ ซึ่งมาตรฐานความปลอดภัยต่างๆ กำหนดให้ใช้
เกี่ยวกับอัลกอริทึมลายเซ็น
นโยบายการยืนยัน JWS/JWT และนโยบายการสร้าง JWS/JWT รองรับอัลกอริทึม RSA, RSASSA-PSS, ECDSA และ HMAC โดยใช้ SHA2 การตรวจสอบข้อผิดพลาดของความแรงของบิต 256, 384 หรือ 512 นโยบายการถอดรหัส JWS/JWT จะทำงานโดยไม่คำนึงถึง อัลกอริทึมที่ใช้ในการเซ็น JWS/JWT
อัลกอริทึม HMAC
อัลกอริทึม HMAC ใช้ข้อมูลลับที่ใช้ร่วมกัน หรือที่เรียกว่าคีย์ลับ เพื่อสร้าง ลายเซ็น (หรือที่เรียกว่าการเซ็น JWS/JWT) และสำหรับการยืนยันลายเซ็น
ความยาวขั้นต่ำของคีย์ลับขึ้นอยู่กับความแรงของบิตของอัลกอริทึม ดังนี้
- HS256: ความยาวคีย์ขั้นต่ำ 32 ไบต์
- HS386: ความยาวคีย์ขั้นต่ำ 48 ไบต์
- HS512: ความยาวคีย์ขั้นต่ำ 64 ไบต์
อัลกอริทึม RSA
อัลกอริทึม RSA ใช้คู่คีย์สาธารณะ/ส่วนตัวสําหรับลายเซ็นที่เข้ารหัส มี RSA ลายเซ็น, ฝ่ายที่ลงนามจะใช้คีย์ส่วนตัว RSA เพื่อลงนาม JWS/JWT และฝ่ายที่ทำการยืนยันจะใช้ คีย์สาธารณะ RSA ที่ตรงกันเพื่อยืนยันลายเซ็นใน JWS/JWT ไม่มีข้อกำหนดด้านขนาดใน คีย์
อัลกอริทึม RSASSA-PSS
อัลกอริทึม RSASSA-PSS เป็นการอัปเดตอัลกอริทึม RSA RSASSA-PSS ก็ใช้ RSA เช่นเดียวกับ RSS คู่คีย์สาธารณะ/ส่วนตัวสำหรับลายเซ็นการเข้ารหัส คีย์มีรูปแบบเหมือนกับ RSS ฝ่ายที่ลงนามใช้คีย์ส่วนตัวเพื่อลงนาม JWS/JWT และฝ่ายที่ทำการยืนยันจะใช้การจับคู่ที่ตรงกัน คีย์สาธารณะเพื่อยืนยันลายเซ็นใน JWS/JWT ไม่มีข้อกำหนดด้านขนาดสำหรับคีย์
อัลกอริทึม ECDSA
อัลกอริทึมของ Elliptic Curve Digital Signature Algorithm (ECDSA) เป็นวิทยาการเข้ารหัสแบบวงรี ด้วยเส้นโค้ง P-256, P-384 และ P-521 เมื่อคุณใช้อัลกอริทึม ECDSA อัลกอริทึมจะระบุ ประเภทของคีย์สาธารณะและคีย์ส่วนตัวที่คุณต้องระบุ:
อัลกอริทึม | โค้ง | ข้อกำหนดหลัก |
---|---|---|
ES256 | P-256 | คีย์ที่สร้างขึ้นจากกราฟ P-256 (หรือที่เรียกว่า secp256r1 หรือ Prime256v1) |
ES384 | P-384 | คีย์ที่สร้างขึ้นจากกราฟ P-384 (หรือที่เรียกว่า secp384r1) |
ES512 | P-521 | คีย์ที่สร้างขึ้นจากกราฟ P-521 (หรือที่เรียกว่า secp521r1) |
อัลกอริทึมการเข้ารหัสคีย์
นโยบาย JWS/JWT รองรับอัลกอริทึมการเข้ารหัสคีย์ทั้งหมดที่ OpenSSL
การใช้ชุดคีย์เว็บ JSON (JWKS) เพื่อยืนยัน JWS/JWT
เมื่อยืนยัน JWS/JWT ที่ลงชื่อแล้ว คุณจะต้องระบุคีย์สาธารณะที่ ที่เชื่อมโยงกับคีย์ส่วนตัวที่ใช้ลงชื่อโทเค็น คุณมี 2 ตัวเลือกสำหรับ การระบุคีย์สาธารณะเพื่อยืนยันนโยบาย JWS/JWT
- ใช้ค่าคีย์สาธารณะจริง (โดยปกติแล้วจะอยู่ในตัวแปรโฟลว์) หรือ
- ใช้คีย์สาธารณะที่รวมอยู่ใน JWKS
เกี่ยวกับ JWKS
JWKS เป็นโครงสร้าง JSON ที่แสดงชุดคีย์เว็บ JSON (JWK) JWK เป็นข้อมูล JSON ที่แทนคีย์การเข้ารหัส JWK และ JWKS ได้รับการอธิบายไว้ใน RFC7517 ดูตัวอย่าง JKWS ที่ ภาคผนวก A ตัวอย่างชุดคีย์เว็บ JSON
โครงสร้าง JWKS
RFC7517 อธิบายองค์ประกอบหลัก JWKS สำหรับคีย์แต่ละประเภท เช่น "RSA" หรือ "EC" เช่น ขึ้นอยู่กับประเภทคีย์ พารามิเตอร์เหล่านี้อาจรวมถึง
- kty - ประเภทคีย์ เช่น "RSA" หรือ "EC"
- kid (รหัสคีย์) - เป็นค่าใดก็ได้ (ไม่มีค่าซ้ำภายในคีย์) ) หาก JWT ขาเข้ามีรหัสคีย์ซึ่งอยู่ในชุด JWKS นโยบาย จะใช้คีย์สาธารณะที่ถูกต้องในการตรวจสอบลายเซ็น JWS/JWT
ต่อไปนี้คือตัวอย่างองค์ประกอบที่ไม่บังคับและค่าขององค์ประกอบดังกล่าว
- alg - อัลกอริทึมที่สําคัญ โดยต้องตรงกับอัลกอริทึมการลงชื่อใน JWS/JWT
- use - หากมี ต้องเป็น sig
JWKS ต่อไปนี้มีองค์ประกอบและค่าที่จำเป็นและจะใช้ได้กับ Edge (ตั้งแต่ https://www.googleapis.com/oauth2/v3/certs):
{ "keys":[ { "kty":"RSA", "alg":"RS256", "use":"sig", "kid":"ca04df587b5a7cead80abee9ea8dcf7586a78e01", "n":"iXn-WmrwLLBa-QDiToBozpu4Y4ThKdwORWFXQa9I75pKOvPUjUjE2Bk05TUSt7-V7KDjCq0_Nkd-X9rMRV5LKgCa0_F8YgI30QS3bUm9orFryrdOc65PUIVFVxIwMZuGDY1hj6HEJVWIr0CZdcgNIll06BasclckkUK4O-Eh7MaQrqb646ghFlG3zlgk9b2duHbDOq3s39ICPinRQWC6NqTYfqg7E8GN_NLY9srUCc_MswuUfMJ2cKT6edrhLuIwIj_74YGkpOwilr2VswKsvJ7dcoiJxheKYvKDKtZFkbKrWETTJSGX2Xeh0DFB0lqbKLVvqkM2lFU2Qx1OgtTnrw", "e":"AQAB" }, { "kty":"EC", "alg":"ES256", "use":"enc", "kid":"k05TUSt7-V7KDjCq0_N" "crv":"P-256", "x":"Xej56MungXuFZwmk_xccvsMpCtXmqhvEEMCmHyAmKF0", "y":"Bozpu4Y4ThKdwORWFXQa9I75pKOvPUjUjE2Bk05TUSt", } ] }
ออกแบบพร็อกซีเพื่อ ใช้ JWKS
เมื่อได้รับ JWS/JWT จากผู้ออก ผู้ออกคีย์มักจะแทรกรหัสคีย์ (หรือลูก) ลงใน JWS/JWT ส่วนหัว คีย์จะบอกผู้รับ JWS/JWT เกี่ยวกับวิธีค้นหาคีย์สาธารณะหรือคีย์สาธารณะที่จำเป็นต่อการ ตรวจสอบลายเซ็นบน JWS/JWT ที่ลงนามแล้ว
ตัวอย่างเช่น สมมติว่าผู้ออกบัตรลงชื่อใน JWT ด้วยคีย์ส่วนตัว "รหัสคีย์" ระบุ การจับคู่คีย์สาธารณะที่จะใช้เพื่อยืนยัน JWT รายการคีย์สาธารณะมักจะอยู่ที่ ปลายทางที่รู้จักกันดี เช่น https://www.googleapis.com/oauth2/v3/certs
นี่เป็นลำดับพื้นฐานที่ Edge (หรือแพลตฟอร์มที่ทำงานร่วมกับ JWKS) ต้องดำเนินการ ทำงานร่วมกับ JWS/JWT ที่มี JWKS
- ตรวจสอบส่วนหัว JWS/JWT เพื่อค้นหารหัสคีย์ (kid)
- ตรวจสอบส่วนหัว JWS/JWT เพื่อค้นหาอัลกอริทึมการลงชื่อ (alg) เช่น RS256
- เรียกดูรายการคีย์และรหัสจาก JWKS ของปลายทางที่รู้จักกันดีสำหรับผู้ออกใบรับรองที่ระบุ
- ดึงข้อมูลคีย์สาธารณะจากรายการคีย์ที่มีรหัสคีย์ที่ระบุไว้ในส่วนหัว JWS/JWT และด้วยอัลกอริทึมการจับคู่ หากคีย์ JWKS ระบุอัลกอริทึมแล้ว
- ใช้คีย์สาธารณะนี้เพื่อยืนยันลายเซ็นใน JWS/JWT
ในฐานะนักพัฒนาพร็อกซี Edge API คุณต้องทำสิ่งต่อไปนี้เพื่อยืนยัน JWS/JWT
- เรียกดูรายการคีย์และรหัสจากปลายทางที่รู้จักกันดีสำหรับผู้ออกใบรับรองที่ระบุ คุณสามารถ ให้ใช้นโยบายไฮไลต์บริการสำหรับขั้นตอนนี้
- ในนโยบาย "ยืนยัน JWS/JWT" ให้ระบุตำแหน่งของ JWS/JWT ใน
<Source>
และเพย์โหลด JWKS ในองค์ประกอบ<PublicKey/JWKS>
ตัวอย่างเช่น สำหรับนโยบาย VerifyJWT<VerifyJWT name="JWT-Verify-RS256"> <Algorithm>RS256</Algorithm> <Source>json.jwt</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PublicKey> <JWKS ref="public.jwks"/> </PublicKey> <Subject>apigee-seattle-hatrack-montage</Subject> <Issuer>urn://apigee-edge-JWT-policy-test</Issuer> <Audience>urn://c60511c0-12a2-473c-80fd-42528eb65a6a</Audience> <AdditionalClaims> <Claim name="show">And now for something completely different.</Claim> </AdditionalClaims> </VerifyJWT>
นโยบาย Verify JWT ดำเนินการอื่นๆ ทั้งหมดดังต่อไปนี้
- หากไม่พบคีย์ที่มีรหัสคีย์ตรงกับรหัสคีย์ (kid) ที่ยืนยันใน JWT JWKS นโยบาย Verify JWT จะแสดงข้อผิดพลาดและไม่ตรวจสอบ JWT
- ถ้า JWT ขาเข้าไม่มีรหัสคีย์ (kid) ในส่วนหัว การแมป keyid-to-verification-key เป็นไปไม่ได้
ในฐานะผู้ออกแบบพร็อกซี คุณจะเป็นผู้รับผิดชอบในการกำหนดคีย์ที่จะใช้ ซึ่งในบางกรณี อาจเป็นคีย์แบบคงที่และฮาร์ดโค้ด