หน้าแรก/บทความ/ติดตั้ง SSL จาก Let's Encrypt สำหรับ Nginx บน CentOS 6.x (VESTACP)
กลับหน้าบทความ
🔒Linux

ติดตั้ง SSL จาก Let's Encrypt สำหรับ Nginx บน CentOS 6.x (VESTACP)

แนะนำวิธีติดตั้ง SSL Certificate ฟรีจาก Let's Encrypt สำหรับ Nginx บน CentOS 6/7 พร้อมการตั้งค่า VESTACP และการต่ออายุ Certificate อัตโนมัติด้วย Cron Job

ศิริชัย ธีรภัทรสกุล (ตั้ม)อ่าน 7 นาที3 มกราคม 2562
#SSL#Let's Encrypt#Nginx#CentOS#VESTACP#HTTPS

Let's Encrypt เป็นฟรี SSL ที่ทำให้เว็บมี HTTPS เป็นของตัวเองไม่พูดพร่ำทำเพลง มาเริ่มวิธีติดตั้งสำหรับ Nginx บน CentOS 7/6 เลยแล้วกันครับ ตรงนี้จะมีแทรกพวก Path Config เล็กน้อย เพราะว่าตัวผมเองใช้ VESTACP พวกที่เก็บไฟล์โฟลเดอร์อาจจะมีต่างบ้าง แต่จะยังคง Path เดิมของ Nginx

วิธีติดตั้ง Let's Encrypt

1. ถ้าไม่มี git ให้ติดตั้งก่อนเลย

yum install git

2. เมื่อติดตั้ง git เสร็จให้เข้าโฟลเดอร์ /opt และ clone letsencrypt มาไว้ใน server

cd /opt
git clone https://github.com/letsencrypt/letsencrypt

3. ให้เข้าโฟลเดอร์ /opt/letsencrypt เพื่อเริ่มให้ Let's Encrypt สร้างใบรับรองให้กับ Domain ของเรา (อย่าลืมเปลี่ยน path ที่เก็บเว็บและชื่อเว็บ)

cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com

4. จะมีหน้าจอสีน้ำเงินให้กรอกอีเมล์ของเรา และปุ่ม Agree ยอมรับข้อตกลง ก็ทำตามขั้นตอนไป ถ้าสำเร็จจะได้รูปแบบประมาณนี้

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /etc/letsencrypt/live/example.com/fullchain.pem.
  Your cert will expire on 2017-03-31.

5. ตรวจสอบว่าได้สร้างไฟล์ Certificate แล้วหรือยัง

ls /etc/letsencrypt/live/
ls -al /etc/letsencrypt/live/example.com

ถ้ามีจะแสดงไฟล์ Certificate ประมาณนี้

lrwxrwxrwx cert.pem -> ../../archive/example.com/cert1.pem
lrwxrwxrwx chain.pem -> ../../archive/example.com/chain1.pem
lrwxrwxrwx fullchain.pem -> ../../archive/example.com/fullchain1.pem
lrwxrwxrwx privkey.pem -> ../../archive/example.com/privkey1.pem

6. ทำการติดตั้งใน Nginx และเปิดการใช้งาน SSL ให้เข้าไปที่ไฟล์ /etc/nginx/nginx.conf

vi /etc/nginx/nginx.conf

สำหรับใครใช้ VESTACP path จะเป็นลักษณะนี้ /home/$user/conf/web/nginx.conf (แก้ไข $user ตาม Server ของคุณ)

ทำการแก้ไข/เพิ่ม SSL configuration ใน Server block ตามด้านล่างนี้ (เปลี่ยน path ให้ตรงกับที่สร้างมาด้านบน)

# SSL configuration
listen 443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/your_domain.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.tld/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
# SSL configuration

ทำการ Reload Nginx

service nginx reload

วิธีต่ออายุ Let's Encrypt อัตโนมัติ

เนื่องจาก Cert นั้นมีอายุ 90 วัน ดังนั้นหากเรามาต่ออายุทุกครั้งอาจจะไม่สะดวกนัก จึงต้องมีวิธีการต่ออายุอัตโนมัติดังนี้

1. เริ่มต้นทำการสร้างการต่ออายุด้วยคำสั่งดังนี้ (เปลี่ยน webroot-path และชื่อเว็บให้ตรงกับคุณ)

cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/usr/share/nginx/html/ -d www.example.com -d example.com

2. ทำการสร้าง bash script ไฟล์ สำหรับตรวจสอบวันหมดอายุและต่ออายุอัตโนมัติ

vi /usr/local/bin/cert-renew

ให้เพิ่ม script ตามด้านล่างนี้ (เปลี่ยนที่อยู่ตัวแปร $webpath)

#!/bin/bash
webpath='/usr/share/nginx/html/'
domain=$1
le_path='/opt/letsencrypt'
le_conf='/etc/letsencrypt'
exp_limit=30;

get_domain_list(){
  certdomain=$1
  config_file="$le_conf/renewal/$certdomain.conf"
  if [ ! -f $config_file ] ; then
    echo "[ERROR] The config file for the certificate $certdomain was not found."
    exit 1;
  fi
  domains=$(grep --only-matching --perl-regex "(?<=domains \= ).*" "${config_file}")
  last_char=$(echo "${domains}" | awk '{print substr($0,length,1)}')
  if [ "${last_char}" = "," ]; then
    domains=$(echo "${domains}" |awk '{print substr($0, 1, length-1)}')
  fi
  echo $domains;
}

if [ -z "$domain" ] ; then
  echo "[ERROR] you must provide the domain name for the certificate renewal."
  exit 1;
fi

cert_file="/etc/letsencrypt/live/$domain/fullchain.pem"
if [ ! -f $cert_file ]; then
  echo "[ERROR] certificate file not found for domain $domain."
  exit 1;
fi

exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s)
datenow=$(date -d "now" +%s)
days_exp=$(echo \( $exp - $datenow \) / 86400 |bc)

echo "Checking expiration date for $domain..."
if [ "$days_exp" -gt "$exp_limit" ] ; then
  echo "The certificate is up to date, no need for renewal ($days_exp days left)."
  exit 0;
else
  echo "The certificate for $domain is about to expire soon. Starting renewal request..."
  domain_list=$( get_domain_list $domain )
  "$le_path"/letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path="$webpath" --domains "${domain_list}"
  echo "Reloading Nginx..."
  sudo systemctl reload nginx
  echo "Renewal process finished for domain $domain"
  exit 0;
fi

3. เพื่อให้แน่ใจว่า script ทำงานได้ และ bc calculator ได้ถูกติดตั้งแล้ว

chmod +x /usr/local/bin/cert-renew
yum install bc

ลองทดสอบการทำงาน

/usr/local/bin/cert-renew example.com

ผลลัพท์จะได้ประมาณนี้

Checking expiration date for example.com...
The certificate is up to date, no need for renewal (89 days left).

4. และสุดท้ายทำการตั้ง Cron job เพื่อให้ทำงาน Script ตรวจสอบการหมดอายุและต่ออายุทุกสัปดาห์

crontab -e

เพิ่มคำสั่งตามด้านล่างนี้

@weekly /usr/local/bin/cert-renew example.com >> /var/log/example.com-renew.log 2>&1

จากนั้นสั่ง restart crontab

service crond restart

และลองแสดงรายการที่ตั้งเวลาไว้ใน crontab อีกครั้ง

crontab -l

เท่านี้เราก็จะมี SSL จาก Let's Encrypt ใช้ฟรีได้แล้ว ลองเข้าเว็บ https://www.sslshopper.com/ssl-checker.html เพื่อตรวจสอบ SSL certificate อีกครั้งว่าสามารถใช้ HTTPS ได้อย่างสมบูรณ์

สำหรับบทความนี้หวังว่าคงมีประโยชน์กับทุกท่านนะครับ

อ้างอิง: http://www.tecmint.com/setup-https-with-lets-encrypt-ssl-certificate-for-nginx-on-centos/

🚀 รับพัฒนาเว็บไซต์ & เว็บแอพพลิเคชั่น

สนใจดูตัวอย่างงานหรือสอบถามเพิ่มเติม ติดต่อได้เลยครับ โค้ดโมทีฟ (CodeMotive)