ทำ Full-Strict SSL กับ CloudFlare ด้วย SSL ฟรี จาก Let’s Encrypt (Certbot)

วันนี้เราจะมาพูดถึง 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 ด้วย

ภาพ ระบบ WordPress ที่จัดการด้วย docker-compose

จากภาพจะเห็นว่าผมใช้ 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/

Posted

in

by

Comments

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.