ใช้งาน ssl certificate ให้กับ nginx ฟรีๆ ด้วย letsencrypt.org บน Ubuntu 16.04

ทุกวันนี้การผลักดันให้ทุกเวปไซต์ได้มีการใช้งาน HTTPS ได้มีการกระตุ้นหลายทาง ซึ่งมีช่องทางนึงที่ทางผู้ให้บริการนั้นให้เราสร้าง SSL Certificate ไปใช้ในเวปไซต์ของเราได้ฟรีๆ แต่มีข้อจำกัดนิดหน่อยคือจะมีอายุอยู่ได้แค่ 90 วันนับตั้งแต่วันที่ได้ขอการใช้งาน
ดังนั้นก็เป็นผลดีกับผู้ใช้งานอย่างเราที่จะสามารถให้บริการเวปไซต์ผ่านทาง HTTP Secure Layer ได้แบบไม่ต้องเสียเงินครับ โดยผมได้นำมาใช้กับ nginx ซึ่งเป็น web server ก็สามารถทำได้เช่นกันไม่มีปัญหา

อันดับแรกให้ติดตั้ง nginx และ git ก่อน

$ sudo apt-get update
$ sudo apt-get install -y nginx git
$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
$ cd /opt/letsencrypt
$ sudo ./letsencrypt-auto

ซึ่งจะเป็นการติดตั้ง nginx ที่เป็น web server และ git เพื่อใช้ในการ clone code repository มาจาก letencrypt

สร้าง Template สำหรับ request ssl ไปยัง letsencrypt.org

$ cd /var/www
$ mkdir letsencrypt
$ sudo chgrp www-data letsencrypt

สร้าง template file

ที่ /etc/letsencrypt/configs/devcloud.engineerball.com.conf โดยมีเนื้อหาไฟล์ดังนี้ (เปลี่ยน devcloud.engineerball.com เป็นชื่อโดเมนที่ต้องการใช้งาน)

# the domain we want to get the cert for;
# technically it's possible to have multiple of this lines, but it only worked
# with one domain for me, another one only got one cert, so I would recommend
# separate config files per domain.
domains = devcloud.engineerball.com
# increase key size
rsa-key-size = 2048 # Or 4096
# the current closed beta (as of 2015-Nov-07) is using this server
server = https://acme-v01.api.letsencrypt.org/directory
# this address will receive renewal reminders
email = admin@engineerball.com
# turn off the ncurses UI, we want this to be run as a cronjob
text = True
# authenticate by placing a file in the webroot (under .well-known/acme-challenge/)
# and then letting LE fetch it
authenticator = webroot
webroot-path = /var/www/letsencrypt/

ตรงตัวหนาให้เปลี่ยนเป็นของตัวเองนะครับ

เปิดให้ letsencrypt เข้าถึงไฟล์ temporary

โดยการเพิ่ม config ในส่วนของ location เข้าไป ตัวอย่างเช่น

server {
listen 80 default_server;
server_name devcloud.engineerball.com;
location /.well-known/acme-challenge {
 root /var/www/letsencrypt;
 }
...
}

ทำการ verify และ reload nginx

$ sudo nginx -t && sudo nginx -s reload

ขอ Certificate

$ cd /opt/letsencrypt
$ sudo ./letsencrypt-auto --config /etc/letsencrypt/configs/devcloud.engineerball.com.conf certonly
Requesting root privileges to run letsencrypt...
   /home/teerapat_khu/.local/share/letsencrypt/bin/letsencrypt --config /etc/letsencrypt/configs/devcloud.engineerball.com.conf certonly
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/devcloud.engineerball.com/fullchain.pem. Your
   cert will expire on 2016-07-22. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

เพิ่ม nginx config ในส่วนของ ssl

server {
listen 443 ssl default_server;
server_name devcloud.engineerball.com;

ssl_certificate /etc/letsencrypt/live/devcloud.engineerball.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/devcloud.engineerball.com/privkey.pem;

...
}

reload config ของ nginx

$ sudo nginx -t && sudo nginx -s reload

หลังจากนั้นลองเข้าเวปดู จะเห็นว่าเราสามารถใช้ https แบบฟรีๆ ได้แล้ว (สัญลักษณ์รูปกุญแจจะเป็นสีเขียว)

1

ต่ออายุการใช้งานแบบอัตโนมัติ

อย่างที่บอกไปตอนแรกครับ letsencrypt ให้เราใช้งานได้แค่ 90 วันเท่านั้น แต่ถึงยังไงแล้ว letsencrypt ก็ยังใจดีที่ให้เราสามารขอ renew ทุกๆ 90 วันได้ ดังนั้นก็สามารถตั้ง crontab ในการ renew ได้เลย
1. สร้างไฟล์ที่ /var/scripts/renew-letsencrypt.sh

#!/bin/sh
cd /opt/letsencrypt/
./letsencrypt-auto --config /etc/letsencrypt/configs/devcloud.engineerball.com.conf certonly

if [ $? -ne 0 ]
 then
        ERRORLOG=`tail /var/log/letsencrypt/letsencrypt.log`
        echo -e "The Let's Encrypt cert has not been renewed! \n \n" \
                 $ERRORLOG
 else
        nginx -s reload
fi

exit 0

2. สร้างที่เก็บ log file
$ sudo mkdir /var/log/letsencrypt

3. ตั้ง crontab ด้วยค่า
0 0 1 JAN,MAR,MAY,JUL,SEP,NOV * /path/to/renew-letsencrypt.sh

ball Written by:

Teerapat Khunpech Live, Tech, Beers, Bike, Cafe Racer, Docker, Devops, Eco-System