

เมื่ออยากให้บริการใน Homelab ใช้ HTTPS คำถามหนึ่งคือจะให้ระบบออกและต่ออายุ certificate อย่างไร บางบริการเปิดผ่านอินเทอร์เน็ตอยู่แล้ว แต่อีกหลายตัวตั้งใจให้เข้าได้เฉพาะเครือข่ายบ้านหรือ VPN
การขอใบรับรองด้วย ACME ต้องมีขั้นพิสูจน์การควบคุมชื่อตามวิธีที่ CA รองรับ วิธีพิสูจน์นี้มีเส้นทางของตัวเอง จึงไม่ควรเริ่มจากเปิดทุกบริการออกสู่สาธารณะเพียงเพื่อให้ผ่านขั้นออกใบ
HTTP-01 กับ DNS-01 เป็นสองวิธีที่ใช้กับงานลักษณะนี้ได้ แต่มีข้อผูกพันต่างกันทั้งตอนเริ่มและตอนต่ออายุครับ การเลือกจึงต้องมองว่าระบบจะทำขั้นเดิมซ้ำได้อย่างปลอดภัยหรือไม่ด้วย
CA ใช้ challenge ตรวจว่าผู้ขอควบคุมสิ่งที่สัมพันธ์กับชื่อโดเมนได้ตามกติกา เมื่อผ่านแล้วจึงดำเนินการออก certificate ตามเงื่อนไขของระบบ ไม่ได้เข้ามาทดสอบว่าแอปตอบข้อมูลถูกต้องหรือให้สิทธิ์ผู้ใช้เหมาะสม
ใบที่ออกสำเร็จจึงยังต้องนำไปติดตั้งที่ TLS endpoint และตรวจชื่อ chain กับการเชื่อมต่อจริงแยกอีกครั้ง การพิสูจน์ชื่อผ่านไม่เท่ากับผู้ใช้เปิด HTTPS ได้แล้วทันที
ก่อนเลือกวิธี ควรระบุว่าชื่ออยู่ในการดูแลของใคร ใครแก้ DNS ได้ และจุดไหนรับคำขอจากภายนอก หากมีผู้ให้บริการหลายชั้น การวาดทางของ challenge แยกจากทางเข้าแอปจะช่วยให้รู้ว่าต้องตั้งค่าที่ใด

สำหรับ HTTP-01 ของ Let's Encrypt ระบบให้ข้อมูลแก่ ACME client แล้วนำคำตอบไปไว้ใต้เส้นทาง /.well-known/acme-challenge/ ของชื่อที่ขอ เพื่อให้ CA เรียกตรวจจากภายนอกได้ตามกระบวนการ
ขั้นนี้เริ่มผ่าน HTTP ที่ port80 ไม่ใช่เลือก port ภายนอกใดก็ได้ตามสะดวก แม้ตัวโปรแกรมจะฟังอีก port ภายในเพราะมี proxy ส่งต่อ ก็ยังต้องจัดทางเข้าจากภายนอกให้ตรงข้อกำหนดของ challenge
ถ้ามีหลาย frontend คำตอบต้องเข้าถึงได้จากทางที่ CA อาจใช้ ไม่ควรมีไฟล์อยู่เฉพาะ node ที่เราเปิดทดสอบแล้วอีก node ตอบ404 ส่วน redirect ก็ควรตรวจตามกติกาที่ CA รองรับ ไม่คิดว่าหน้าเว็บหลักเปิดได้จึงแปลว่า path ของ challenge ถูกเสมอ
ในบริการที่มีการ login ทั้งไซต์ ต้องดูว่าเส้นทาง challenge ถูกดักไปหน้าเข้าสู่ระบบหรือถูก rewrite เข้าแอปหรือไม่ การคืนหน้า HTML ที่ดูสวยและมี status200ยังไม่ใช่คำตอบ challenge ที่ตรวจได้ถูกต้อง
HTTP-01 จึงเหมาะให้พิจารณาเมื่อมีทาง HTTP สาธารณะที่จัดการได้อยู่แล้วและไม่ต้องการ wildcard ตามเงื่อนไขวิธีนี้ แต่ไม่ได้บังคับให้เปิดหน้าหลังบ้านหรือ API ภายในทั้งหมดให้ CA เข้าถึง
DNS-01 ใช้ TXT record ใต้ชื่อ _acme-challenge ที่เกี่ยวข้อง โดยค่าที่ต้องใส่คำนวณจาก challenge กับข้อมูลบัญชีตามกลไกของ ACME client ไม่ใช่นำข้อความสุ่มใส่ TXT แล้วถือว่าเป็นการยืนยันได้
ข้อดีสำหรับ Homelab คือ CA ตรวจข้อมูล DNS สาธารณะ จึงออกใบให้ชื่อที่ใช้กับ web server ภายในได้โดยไม่ต้องให้ CA เปิดหน้าแอปนั้น และวิธีนี้รองรับการขอ wildcard ตามเงื่อนไขที่ CA กำหนด
แต่คำว่า server ภายในไม่ได้หมายความว่าใช้ชื่อที่ไม่มีทางพิสูจน์ใน DNS สาธารณะได้ทุกแบบ เรายังต้องควบคุมชื่อโดเมนที่ขอและทำให้ CA อ่านคำตอบของ challenge ได้ถูกต้อง ส่วนการ resolve ชื่อเพื่อใช้งานภายในอาจเป็นอีกนโยบายหนึ่งที่ต้องดูแลแยกกัน
การแก้ TXT สำเร็จในหน้า provider ก็ยังอาจไม่พร้อมให้ทุก authoritative ตอบทันที ต้องรอและตรวจตามทางที่ client กับ provider รองรับ ไม่ตั้งเวลารอสั้นๆ จากการทดลองเพียงเครื่องเดียวแล้วใช้เป็นค่าตายตัวกับทุกโดเมน

การต่ออายุอัตโนมัติด้วย DNS-01 มักต้องมีทางเพิ่มและลบ record ผ่าน API หากนำ credential ที่แก้ทั้งบัญชี DNS ได้ไปไว้บนทุก web server ความเสียหายจากเครื่องหนึ่งถูกเข้าถึงก็อาจลามไปถึงโดเมนอื่นในบัญชีเดียวกัน
จึงควรเลือกสิทธิ์ให้แคบตาม provider และ client ที่ใช้ เช่น จำกัด zone หรือแยกพื้นที่สำหรับ challenge แทนการใช้กุญแจหลักของบัญชี หากใช้การ delegate ชื่อ challenge ด้วย CNAME หรือ NS ต้องตรวจด้วยว่าเครื่องมือที่เลือกตามการมอบหมายแบบนั้นได้จริง
อีกทางคือให้เครื่องที่รับผิดชอบการยืนยัน DNS ทำงานแยก แล้วส่ง certificate ไปปลายทางตามขั้นที่ควบคุมได้ วิธีนี้ลดจำนวนจุดที่ถือสิทธิ์ DNS แต่เพิ่มหน้าที่ส่งมอบไฟล์และตรวจผล จึงต้องเลือกจากสิ่งที่ทีมดูแลได้ ไม่ใช้การแยกเครื่องเป็นข้ออ้างว่าความลับปลอดภัยเอง
การล้าง TXT เก่าก็ต้องรู้ว่าค่าใดเป็นของงานตัวเอง เพราะการตรวจหลายชื่อหรือหลายงานอาจใช้ชื่อ record เดียวกัน อย่าลบทั้งชุดเพื่อให้หน้าจอว่างโดยไม่รู้ว่ามี challenge อื่นกำลังรอค่าอยู่หรือไม่
ถ้าเลือกวิธีที่ต้องให้คนคัดลอก TXT ทุกครั้ง ต้องยอมรับว่าการต่ออายุยังมีขั้น manual ไม่เรียกว่าระบบอัตโนมัติเพียงเพราะตัวโปรแกรมขอใบให้ได้หลังคนทำส่วนสำคัญเสร็จแล้ว
ควรตรวจว่าบัญชี API ยังมีสิทธิ์ ตำแหน่งไฟล์ challenge ยังถูก proxy ส่งถึง และขั้นติดตั้งหลังออกใบทำงานได้เมื่อถึงรอบจริง โดยไม่พึ่ง shell ที่เปิดค้างหรือ environment ชั่วคราวตอนตั้งระบบครั้งแรก
Let's Encrypt มี staging สำหรับทดสอบกระบวนการเพื่อลดการลองผิดกับระบบ production แต่ใบจาก staging ไม่ใช่ใบที่ client ทั่วไปจะเชื่อถือเหมือนใบใช้งานจริง ต้องแยก config และไฟล์ปลายทางให้ชัด ไม่สลับใบทดสอบเข้าไปบริการจริงโดยอัตโนมัติ
ชุดตรวจจึงควรบอกได้ทั้งวิธี challenge ที่ใช้ จุดที่ CA อ่านค่า สิทธิ์ที่จำเป็น และผู้รับผิดชอบเมื่อทำซ้ำไม่ผ่าน ไม่ตรวจเพียงว่ามีไฟล์ PEM เพิ่มขึ้นใน directory แล้วปิดงาน
HTTP-01 กับ DNS-01 ต่างกันที่หลักฐานและเส้นทางที่ CA ใช้ยืนยันชื่อ การเลือกให้ตรงโครงข่ายช่วยให้บริการภายในใช้ HTTPS ได้โดยเปิดเฉพาะสิ่งที่จำเป็น เมื่อคิดถึงการต่ออายุ สิทธิ์ DNS และการส่งใบไปใช้งานตั้งแต่ต้น เราจะได้กระบวนการที่ทำซ้ำได้และตรวจได้ครบกว่าการออกใบครั้งแรกสำเร็จเพียงครั้งเดียว