ข้อความแจ้งว่าคีย์ส่วนตัวมีความยาวไม่ถูกต้อง และถ้อยคำนั้นชี้ไปที่การเข้ารหัสก่อน แล้วจึงชี้ไปที่วิทยาการเข้ารหัสลับ คีย์ของ WireGuard เข้ารหัส 32 ไบต์เป็น base64 ซึ่งให้ 44 อักขระรวมการเติมท้าย ดังนั้นค่าที่มีขนาดอื่นจึงไม่ใช่คีย์ไม่ว่าจะดูสุ่มเพียงใด การเติมสตริงจนกว่าตัวแยกวิเคราะห์จะยอมรับจะสร้างค่าที่มีรูปแบบถูกต้องซึ่งไม่มีเพียร์ใดจะรู้จักได้เลย

เบื้องหลังข้อผิดพลาดนี้มีงานสองอย่างที่ต่างกันซ่อนอยู่ คือการซ่อมแซมข้อความของคีย์ที่ใช้ได้ และการแทนที่ตัวตนที่คุณไม่มีอีกแล้ว ผลลัพธ์ของทั้งสองต่างกัน และอย่างหนึ่งทำให้อีกด้านใช้ไม่ได้

สิ่งที่ตัวแยกวิเคราะห์คาดหวัง

คีย์ของ WireGuard คือวัสดุคีย์ 32 ไบต์ใน base64 พร้อมการเติมมาตรฐาน ซึ่งให้สตริงคงที่ 44 อักขระ เครื่องมือจะปฏิเสธทุกสิ่งที่ไม่ถอดรหัสเป็น 32 ไบต์พอดี เพราะเส้นโค้งพื้นฐานรับสเกลาร์ 32 ไบต์เท่านั้น ค่าสาธารณะและค่าส่วนตัวใช้การเข้ารหัสเดียวกัน ตัวแยกวิเคราะห์จึงบอกไม่ได้จากรูปแบบเพียงอย่างเดียวว่าคุณวางอันไหนไว้ ความกำกวมนี้ทำให้เกิดความสับสนครึ่งหนึ่งรอบข้อผิดพลาดนี้

wg genkey | tee private.key | wg pubkey > public.key
base64 -d private.key | wc -c
wc -c private.key
wg show wg0 public-key

ถ้าค่าของคุณถอดรหัสเป็น 32 ไบต์ ความยาวก็ถูกต้อง และข้อร้องเรียนมาจากที่อื่นในไฟล์ ถ้าถอดรหัสเป็นสิ่งที่สั้นกว่า แสดงว่าคุณมีวัสดุที่ถูกตัด ไม่ใช่ปัญหาเรื่องรูปแบบ

รูปแบบเสียหายหรือวัสดุผิด

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

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

คีย์สาธารณะในช่องส่วนตัว

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

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

ซ่อมโปรไฟล์ แล้วพิสูจน์แฮนด์เชก

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

wg genkey | tee new.key | wg pubkey > new.pub
base64 -d private.key | wc -c
ip route get 10.60.9.5
wg show wg0 latest-handshakes

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

บันทึกว่าคุณเปลี่ยนค่าใดและสำเนาที่ได้รับอนุญาตอยู่ที่ไหน ใครก็ตามที่แตะเพียร์นี้ครั้งต่อไปต้องรู้ว่าด้านไหนเปลี่ยน

บทความที่เกี่ยวข้อง