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

แก้ปัญหา YubiKey สองตัวกับคำขอ PIN ซ้ำซ้อนบน Git

เจาะลึกปัญหาการใช้ YubiKey สองตัวที่ทำให้ git push ต้องพิมพ์ PIN ซ้ำซ้อน และวิธีแก้ปัญหาด้วย OpenSSH Match exec และ IdentitiesOnly

เรียบเรียงโดย AI
Inewgen
21 Aug 2026ที่มา: Dev.to3 นาทีอ่าน (0 ครั้ง)
แชร์
แก้ปัญหา YubiKey สองตัวกับคำขอ PIN ซ้ำซ้อนบน Git

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ขนาดตัวอักษร
  • ผู้เขียนใช้ YubiKey สองตัวโดยลงทะเบียนไว้กับบริการสำคัญทั้งหมดเพื่อความปลอดภัย
  • คำสั่ง git push บางครั้งต้องใส่ PIN ซ้ำสองรอบเนื่องจาก SSH สุ่มเลือกคีย์สลับกัน
  • การตั้งค่า IdentitiesOnly yes และ Match exec ในไฟล์ config ช่วยจำกัดคีย์ที่ใช้งาน
  • การตรวจสอบซีเรียลนัมเบอร์ผ่าน ykman อาจใช้เวลาถึง 350 มิลลิวินาทีต่อครั้ง

การมีฮาร์ดแวร์โทเค็นสำรองเป็นสิ่งสำคัญเพื่อป้องกันจุดล้มเหลวเดี่ยว แต่นักพัฒนาซอฟต์แวร์รายหนึ่งกลับต้องพบกับความน่ารำคาญเล็กๆ น้อยๆ เมื่อทำการ git push ในแต่ละวัน บางครั้งคำสั่งทำงานได้ทันทีด้วยการใส่ PIN เพียงครั้งเดียว แต่บางครั้งระบบกลับปฏิเสธและบังคับให้ต้องกรอก PIN อีกรอบ แม้จะเป็นคำสั่ง รีโป และแล็ปท็อปเครื่องเดิมก็ตาม

สาเหตุของปัญหามาจากฮาร์ดแวร์ YubiKey สองตัวที่ผู้เขียนพกพา ตัวหนึ่งติดอยู่กับพวงกุญแจส่วนอีกตัวเก็บไว้ในลิ้นชัก ทั้งคู่ถูกลงทะเบียนประเภท sk-ssh-ed25519 ไว้ และถูกโหลดเข้าสู่ gnome-keyring agent โดยอัตโนมัติ โดยที่ไม่มีการตั้งค่าไฟล์ ~/.ssh/config ไว้ล่วงหน้า ทำให้ SSH ส่งคีย์ทั้งหมดตามลำดับที่เอเจนต์จัดเตรียมไว้ และ GitHub ยอมรับคีย์แรกที่ตรวจพบเสมอ

USB security key plugged into laptop

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

เมื่อคีย์แรกบนพวงกุญแจอยู่ในพอร์ต USB ระบบจะทำงานได้ปกติ แต่หากสลับเอาคีย์ตัวที่สองจากลิ้นชักเสียบอยู่ SSH จะพยายามใช้คีย์นั้นกับข้อมูลรับรองที่ไม่รู้จัก ส่งผลให้เกิดหน้าต่างขอ PIN เมื่อพิมพ์แล้วจึงล้มเหลว และ SSH ถึงจะสลับไปใช้คีย์ตัวที่ถูกต้อง ซึ่งสถานการณ์นี้ถูกซ้ำเติมด้วยการเปิดใช้งานฟีเจอร์ USER_VERIFICATION_REQD ทำให้ต้องมีการยืนยันตัวตนก่อนทุกครั้ง

ไม่อยากพลาดข่าวใหม่?

สมัครรับสรุปข่าวสารใหม่ทางอีเมล ไม่บ่อยจนรำคาญ

โฆษณา

การใช้คีย์ความปลอดภัยหลายตัวพร้อมกันเป็นแนวปฏิบัติที่ดีในการสำรองข้อมูล แต่ระบบการจัดการคีย์เริ่มต้นของ SSH มักจะพยายามทดลองคีย์ตามลำดับที่มี ซึ่งอาจสร้างความหงุดหงิดเล็กๆ น้อยๆ ในการทำงานประจำวัน การทำความเข้าใจกลไกการทำงานของ ssh-agent และการกำหนดค่าคอนฟิกเพิ่มเติมจึงเป็นกุญแจสำคัญในการปรับแต่งเวิร์กโฟลว์ให้ราบรื่นขึ้น

ทางออกของเรื่องนี้คือการใช้คำสั่ง Match exec ในไฟล์ OpenSSH config เพื่อตรวจสอบซีเรียลนัมเบอร์ของ YubiKey ที่เสียบอยู่กับพอร์ตจริงๆ ตัวอย่างการตั้งค่ามีดังนี้:

  • Match host github.com,gitlab.com exec "%d/.ssh/yk-plugged 12345678" IdentityFile ~/.ssh/id_ed25519_sk_yk1 IdentitiesOnly yes
  • Match host github.com,gitlab.com exec "%d/.ssh/yk-plugged 12345679" IdentityFile ~/.ssh/id_ed25519_sk_yk2 IdentitiesOnly yes

หัวใจสำคัญของการแก้ปัญหานี้คือคำสั่ง IdentitiesOnly yes ซึ่งป้องกันไม่ให้ SSH เสนอคีย์ทั้งหมดในเอเจนต์ แต่จะเลือกเฉพาะคีย์ที่ตรงกับ IdentityFile ที่ระบุไว้เท่านั้น อย่างไรก็ตาม การดึงซีเรียลนัมเบอร์ผ่านเครื่องมือ ykman อาจใช้เวลาประมาณ 350 มิลลิวินาทีต่อการรันหนึ่งครั้ง ซึ่งนักพัฒนาต้องชั่งน้ำหนักระหว่างความสะดวกและเวลาที่เสียไปกับการตรวจสอบฮาร์ดแวร์ในทุกๆ คำสั่ง

ที่มา: Dev.to

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้