DEV Community

Cover image for NGINX - Native support ACME Protocol
terngr
terngr

Posted on

NGINX - Native support ACME Protocol

NGINX ออก Preview Release ของตัว ACME แบบ Native พร้อมใช้แล้ววันนี้ สำหรับ NGINX Plus R35 (Based on NGINX OSS 1.29.0) และ NGINX OSS 1.29.1
เนื่องจากเป็น Preview Release ยังรองรับเฉพาะ HTTP-01 challenges

Automated Certificate Management Environment (ACME) เป็นโปรโตคอลที่ใช้คุยกับ Certificate Authority (CA) หรือบางท่านเรียนคนออก Certificate ที่มาช่วยบอกว่าเว็บไซต์ของเราเป็นเว็บแท้แน่นอน โดย ACME ช่วย Automate กระบวนการ ตั้งแต่ Issuing, Validating, Renewing, Revoking ครบวงจร

โดยปกติถ้าเรา Configure HTTPS บน NGINX ก็จะต้องใส่ Certificate ด้วย ซึ่งการได้มาซึ่ง Certificate นี้ เราอาจทำเอง หรือใช้เครื่องมือ (เช่น Certbot) ช่วยก็ได้
ตอนนี้ NGINX ได้นำความสามารถนี้มารวมใน NGINX แล้ว ฉะนั้น NGINX ตั้งแต่ NGINX Plus R35 และ NGINX OSS 1.29.1 จะสามารถที่จะขอ Issuing และ Renewing Certificates ได้เอง

NGINX ใช้ Rust SDK มาช่วย โดยแยกเป็น Module ชื่อ nginx-plus-module-acme และ nginx-module-acme สำหรับ NGINX Plus และ NGINX OSS ตามลำดับ

การใช้งาน หลังจากติดตั้ง NGINX Plus ตามขั้นตอนปกติ ให้รันติดตั้ง nginx-plus-module-acme ด้วย เช่น
sudo apt install nginx-plus-module-acme

สำหรับ NGINX OSS ให้ติดตั้งเป็น
sudo apt install nginx-module-acme

ซึ่งเป็นขั้นตอนติดตั้ง Module Package ตามปกติของ NGINX Plus / NGINX OSS
ทั้งนี้ เราจำเป็นต้องเลือกเวอร์ชั่นของ Module ให้ตรงกับเวอร์ชั่นของ NGINX ด้วย ฉะนั้นในวันนี้เนื่องจาก Module เพิ่งออก จึงไม่ค่อยมีปัญหา(แต่มี Diff Version บ้าง) แต่หากนานไปแล้วเวอร์ชั่นห่างกัน ตอนใช้งานก็จำเป็นต้องเช็คความเข้ากันได้ (คือต้อง Version เดียวกัน) นั่นเอง

หลังจากนั้นให้โหลด Module เข้าใช้งาน โดยเขียน Configuration ที่ชั้นนอกสุดของ Configuration หรือวางไว้บรรทัดแรกของ /etc/nginx/nginx.conf จะง่ายต่อการทำงานเพราะจะเห็นง่ายว่ากำลังใช้ Module อะไรบ้าง

Recap การขอ Certificate

ก่อนใช้งาน ขอ Recap การขอ Certificate ว่าเราต้องมีสิทธิ์ใน FQDN และ Resolve name ไปที่ IP ที่กำหนด การทำ Challenge แบบ HTTP-01 challenges นั้น CA จะส่ง Challenge มายัง IP เพื่อดูว่าได้รับจริงไหม


Challenge ที่ได้

เมื่อ Challenge สำเร็จ ก็จะออก Certificate ให้ พร้อมนำมาวางให้ใน NGINX

คาดว่าจะพร้อมใช้ในอนาคตจะมี Challenges แบบอื่นๆ มาเพิ่มครับ: เช่น ALPN, DNS -01

การ Configuration

หลังจากเราโหลดโมดูลแล้ว ให้ Configure ดังนี้

ตั้ง Resolver (บังคับตั้ง) เพื่อให้ Resolve Name ไปยัง Certificate Authority ได้
resolver 8.8.8.8;

ใส่รายละเอียดของ ACME Issuer ที่จะใช้งาน, path ที่จะเก็บ Certificate ที่ขอได้ เพื่อนำไปใช้ต่อ

ในตัวอย่าง ใช้ Letsencrypt ซึ่งมี directory ในการขออยู่ที่

https://acme-v02.api.letsencrypt.org/directory

และจะเก็บ เรียกใช้ Certificates ที่

ตั้ง acme_shared_zone
acme_shared_zone zone=acme_shared:1M;

ย้อนไปนิดหนึ่ง ตอนส่ง Challenge มา เราต้องเปิด HTTP port 80 รอรับ เพื่อเช็คว่าได้รับข้อความจริงไหม เป็นเจ้าของตัวจริงไหม โดย


เปิดรับ port 80 เสมอ เพื่อทำ Challenge (ในอนาคตอาจเปลี่ยนแปลง)


เมื่อ Challenge สำเร็จ จะนำ Certificate ไปใช้โดยอ้างตัวแปรชื่อ $acme_certificate สำหรับ ssl_certificate และ $acme_certificate_key สำหรับ ssl_certificate_key ตามลำดับ


ยังสามารถดูไฟล์ Certificates จริงได้ด้วย จะเป็น Key pairs ของ Certificate กับ Key นั่นเอง


ตรวจสอบ Configuration และ Restart NGINX ถ้าไม่ได้เกิดปัญหา Error log จะไม่เห็นอะไร แต่จะเห็นการขอ Challenge มาใน Access log

หากเกิด Error ให้แก้ไข เช่น Resolve name ติดต่อ CA ไม่ได้ ให้เปลี่ยนที่อยู่ resolver
หรือถ้าทดสอบลบเพื่อขอ Issue ใหม่ ขอเร็วและถี่เกินไปก็จะถูกปฏิเสธไม่ให้ขอได้

เมื่อเรียบร้อยแล้ว ทดลองเข้าหน้าเว็บด้วย FQDN แบบ https


Connection is secure
Certificate is valid


ระบุว่า Issued By Let's Encrypt

สรุป

NGINX ได้ทำ ACME ได้แบบ Native แล้วโดยยังรองรับได้แค่บาง Features ของ Review release

NGINX ยังมีอีกหลาย โมดูล ที่จะมาช่วยเพิ่มประสิทธิภาพงาน

Top comments (0)