ข้ามไปยังเนื้อหาหลัก

คีย์สำหรับลงนาม (Signing keys)

คีย์สำหรับลงนาม OIDC ของ Logto (OIDC signing keys) หรือที่รู้จักกันในชื่อ "OIDC private keys" และ "OIDC cookie keys" คือคีย์ที่ใช้สำหรับลงนาม JWTs (โทเค็นการเข้าถึง (Access tokens) และ โทเค็น ID (ID tokens)) และคุกกี้ของเบราว์เซอร์ใน เซสชันการลงชื่อเข้าใช้ (sign-in sessions) ของ Logto คีย์สำหรับลงนามเหล่านี้จะถูกสร้างขึ้นเมื่อมีการ seed ฐานข้อมูล Logto (โอเพ่นซอร์ส) หรือสร้าง tenant ใหม่ (Cloud) และสามารถจัดการได้ผ่าน CLI (โอเพ่นซอร์ส), Management APIs หรือ Console UI

โดยปกติ Logto จะใช้ อัลกอริทึม elliptic curve (EC) ในการสร้างลายเซ็นดิจิทัล อย่างไรก็ตาม เนื่องจากผู้ใช้มักต้องตรวจสอบลายเซ็นของ JWT และเครื่องมือรุ่นเก่าหลายตัวไม่รองรับอัลกอริทึม EC (รองรับเฉพาะ RSA) เราจึงได้เพิ่มฟีเจอร์สำหรับการหมุนคีย์ส่วนตัว (rotate private keys) และให้ผู้ใช้เลือกอัลกอริทึมสำหรับลายเซ็น (ทั้ง RSA และ EC) เพื่อให้แน่ใจว่าสามารถใช้งานร่วมกับบริการที่ใช้เครื่องมือตรวจสอบลายเซ็นรุ่นเก่าได้

บันทึก:

ตามทฤษฎีแล้ว คีย์สำหรับลงนามไม่ควรถูกเปิดเผยและไม่มีวันหมดอายุ หมายความว่าไม่จำเป็นต้องหมุนคีย์ แต่การหมุนคีย์เป็นระยะหลังจากใช้งานไปช่วงหนึ่งจะช่วยเพิ่มความปลอดภัย

ทำงานอย่างไร?

  • OIDC private key เมื่อเริ่มต้น Logto instance จะมีการสร้างคู่คีย์สาธารณะและคีย์ส่วนตัวโดยอัตโนมัติ และลงทะเบียนไว้ใน OIDC provider ที่อยู่เบื้องหลัง ดังนั้นเมื่อ Logto ออก JWT ใหม่ (โทเค็นการเข้าถึง หรือ โทเค็น ID) โทเค็นจะถูกลงนามด้วยคีย์ส่วนตัว ในขณะเดียวกัน แอปพลิเคชันไคลเอนต์ใด ๆ ที่ได้รับ JWT สามารถใช้คีย์สาธารณะที่จับคู่กันเพื่อตรวจสอบลายเซ็นของโทเค็น เพื่อให้แน่ใจว่าโทเค็นไม่ได้ถูกแก้ไขโดยบุคคลที่สาม คีย์ส่วนตัวจะถูกปกป้องบนเซิร์ฟเวอร์ Logto ส่วนคีย์สาธารณะตามชื่อคือสาธารณะสำหรับทุกคน และสามารถเข้าถึงได้ผ่านอินเทอร์เฟซ /oidc/jwks ของ OIDC endpoint สามารถระบุอัลกอริทึมของคีย์สำหรับลงนามได้ขณะสร้างคีย์ส่วนตัว โดย Logto จะใช้อัลกอริทึม EC (Elliptic Curve) เป็นค่าเริ่มต้น ผู้ดูแลระบบสามารถเปลี่ยนอัลกอริทึมเริ่มต้นเป็น RSA (Rivest-Shamir-Adleman) ได้โดยการหมุนคีย์ส่วนตัว
  • OIDC cookie key เมื่อผู้ใช้เริ่มต้น flow การลงชื่อเข้าใช้หรือสมัครสมาชิก จะมีการสร้าง "OIDC session" บนเซิร์ฟเวอร์ พร้อมกับชุดคุกกี้ของเบราว์เซอร์ ด้วยคุกกี้เหล่านี้ เบราว์เซอร์สามารถร้องขอ Logto Experience API เพื่อดำเนินการโต้ตอบต่าง ๆ ในนามของผู้ใช้ เช่น ลงชื่อเข้าใช้ สมัครสมาชิก และรีเซ็ตรหัสผ่าน อย่างไรก็ตาม แตกต่างจาก JWT คุกกี้จะถูกลงนามและตรวจสอบลายเซ็นโดยบริการ OIDC ของ Logto เองเท่านั้น ไม่จำเป็นต้องใช้การเข้ารหัสแบบอสมมาตร (asymmetric cryptography) ดังนั้นเราจึงไม่มีคีย์สาธารณะคู่กับคีย์สำหรับลงนามคุกกี้ และไม่ใช้อัลกอริทึมการเข้ารหัสแบบอสมมาตร

หมุนคีย์สำหรับลงนามจาก Console UI

Logto มีฟีเจอร์ "Signing Keys Rotation" ซึ่งช่วยให้คุณสร้าง OIDC private key และ cookie key ใหม่ใน tenant ของคุณ

  1. ไปที่ Console > คีย์สำหรับลงนาม (Signing keys) จากนั้นคุณสามารถจัดการทั้ง OIDC private keys และ OIDC cookie keys ได้

  2. หากต้องการหมุนคีย์สำหรับลงนาม ให้คลิกปุ่ม "Rotate private keys" หรือ "Rotate cookie keys" เมื่อหมุนคีย์ส่วนตัว คุณสามารถเลือกอัลกอริทึมสำหรับลายเซ็นได้

  3. คุณจะพบตารางที่แสดงคีย์สำหรับลงนามทั้งหมดที่ใช้งานอยู่ หมายเหตุ: คุณสามารถลบคีย์ก่อนหน้าได้ แต่ไม่สามารถลบคีย์ปัจจุบันได้

    สถานะคำอธิบาย
    ปัจจุบันหมายถึงคีย์นี้กำลังถูกใช้งานอยู่ในแอปพลิเคชันและ API ของคุณ
    ก่อนหน้าหมายถึงคีย์ที่เคยใช้งานมาก่อนแต่ถูกหมุนออกไปแล้ว โทเค็นที่ลงนามด้วยคีย์นี้ยังคงใช้งานได้

โปรดจำไว้ว่าการหมุนคีย์ประกอบด้วย 3 ขั้นตอนดังนี้:

  1. สร้างคีย์สำหรับลงนามใหม่: แอปพลิเคชัน ทั้งหมด และ API ของคุณจะต้องใช้คีย์สำหรับลงนามใหม่นี้
  2. หมุนคีย์ปัจจุบัน: คีย์ที่ใช้งานอยู่จะถูกกำหนดสถานะเป็น "ก่อนหน้า" หลังการหมุน และจะไม่ถูกใช้กับแอปพลิเคชันหรือ API ที่สร้างใหม่ อย่างไรก็ตาม โทเค็นที่ลงนามด้วยคีย์นี้ยังคงใช้งานได้
  3. ลบคีย์ก่อนหน้า: คีย์ที่มีสถานะ "ก่อนหน้า" จะถูกเพิกถอนและลบออกจากตาราง
คำเตือน:

ห้ามหมุนคีย์สำหรับลงนามติดต่อกัน (สองครั้งหรือมากกว่า) เพราะอาจทำให้โทเค็นที่ออกทั้งหมดไม่สามารถใช้งานได้

  • สำหรับผู้ใช้ OSS หลังจากหมุนคีย์สำหรับลงนามแล้ว ต้องรีสตาร์ท Logto instance เพื่อให้คีย์ใหม่มีผล
  • สำหรับผู้ใช้ Cloud คีย์สำหรับลงนามใหม่จะมีผลทันทีหลังการหมุน แต่โปรดตรวจสอบว่าไม่ได้หมุนคีย์สำหรับลงนามติดต่อกันหลายครั้ง

แนะนำอัลกอริทึม EC และ RSA สำหรับการลงนามใน JWT