14.4.6. การดำเนินการ: คีย์ การหมดอายุ และการแก้ปัญหา¶
งานเกี่ยวกับใบรับรองสามส่วนที่ครอบคลุมทุกอุปกรณ์ที่ติดตั้งใช้งาน ได้แก่ การปกป้องคีย์ส่วนตัวเมื่อนำไปไว้บนกล้อง การวางแผนสำหรับวันที่ใบรับรองหมดอายุ และรายการสั้น ๆ ของรูปแบบข้อผิดพลาดที่พบในทางปฏิบัติ
14.4.6.1. การปกป้องคีย์ส่วนตัว¶
ทุกครั้งที่กล้อง นำเสนอ ใบรับรอง -- ในฐานะเซิร์ฟเวอร์ TLS หรือในฐานะไคลเอนต์ใน mTLS -- คีย์ส่วนตัวของมันต้องอยู่บนอุปกรณ์ในรูปแบบ DER ธรรมดา บนระบบไฟล์หรือใน ROMFS การจัดเก็บในลักษณะนี้ทำให้โค้ดใด ๆ ที่รันบนกล้องและทุกคนที่มีการเข้าถึงทางกายภาพสามารถอ่านได้ ไม่ว่าจะผ่าน USB mass-storage drive, REPL prompt หรือ raw flash ROMFS และ read-only flags ป้องกัน การแก้ไข ไม่ใช่ การดึงข้อมูล ถือว่าคีย์ส่วนตัวที่ติดตั้งบนอุปกรณ์สามารถกู้คืนได้โดยผู้โจมตีที่มุ่งมั่นซึ่งมีการเข้าถึงทางกายภาพหรือโค้ด
สิ่งนี้ไม่ได้ทำให้ TLS ไม่มีประโยชน์ -- มันกำหนดวิธีการติดตั้งใช้งาน:
ใช้คีย์และใบรับรองที่ไม่ซ้ำกันต่ออุปกรณ์ อย่าแฟลชคีย์ที่ใช้ร่วมกันหนึ่งชุดไปยังอุปกรณ์ทั้งหมด: การดึงคีย์จากอุปกรณ์เดียวจะทำให้ผู้โจมตีสามารถปลอมตัวเป็นกล้องทุกตัวได้ คีย์ต่ออุปกรณ์จำกัดการถูกละเมิดไว้ที่อุปกรณ์นั้นเครื่องเดียว ซึ่งคุณสามารถเพิกถอนหรือปิดใช้งานได้ฝั่งเซิร์ฟเวอร์
รักษาอายุใบรับรองให้สั้น คีย์ที่ถูกขโมยมีประโยชน์ต่อเมื่อใบรับรองยังมีผลบังคับใช้อยู่ อายุสั้นบวกกับการหมุนเวียนตามปกติจะจำกัดความเสียหาย (ดู Certificate expiry and rotation ด้านล่าง)
หลีกเลี่ยงการเก็บข้อมูลลับบนอุปกรณ์เมื่อทำได้ หากคุณต้องการตรวจสอบเฉพาะ เซิร์ฟเวอร์ (การพิสูจน์ตัวตนเซิร์ฟเวอร์ ไม่ใช่ mTLS) กล้องในฐานะไคลเอนต์จะจัดเก็บเฉพาะใบรับรอง CA -- ซึ่งเป็นสาธารณะ -- และไม่มีคีย์ส่วนตัวที่ควรค่าแก่การขโมย
อย่าใส่คีย์ใน firmware image สาธารณะ คีย์ที่ฝังอยู่ใน ROMFS ใน firmware build ที่คุณแจกจ่ายไม่ใช่ข้อมูลลับ ใครก็ตามที่ดาวน์โหลด firmware ก็มีมันด้วย การจัดเตรียมต่ออุปกรณ์หมายถึงการโปรแกรมคีย์ หลังจาก firmware ทั่วไป ไม่ใช่ภายในมัน
จำกัดรัศมีความเสียหาย กำหนดขอบเขตสิ่งที่ใบรับรองรับรองความถูกต้อง (สิทธิ์น้อยที่สุด) และตรวจสอบให้แน่ใจว่า identity ของอุปกรณ์ที่รั่วไหลเครื่องเดียวสามารถถูกเพิกถอนหรือปิดใช้งานได้โดยไม่กระทบส่วนอื่น
หากรูปแบบการคุกคามของคุณรวมถึงผู้โจมตีที่มีการเข้าถึงทางกายภาพ ให้ออกแบบบนสมมติฐานว่าคีย์ของอุปกรณ์ จะ รั่วไหลในที่สุด และทำให้สิ่งนั้นอยู่รอดได้ แทนที่จะสมมติว่าสามารถเก็บเป็นความลับบนฮาร์ดแวร์ที่ไม่มีกลไกในการทำเช่นนั้น
14.4.6.2. การหมดอายุและการหมุนเวียนใบรับรอง¶
ใบรับรองทุกใบมีช่วงความถูกต้อง เมื่อผ่านไปแล้ว peer ที่ใช้ ssl.CERT_REQUIRED จะปฏิเสธการเชื่อมต่อ -- ดังนั้นการหมดอายุจึงเป็นการหยุดทำงานที่แท้จริงและมีกำหนดการ ไม่ใช่ความเสี่ยงเชิงทฤษฎี นาฬิกาของกล้องต้องถูกต้องด้วยเพื่อให้การตรวจสอบความถูกต้องถูกประเมินอย่างซื่อสัตย์
Self-signed คุณเลือกอายุด้วย
-daysเมื่อหมดอายุคุณต้องสร้างคีย์/ใบรับรองใหม่และ redeploy: คัดลอกไฟล์ DER ใหม่ หรือสร้างและ reflash ROMFS image ใหม่หากใบรับรองถูกฝังไว้ เลือกค่า-daysที่คุณจะจำได้จริง ๆPublic CA ใบรับรองเหล่านี้จงใจมีอายุสั้น Let's Encrypt ออกใบรับรอง 90 วันและคาดหวังการต่ออายุอัตโนมัติประมาณทุก 60 วัน ไม่มีตัวเลือก "ติดตั้งครั้งเดียวแล้วลืม"
แนวโน้มที่กว้างขึ้นนั้นเป็นทิศทางเดียว: อายุสูงสุดของใบรับรอง TLS ที่น่าเชื่อถือสาธารณะยังคงลดลงอย่างต่อเนื่อง เคยเป็น 825 วัน ปัจจุบันถูกจำกัดที่ 398 วัน และ CA/Browser Forum ได้กำหนดตารางเวลาที่จะลดลงเหลือประมาณ 47 วันภายในปี 2029 บทเรียนสำหรับการออกแบบอุปกรณ์คือสมมติว่าใบรับรองมีอายุสั้นและการหมุนเวียนต้องเป็นแบบอัตโนมัติหรืออย่างน้อยต้องเป็นประจำ -- อย่าส่งมอบผลิตภัณฑ์ที่ต้องพึ่งพามนุษย์ในการเปลี่ยนใบรับรองสิบปี
ในทางปฏิบัติบนกล้อง: ให้ความสำคัญกับการออกแบบที่ใบรับรองสามารถแทนที่ได้โดยไม่ต้อง reflash (ระบบไฟล์ที่เขียนได้บวกกับเส้นทางการอัปเดตระยะไกล หรือการรันกล้องเป็น ไคลเอนต์ ที่เชื่อถือ CA ที่คุณหมุนเวียนจากส่วนกลาง) หากใบรับรองต้องอยู่ใน ROMFS ให้กำหนดตารางการอัปเดต firmware ตามอายุของมัน
14.4.6.3. การแก้ปัญหา¶
ต้องตั้งนาฬิกา กล้องที่ยังไม่ได้ตั้งนาฬิกาหลังจากเปิดเครื่องจะล้มเหลวในการตรวจสอบความถูกต้องของใบรับรอง -- เรียก
ntptime.settime()ก่อนชื่อโฮสต์ต้องตรงกัน เมื่อไคลเอนต์ส่ง
server_hostnameต้องตรงกับsubjectAltNameของใบรับรอง (หรือCNบน stacks เก่า) มิฉะนั้นการตรวจสอบจะล้มเหลวรูปแบบผิด ไฟล์ PEM ที่คัดลอกไปยังกล้องจะโหลดไม่ได้ -- แปลงเป็น DER ก่อน
ใบรับรองหมดอายุ การเชื่อมต่อที่เคยทำงานได้และตอนนี้ล้มเหลวด้วย
OSErrorอาจเป็นเพียงเพราะใบรับรองหมดอายุ -- ตรวจสอบวันที่ความถูกต้องและสร้าง/deploy ใหม่ตามต้องการคีย์ Ed25519 ล้มเหลว ใช้ ECDSA P-256/P-384 หรือ RSA ไม่ใช่ Ed25519
ข้อผิดพลาดคือ
OSErrorMicroPython ไม่ได้ implementssl.SSLError; ความล้มเหลวของ TLS (ใบรับรองผิด หมดอายุ CA ไม่รู้จัก ข้อผิดพลาดรูปแบบ ความล้มเหลวของ handshake) จะถูก raise เป็นOSError