ทุกวันนี้การผลักดันให้ทุกเวปไซต์ได้มีการใช้งาน 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 แบบฟรีๆ ได้แล้ว (สัญลักษณ์รูปกุญแจจะเป็นสีเขียว)
ต่ออายุการใช้งานแบบอัตโนมัติ
อย่างที่บอกไปตอนแรกครับ 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