มาติดตั้ง HTTPS ด้วย Let’s Encrypt ให้ Nginx บน Ubuntu 16.04 กันเถอะ

ทุกวันนี้ HTTPS ได้เข้ามามีบทบาทกับเว็บไซต์เป็นอย่างมาก ตั้งแต่การเข้ารหัสข้อมูลในการส่งข้อมูลผ่านเว็บไซต์ ซึ่งทำให้เรามั่นใจได้ระดับหนึ่งว่าข้อมูลจะไม่ถูกดักระหว่างทาง และตัว Browser เองก็มีการแสดงสัญลักษณ์ว่าเว็บไซต์ที่ติดตั้ง HTTPS เหล่านี้ปลอดภัย (กรณีที่ HTTPS นั้นได้รับ Certificate จากแหล่งที่น่าเชื่อถือ) ด้วยเช่นกัน และที่คาดไม่ถึงสุด ๆ ก็คือ เว็บไซต์ที่มี https จะมีคะแนนเกี่ยวกับ SEO ที่ดีกว่าเว็บไซต์ที่ไม่มี HTTPS ดังนั้นการติดตั้ง HTTPS ในยุคปัจจุบันจึงเป็นเรื่องที่สำคัญอย่างมาก

แม้เราจะตระหนักถึงความสำคัญของ HTTPS แล้ว แต่การจะติดตั้ง HTTPS นั้นก็ค่อนข้างยุ่งยาก และการจะได้มาซึ่ง HTTPS นั้นก็ต้องเสียเงินอีกด้วย แต่ว่าวันนี้ผมมีทางออกมาแนะนำครับ นั่นคือการติดตั้ง HTTPS ด้วย Let’s Encrypt ครับ และสำหรับบทความนี้ผมขออนุญาตแนะนำเฉพาะการติดตั้งบน Nginx ที่อยู่บน Ubuntu 16.04 นะครับ

ขั้นที่ 1 – ติดตั้ง Certbot
Certbot นั้นเป็นโปรแกรมเล็ก ๆ ตัวหนึ่งครับที่ใช้สำหรับส่งข้อมูลไปที่ Let’s Encrypt server เพื่อทำการขอ SSL เพื่อมาใช้ในการติดตั้ง HTTPS ครับ สำหรับการติดตั้ง Certbot ทำได้โดยการเพิ่ม Repository ของ Certbot และสั่งติดตั้งผ่านทาง apt-get ครับ

เพิ่ม Repository ของ Certbot

sudo add-apt-repository ppa:certbot/certbot

หลังจากพิมพ์แล้วอย่าลืมกด ENTER เพื่อให้เป็นการยอมรับในการเพิ่ม Repository นะครับ และหลังจากที่เราเพิ่ม Repositry แล้วให้เราทำการอัพเดต apt-get ของเราด้วยนะครับ ทำได้โดยการพิมพ์

sudo apt-get update

ขั้นตอนการอัพเดตนี้อาจจต้องใช้เวลาสักครู่นะครับ (ไปหาขนมมานั่งกินได้เลยจ้า) และหลังจากที่การอัพเดตเสร็จสิ้นแล้วให้เราทำการติดตั้ง Certbot เลยครับ โดยการพิมพ์

sudo apt-get install python-certbot-nginx

ตอนนี้ Certbot ของเราก็พร้อมที่จะใช้งานแล้วครับ ขั้นตอนต่อไปก็คือการตั้งค่า server_name ให้ Nginx

ขันตอนที่ 2 – ตั้งค่า Nginx
ปกติแล้วส่วนใหญ่เวลาที่เราทำ Web server เราก็มันจะมีการทำ Virtual host สำหรับหลาย ๆ เว็บ และสำหรับกรณีของผมนั้นผมได้ตั้งให้ picharnan.com เป็น Default ของ Web server ดังนั้นผมก็จะทำการกำหนด Default ให้ชี้มายัง picharnan.com แต่สำหรับท่านผู้อ่านก็สามารถชี้ Domain name ของท่านได้ตามต้องการเลยนะครับ

สำหรับการแก้ Default server_name ทำได้โดยการแก้ไขไฟล์ /etc/nginx/sites-available/default เข้าไปแก้ไขโดยการพิมพ์ว่า

sudo vim /etc/nginx/sites-available/default

หลังจากนั้นกำหนดค่า server_name ชี้มายัง Domain name ที่เราต้องการ จากตัวอย่างนี้ผมจะชี้มาที่ picharnan.com และ www.picharnan.com และการแก้ไขไฟล์จะได้ดังนี้

. . .
server_name picharnan.com www.picharnan.com;
. . .

หลังจากแก้ไขเสร็จแล้วให้ทำการบันทึกการแก้ไขแล้วลองตรวจสอบว่าเราแก้ไขถูกต้องหรือไม่ด้วยคำสั่ง

sudo nginx -t

หากไม่มี error ใด ๆ ก็ถือว่าเราแก้ไขสำเร็จแล้ว หรือหากเกิด error ใด ๆ ขึ้นก็หาทางแก้ไขก่อนนะครับ และหลังจาก เราแก้ไขจนไม่มี error แล้วให้เราสั่งให้ Nginx อ่านค่าการตั้งค่าเมื่อสักครู่โดยการพิมพ์

sudo systemctl reload nginx

ขั้นที่ 3 – สั่งให้ Firewall ยอมให้ Nginx ใช้ HTTPS ได้
ถ้าหากเครื่องของเรามีการใช้ Ufw อยู่ ให้เราทำการเปิด Firewall เพื่อยอมให้ Nginx สามารถใช้งาน HTTPS ได้ แต่ถ้าเราไม่ได้ใช้งาน ufw ให้เราข้ามขั้นตอนนี้ไปได้เลยครับ

เพื่อความชัวร์ให้เราลองดูว่าเราได้ใช้งาน Ufw หรือไม่โดยการพิมพ์ว่า

sudo ufw status

และผลลัพธ์ที่แสดงออกมาอาจจะแสดงดังนี้

Output
 Status: active

To                         Action      From
 --                         ------      ----
 OpenSSH                    ALLOW       Anywhere                  
 Nginx HTTP                 ALLOW       Anywhere                  
 OpenSSH (v6)               ALLOW       Anywhere (v6)             
 Nginx HTTP (v6)            ALLOW       Anywhere (v6)

จะเห็นว่า Nginx ของเราจะยังใช้งานได้แค่ HTTP เท่านั้น และถ้าเราต้องการให้ Nginx ของเราสามารถใช้งาน HTTPS ได้ให้เราพิมพ์ว่า

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

และถ้าเราลองดู ufw อีกครั้งให้เราพิมพ์

sudo ufw status

ผลลัพธ์หลังจากแก้ไข Ufw แล้วจะได้หน้าตาดังนี้

Output
 Status: active

To                         Action      From
 --                         ------      ----
 OpenSSH                    ALLOW       Anywhere
 Nginx Full                 ALLOW       Anywhere
 OpenSSH (v6)               ALLOW       Anywhere (v6)
 Nginx Full (v6)            ALLOW       Anywhere (v6)

ตอนนี้เครื่องของเราก็พรอ้มจะของ SSL และใช้งาน HTTPS แล้ว

ขั้นที่ 4 – ขอ SSL จาก Let’s Encrypt
หลังจากที่เราได้ทำการเปิด Firewall และทำการชี้ Domain name เรียบร้อยแล้ว ตอนนี้เราก็พร้อมจะสั่งให้ Certbot ทำการขอ SSL เพื่อขอใช้งาน HTTPS แล้ว วิธีการคือให้เราพิมพ์ว่า

sudo certbot --nginx -d picharnan.com -d www.picharnan.com

อย่าลืมแก้ Domain name เป็นของตัวเองด้วยนะครับ และหลังจากเราสั่งให้ Certbot ทำการขอ SSL แล้ว ระบบจะถามเราว่าจะให้ทำการ redirect HTTP ไปยัง HTTPS เลยไหม

เลือก 1 คือยังไม่ต้อง Redirect นั้นหมายความว่าเราต้องไปทำการแก้ไข Nginx เพื่อให้ Redirect เอง
เลือก 2 คือให้ระบบทำการ Redirect จาก HTTP ไปยัง HTTPS ให้

ตอนนี้ถือว่าเกือบเสร็จสิ้นขั้นตอนแล้วครับ เราลองเปิด Browser แล้วเรียกเว็บไซต์ของเราด้วย HTTPS ก็จะเห็นว่าเว็บไซต์ของเราได้งาน HTTPS ได้แล้วครับ แต่หากว่า Address bar ยังไม่เป็นสีเขียวอาจจะเพราะว่ารูปภาพที่เรียกบนเว็บของเราอาจจะยังไม่เรียก HTTPS ให้เราไปแก้พวกนี้ให้เป็น HTTPS ให้เรียบร้อยครับ

ขั้นที่ 5 – ตรวจสอบดูว่า Certbot ทำการ Auto-Renewal
เนื่องจากว่า Let’s encrypt นั้นออกแบบมาว่าจะต้องทำการต่อ SSL ทุก ๆ 90 วัน เพื่อเป็นการแสดงตัวตนว่า HTTPS ที่เราใช้นั้นมีตัวตนอยู่จริง ทาง Certbot เองเค้าอำนวยความสะดวกตรงนี้เอาไว้ให้โดยทาง Certbot ได้ทำการเขียน Cron เพื่อต่ออายุให้เรา เราสามารถดู Cron นี้ได้ที่ /etc/cron.d/certbot

ดังนั้นเราจึงไม่ต้องกังวลว่า HTTPS ของเราจะหมดอายุ แต่ถ้าต้องการความมั่นใจว่า Certbot ของเราจะต่ออายุได้สำเร็จเราสามารถสั่งทดสอบการต่ดอายุได้โดยการเรียก

sudo certbot renew --dry-run

สรุป
ตอนนี้เราก็สามารถใช้ HTTPS ด้วย Let’s Encrypt ได้แล้ว เว็บไซต์ของเราก็จะมีความปลอดภัยมากขึ้น และก็ยังส่งผลให้ SEO ของเราดีขึ้นอีกด้วย