วันนี้เราจะมาพูดถึง Experiment ที่ผมทดลองเล่นไว้นานแล้วครับ แต่ไม่ได้เขียนไว้ ทำให้เวลาผมย้ายเครื่องที่ host เว็บบล็อกนี้เอง ผมต้องวุ่นวายไปเปิดเครื่องเก่า เก็บ Command ที่รันไว้ วันนี้เลยถือโอกาสเขียนไว้อ่านเองละกันครับ ฮ่า ๆ
CloudFlare เป็นบริการจัดการโดเมนเนมที่มีฟีเจอร์ให้เราใช้ครบครับ สำหรับ Free user นี่ก็พอใช้งานทำ web blog อะไรทั่วไปเลยครับทำ SSL (https://) ให้ใช้ได้แบบง่าย ๆ เลย แถมยังมีพวกบริการ CDN, Cache, Firewall ฯลฯ อันนี้ก็จะอยู่ในระดับที่เราจ่าย Subscription เพิ่มเข้าไปเพื่อใช้บริการเพิ่มเติม
วันนี้เราจะพูดถึงตัวบริการของ SSL Modes ของ CloudFlare กัน โดยหลัก ๆ แล้วจะแบ่งออกเป็น 4 ประเภท คือ
- Flexible อันนี้คืิอยืดหยุ่นตามชื่อ คือหลังบ้านเราเป็น HTTP ก็สามารถใช้ได้ CloudFlare ก็จะเสริฟ SSL ให้เลย แต่การเชื่อมต่อระหว่าง CloudFlare กับไซต์ของเราจะไม่ได้เข้ารหัสไว้ (ในยุคนี้ก็ไม่แนะนำครับ)
- Full แบบนี้จะปลอดภัยขึ้นมาอีกขั้น หลังบ้านเรามีเป็น HTTPS แบบเสริฟด้วย Self-signed certificate โดยทั้งนี้คือก็จะได้มีการเข้ารหัสกันในการเชื่อมต่อของ CloudFlare กับทางไซต์ของเราเองด้วย
- Strict ก็คือจะเหมือน Full แต่ว่า CloudFlare จะ Validate Certificate ของ ไซต์เราด้วยครับ ถ้า Cert เราไม่สมบูรณ์ เช่น หมดอายุ ไม่ได้ sign จากผู้ให้บริการออกใบรับรองที่น่าเชื่อถือ หรือเป็น Self-signed certificate ก็จะเกิด Error ครับ
- Off ปิด SSL
ทีนี้ผมอยากใช้ SSL Mode Strict เลยต้องมี SSL Certificate ของโดเมนผมที่ออกจากผู้ให้บริการออกใบรับรองที่ได้รับการยอมรับ นั่นเลยทำให้ผมไปใช้ Let’s Encrypt ที่เป็นบริการออกใบรับรองที่ฟรี
Let’s Encrypt คือบริการออกใบรับรองที่ Free, Automated and open Certificate Authority โดย Internet Security Research Group (ISRG). https://www.abetterinternet.org และ มีสปอนเซอร์อีกมากมาย เพื่อต้องการให้เว็บไซต์ทั่วโลกมีความปลอดภัยมากขึ้น
มาเข้าเรื่องกันเถอะ . . .
ในบล็อก WordPress อันนี้ของผม ใช้การรันเป็น docker-compose เพื่อความง่ายในการย้าย Server และด้วยความคุ้นชินกับการทำงานกับ docker ด้วย
จากภาพจะเห็นว่าผมใช้ Nginx มาทำเป็นตัว Webserver เราต้องมาจัดการใบรับรองให้กับเจ้า Nginx นี่แหละครับ
ตัว Let’s Encrypt เอง มีโปรเจ็ก Certbot ที่ทำให้การขอใบรับรองนั้นง่ายมากขึ้น (Certificate ของ Let’s Encrypt นั้นจะมีอายุแค่ 3 เดือน ทำให้ต้องมีการ renew ใบรับรองอย่างสม่ำเสมอ) และมี plugins ต่อกับผู้ให้บริการ DNS ชั้นนำหลายเจ้า ผมเลือกใช้ตัว plugins cloudflare ที่เป็น docker image ของ certbot https://hub.docker.com/r/certbot/dns-cloudflare (ผมไม่เห็น document อะไรเลยนะ เลยเขียน blog นี่แหละ กลัวลืม)
$ docker pull https://hub.docker.com/r/certbot/dns-cloudflare
สร้าง directory ไว้สำหรับเก็บพวก config ของ certbot
$ mkdir -p ~/certbot/var/lib/letsencrypt # ไว้ดู log ของ certbot
$ mkdir -p ~/certbot/etc/letsencrypt # ไว้เก็บคอนฟิกต่างๆ และ certificate
ทีนี้สิ่งที่เราต้องเตรียมด้วยคือ cloudflare credential ให้เราสร้างเป็นไฟล์ .cloudflare.ini
ที่ ~/certbot/etc/letsencrypt
แล้ว mount เข้าไปตอนที่รัน certbot
สามารถไปเอา API Key ได้จาก My Profile > API Keys > Global API Key
# .cloudflare.ini
dns_cloudflare_email = [email protected]
dns_cloudflare_api_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ต่อมาเราก็จะเริ่มรัน certbot กัน
$ docker run -it --rm --name certbot \
-v ~/certbot/etc/letsencrypt:/etc/letsencrypt \
-v ~/certbot/var/lib/letsencrypt:/var/lib/letsencrypt \
certbot/dns-cloudflare certonly --dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/.cloudflare.ini \
--dns-cloudflare-propagation-seconds 60 \
-d <your_target_domain_name>
จากนั้นก็รอ Certbot verify domain เราจนสำเร็จ จะได้ certificate มาอยู่ที่ ~/certbot/etc/letsencrypt/live/<your_target_domain_name>/
โดยที่ let’s encrypt จะทำ softlink ไปหาไฟล์ certificate จริงอีกทีครับ
$ ls -la ~/certbot/etc/letsencrypt/live/<your_target_domain_name>/
lrwxrwxrwx 1 root root 36 Jun 16 06:30 cert.pem -> ../../archive/<your_target_domain_name>/cert7.pem
lrwxrwxrwx 1 root root 37 Jun 16 06:30 chain.pem -> ../../archive/<your_target_domain_name>/chain7.pem
lrwxrwxrwx 1 root root 41 Jun 16 06:30 fullchain.pem -> ../../archive/<your_target_domain_name>/fullchain7.pem
lrwxrwxrwx 1 root root 39 Jun 16 06:30 privkey.pem -> ../../archive/<your_target_domain_name>/privkey7.pem
จากนั้นผมเลือกที่จะแก้ Nginx ให้อ่านไฟล์คีย์พวกนี้ แล้วก็ทำการ mount volume ของ certbot เข้าไปใน container ของ Nginx ตรง ๆ เลย เพื่อความสะดวกในการ renew ครับ หลังจาก renew มาก็ reload Nginx ไปเลย
เมื่อจัดการเรื่อง Certificate เรียบร้อย ทีนี้เราก็พร้อมไปเปิด SSL Mode Strict กันแล้วครับผม
คำสั่งสำหรับ Renew Certificate นะครับ (ถ้าเรา mount volume ออกมาจากคำสั่งก่อนหน้านั้น มันจะเก็บ config domain ของเราไว้ครับ)
$ docker run -it --rm --name certbot \
-v ~/certbot/etc/letsencrypt:/etc/letsencrypt \
-v ~/certbot/var/lib/letsencrypt:/var/lib/letsencrypt \
certbot/dns-cloudflare renew
หวังว่าจะเป็นประโยชน์กับผู้อ่านนะครับ
ข้อมูลเพิ่มเติม
https://developers.cloudflare.com/ssl/origin/ssl-modes/ (CloudFlare SSL Modes)
https://nuuneoi.com/blog/blog.php?read_id=892 (รู้จักกับ Cloudflare)
https://letsencrypt.org/
https://certbot-dns-cloudflare.readthedocs.io/en/stable/
Leave a Reply