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

ตั้งชื่อวัตถุก่อนตั้งชื่อค่า

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

จดอัลกอริทึมไว้ด้วย SHA-256 คือสิ่งที่คาดหวังตามปกติในปัจจุบัน แต่เครื่องมือรุ่นเก่าพิมพ์ SHA-1 เว้นแต่คุณจะขออย่างอื่น และค่าเลขฐานสิบหก 40 ตัวอักษรเป็นสัญญาณว่าคุณกำลังจะเปรียบเทียบของสองอย่างที่ต่างกัน

นำค่าที่คาดหมายมาจากช่องทางที่สอง

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

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

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

ดึงค่าออกมาที่ฝั่งของคุณ

สำหรับไฟล์ใบรับรอง คำสั่งคือ openssl x509 -in server.crt -noout -fingerprint -sha256 ไดเจสต์ที่ระบุชัดเจนสำคัญ เพราะถ้าไม่ระบุ ผลลัพธ์จะขึ้นอยู่กับเวอร์ชัน OpenSSL ของคุณ ผลลัพธ์เป็นสตริงเลขฐานสิบหกที่คั่นด้วยจุดคู่ ดังนั้นลบจุดคู่ออกและแปลงทั้งสองฝั่งเป็นตัวพิมพ์เล็กก่อนเปรียบเทียบ

สำหรับปลายทางที่พูด TLS โดยตรง ให้เชื่อมต่อและส่งใบรับรองออกมาทางท่อ: openssl s_client -connect vpn.example.com:443 -servername vpn.example.com < /dev/null | openssl x509 -noout -fingerprint -sha256 วิธีนี้ใช้ได้กับแผงผู้ดูแลเว็บหรือตัวรับฟัง TLS ไม่ใช้กับ OpenVPN ซึ่งช่องทางควบคุมอยู่ภายในอุโมงค์ สำหรับ OpenVPN ให้อ่านใบรับรองจากโปรไฟล์บนดิสก์แทนการพยายามดักจับจากซ็อกเก็ต

การเปรียบเทียบควรเป็นแบบกลไก ปรับค่าทั้งสองให้เป็นมาตรฐานด้วย tr -d ':' และการแปลงตัวพิมพ์ แล้วเปรียบเทียบทั้งสตริง การทำด้วยตาคือวิธีที่ส่วนนำที่ตรงกันซ่อนความต่างในไบต์สุดท้าย ถ้าสตริงต่างกัน ให้ถือว่าความต่างนั้นเป็นจริงก่อนที่คุณจะหาคำอธิบาย

เงื่อนไขการหยุด

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

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

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

หลังการเปรียบเทียบ

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

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

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