NGINX เปิดตัวการรองรับโปรโตคอล ACME แบบเนทีฟ
(blog.nginx.org)- NGINX เปิดตัวพรีวิวที่รองรับ โปรโตคอล ACME แบบเนทีฟสำหรับทำงานอัตโนมัติในการออกและต่ออายุใบรับรอง SSL/TLS
- ผ่านโมดูลใหม่แบบ Rust ชื่อ
ngx_http_acme_moduleทำให้สามารถขอ ติดตั้ง และต่ออายุใบรับรองได้จากการตั้งค่า NGINX โดยตรงโดยไม่ต้องใช้เครื่องมือภายนอก - สิ่งนี้ช่วยลดการพึ่งพาเครื่องมือภายนอกอย่าง Certbot พร้อมเพิ่มความปลอดภัยและความเป็นอิสระจากแพลตฟอร์ม
- เวอร์ชันเริ่มต้นรองรับ HTTP-01 challenge และมีแผนจะรองรับ TLS-ALPN และ DNS-01 ในอนาคต
- คาดว่าการรองรับ ACME จะมีบทบาทสำคัญต่อการทำงานอัตโนมัติด้านความปลอดภัย ไม่ใช่แค่บนเว็บ แต่รวมถึง IoT และสภาพแวดล้อม edge computing ด้วย
ภาพรวมและการเปลี่ยนแปลงสำคัญ
- NGINX เปิดตัว พรีวิวของฟีเจอร์รองรับโปรโตคอล ACME
- ผ่านโมดูลใหม่
ngx_http_acme_moduleซึ่งออกแบบมาให้จัดการการขอ ติดตั้ง และต่ออายุใบรับรองได้โดยตรงจากการตั้งค่า NGINX - การรองรับ ACME นี้ใช้ NGINX-Rust SDK ภายใน และให้มาในรูปแบบโมดูลไดนามิกที่พัฒนาด้วย Rust
- ฟีเจอร์นี้ใช้งานได้ทั้งสำหรับผู้ใช้โอเพนซอร์สและลูกค้าองค์กร NGINX Plus
- การลดการพึ่งพาเครื่องมือภายนอกอย่าง Certbot ช่วยเพิ่มทั้งความปลอดภัยและประสิทธิภาพของการจัดการใบรับรอง
แนะนำโปรโตคอล ACME
- โปรโตคอล ACME (Automated Certificate Management Environment) เป็นโปรโตคอลสื่อสารสำหรับทำงานอัตโนมัติในการออก ตรวจสอบ ต่ออายุ และเพิกถอนใบรับรอง SSL/TLS
- ไคลเอนต์สามารถจัดการวงจรชีวิตของใบรับรองได้โดยตรงผ่าน การสื่อสารอัตโนมัติกับ CA (Certificate Authority) โดยไม่ต้องอาศัยงานแบบแมนนวลจากคนกลาง
- พัฒนาและเผยแพร่โดย Internet Security Research Group (ISRG) ในปี 2015 ผ่านโครงการ Let’s Encrypt
- ก่อนการมาของ ACME กระบวนการออกใบรับรองเป็นงานแบบแมนนวล และมีทั้งต้นทุนกับโอกาสเกิดความผิดพลาดสูง
- ACMEv2 รุ่นปัจจุบันเพิ่มความสามารถหลากหลาย เช่น วิธีการยืนยันตัวตนและการรองรับไวลด์การ์ด ทำให้มีความยืดหยุ่นและปลอดภัยมากขึ้น
ขั้นตอนการทำงานอัตโนมัติของใบรับรองด้วย ACME ใน NGINX
- การทำงานอัตโนมัติของวงจรชีวิตใบรับรองด้วยโปรโตคอล ACME ใน NGINX ประกอบด้วย 4 ขั้นตอนดังนี้
-
1. ตั้งค่าเซิร์ฟเวอร์ ACME
- ในการเปิดใช้ฟีเจอร์ ACME ต้องระบุ directory URL ของเซิร์ฟเวอร์ ACME ด้วย
acme_issuer - เมื่อมีการออกใบรับรอง ยังสามารถกำหนดตัวเลือกเพิ่มเติม เช่น ข้อมูลติดต่อไคลเอนต์ และพาธสำหรับเก็บข้อมูลสถานะได้
- ในการเปิดใช้ฟีเจอร์ ACME ต้องระบุ directory URL ของเซิร์ฟเวอร์ ACME ด้วย
-
2. จัดสรรหน่วยความจำที่ใช้ร่วมกัน (zone)
- สามารถตั้งค่า shared memory zone เพิ่มเติมผ่าน
acme_shared_zoneเพื่อเก็บใบรับรอง คีย์ส่วนตัว และข้อมูล challenge - ขนาดเริ่มต้นคือ 256K และขยายได้ตามต้องการ
- สามารถตั้งค่า shared memory zone เพิ่มเติมผ่าน
-
3. ตั้งค่า challenge
- เวอร์ชันพรีวิวปัจจุบันรองรับเฉพาะ HTTP-01 challenge ซึ่งใช้สำหรับยืนยันความเป็นเจ้าของโดเมน
- เพื่อให้ทำงานได้ ต้องกำหนด listener บนพอร์ต 80 และ การตอบกลับ 404 แบบค่าเริ่มต้น ในการตั้งค่า NGINX
- มีแผนจะรองรับ TLS-ALPN และ DNS-01 challenge ในภายหลัง
-
4. ออกและต่ออายุใบรับรอง
- หากเพิ่ม directive
acme_certificateลงใน server block ก็จะสามารถทำงานอัตโนมัติในการออก/ต่ออายุใบรับรอง TLS สำหรับโดเมนนั้นได้ - โดยทั่วไปโดเมนเป้าหมายของการออกใบรับรองจะระบุด้วย
server_name - ในเวอร์ชันพรีวิว
server_nameที่เป็น regular expression และ wildcard ยังไม่รองรับ - ตัวแปร
$acme_certificateและ$acme_certificate_keyภายในโมดูลจะเชื่อมใบรับรองและคีย์ให้โดยอัตโนมัติ
- หากเพิ่ม directive
ข้อดีสำคัญ
- โปรโตคอล ACME เป็นหัวใจสำคัญของการเติบโตอย่างรวดเร็วของการใช้งาน HTTPS ทั่วโลก
- การจัดการใบรับรองแบบอัตโนมัติช่วยลดอย่างมากทั้ง ต้นทุนในการจัดการวงจรชีวิตใบรับรอง และ ข้อผิดพลาดจากงานแมนนวล
- การตัดเครื่องมือภายนอกออกช่วย ลดพื้นผิวการโจมตี และ เพิ่มความสามารถในการพกพา
- ช่วยผลักดัน การทำมาตรฐานด้านความปลอดภัย ในหลากหลายสภาพแวดล้อม
แผนในอนาคต
- มีแผนเพิ่มการรองรับ TLS-ALPN และ DNS-01 challenge
- ขยายความสามารถตามฟีดแบ็กของผู้ใช้
- เมื่อการนำ IoT, API และ edge computing ไปใช้งานเพิ่มขึ้น คาดว่า ACME จะมีบทบาทสำคัญในโครงสร้างพื้นฐานด้านความปลอดภัยแบบอัตโนมัติที่ครอบคลุมยิ่งขึ้นในอนาคต
- การรองรับ ACME แบบเนทีฟของ NGINX จะเป็นรากฐานสำคัญในการผลักดันให้ความปลอดภัยบนเว็บ การทำงานอัตโนมัติ และความสามารถในการขยายระบบ กลายเป็นมาตรฐานแห่งอนาคต
เริ่มต้นใช้งาน
- ผู้ใช้โอเพนซอร์สสามารถใช้โมดูลแบบ prebuilt ได้จาก NGINX Linux packages
- ลูกค้าองค์กร NGINX Plus จะได้รับในรูปแบบโมดูลไดนามิกที่รองรับโดย F5
- ดูเอกสารของโมดูลได้ที่ NGINX Docs
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
สำหรับผู้ใช้ nginx ที่ไม่ได้เปิดสู่สาธารณะ วิธี DNS-01 มีความหมายกว่ามาก (เช่น ตอนใช้ Nginx Proxy Manager) ผมคิดมาตลอดว่า DNS-01 สะอาดที่สุดเพราะแค่อัปเดตเรคอร์ดเท่านั้น รอฟีเจอร์นี้มานานมาก
Caddy ง่ายกว่า nginx อย่างชัดเจน มีทั้งเทมเพลตที่ครอบคลุมบริการต่าง ๆ การทดสอบ และบริการพิเศษสำหรับสถาบันการศึกษา รวมถึง logging ที่ดีกว่า การจัดการใบรับรองที่สำหรับผมถือว่าสมบูรณ์แบบ และความสามารถด้าน metrics ที่ดีกว่า
แต่ตอนนี้ยังเรียนรู้ฝั่งปลั๊กอินอยู่ เพราะ caddy ไม่มี rate limiting และมีบั๊กของ powerbi ที่ทำให้ผู้ใช้บางคนร้องขอรูปภาพวันละ 300,000 ครั้ง เลยมีจุดที่ไม่สะดวกเหมือนกัน
แต่กว่าฟีเจอร์นี้จะเข้า stable repository ของ Ubuntu หรือ Debian ก็คงต้องใช้เวลาอีกพอสมควร
แถมตอนนี้ยังไม่รองรับ DNS challenge (wildcard certificate) ดังนั้นในระยะสั้นอาจไม่ได้ช่วย Dokku มากนัก
ผมเคยลอง dokku (และตอนนี้ก็ยังลองอยู่) แต่รู้สึกว่าจุดเริ่มต้นค่อนข้างยาก
เช่น Coolify สามารถสร้าง github app แล้วเชื่อมการ deploy ได้ทันที และผมก็เคยมีประสบการณ์ build/deploy container ด้วย GH actions มาก่อน
เอกสารทางการของ dokku ให้ความรู้สึกเหมือนเอกสารอ้างอิง เลยเหมือนกำลังอ่านสารานุกรม: เอกสารทางการเรื่องการเริ่มต้น git ของ dokku
ผมรู้สึกว่าคู่มือเริ่มต้นแบบชัดเจนที่พาไป deploy ได้ทันทีเหมือนของ Coolify จะมีประโยชน์กว่า: คู่มือการเชื่อม github ของ coolify
อยากให้ Dokku มีคู่มือสำหรับติดตั้งแอป OSS ยอดนิยม, คู่มือเริ่มต้นแบบมีเป้าหมาย/จบเป็นขั้นตอน, และบทสอนที่ครอบคลุมตั้งแต่ reverse proxy บน baremetal ไปจนถึงหลายแอปยอดนิยมในที่เดียว
สุดท้ายแล้ว เป้าหมายของการใช้ Dokku ไม่ใช่ตัว Dokku เอง แต่คือการไปให้ถึง "สภาพที่ฉันต้องการ" ได้อย่างง่ายและรวดเร็วด้วย Dokku
ท้ายที่สุดผมอยากได้กระบวนการที่ painless แบบ "คลิกเรโปที่ชอบแล้ว deploy ลงเครื่องตัวเองได้ทันที" แล้วค่อยไปเจาะรายละเอียดฝั่ง backend ต่อ
ซอฟต์แวร์ที่ยังไม่มี v1.0.0 อย่างเป็นทางการ อาจเปลี่ยนอินเทอร์เฟซได้ทุกเมื่อโดยไม่แจ้งล่วงหน้า major version 0 สักวันหนึ่งจะกลายเป็นกับดัก
ผมแนะนำให้กดดันเมนเทนเนอร์ให้ออกเวอร์ชันเสถียร
dehydrated อยู่ในสถานะ major version 0 มา 7 ปีแล้ว
0ver.org ก็น่าอ่านเช่นกัน:
เป็นแนวคิดเรื่องการทำเวอร์ชันที่ประมาณว่า "ถ้าใช้งานในโปรดักชันอยู่แล้ว ก็ควรเป็น 1.0.0 ได้แล้ว"
รายละเอียดเพิ่มเติมดู ที่นี่
ตาม รายการแพ็กเกจทางการของ nginx มี oldstable/oldoldstable แต่ไม่มี Debian 13 Trixie ที่เพิ่งออกเมื่อ 4 วันก่อน
สิ่งที่ Caddy และ Traefik ทำไปแล้วตั้งแต่ 5 ปีก่อน nginx เพิ่งจะมารองรับตอนนี้
แน่นอนว่าผมคิดว่านี่เป็นการเปลี่ยนแปลงที่ดี อย่างน้อยตอนนี้ก็ไม่ต้องรัน certbot เองอีกแล้ว สะดวกขึ้นมาก
เท่ากับว่า Nginx ใส่ฟีเจอร์นี้ช้ากว่าอยู่เกือบ 9-10 ปี
ผมยังคิดว่าปรัชญาแบบยูนิกซ์ที่ให้แต่ละอย่างทำหน้าที่ของตัวเองให้ดีและประกอบกันได้ดีกว่า
"เครื่องมือ" ที่พยายามยัดทุกอย่างเข้ามา สุดท้ายก็เลี่ยงไม่ได้ที่จะมีบางส่วนที่ทำได้ไม่ดีพอ
ถึง certbot จะพยายามตั้งค่าอัตโนมัติให้ แต่ถ้าไม่ใช่สภาพแวดล้อมมาตรฐานทั่วไปก็มักทำงานได้ไม่ดี
การให้ nginx จัดการทุกอย่างเองภายในน่าจะเป็นทางออกที่ดีกว่า
และก็สงสัยด้วยว่านี่เปิดทางให้ใช้ตัวเลือกอื่นนอกจาก Let's Encrypt ได้ง่ายขึ้นหรือไม่
Caddy มีความสะดวกแบบพร้อมใช้หลายอย่าง เลยมีประโยชน์มากจริง ๆ
ส่วนตัวเหตุผลที่ยังย้ายไป Caddy ไม่ได้ทั้งหมด คือยังต้องพึ่ง rate limiting และโมดูล geo ของ nginx