ติดตั้ง Free SSL Certificate จาก Let’s Encrypt ให้กับเว็บไซต์
Let’s Encrypt เป็นผู้ออกใบรับรองดิจิตอล (Certificate Authority) เจ้าใหม่ซึ่งมี Internet Security Research Group เป็นผู้สนับสนุน มีจุดมุ่งหมายที่จะทำให้การเข้ารหัสของการเชื่อมต่อข้อมูลเป็นเรื่องทั่วไป ง่ายและที่สำคัญ ฟรี! ซึ่งถ้าหากเราใช้บริการของทาง Let’s Encrypt เราจะสามารถลดความยุ่งยากต่างๆ เช่น การจ่ายเงิน, การตั้งค่า Server, ยืนยันอีเมลล์หรือการต่ออายุใบ SSL Certificate
ในบทความนี้จะพูดถึงการใช้งาน Let’s Encrypt ในการติดตั้ง SSL Certificate โดยใช้ Client จากทาง Let’s Encrypt กันครับ ส่วน Server ที่ใช้ Host อยู่บน AWS EC2 และใช้ OS เป็น Ubuntu 14.04.2 LTS 64-bit with Apache2
สารบัญ
- เกริ่นนำ
- การติดตั้ง Let’s Encrypt Client
- การขอและติดตั้งใบรับรองสำหรับ Apache
- การขอใบรับรองเพียงอย่างเดียวสำหรับ Web Server อื่นๆ
- การต่ออายุใบรับรอง
- การตั้ง Cronjob ให้ต่ออายุใบรับรองอัตโนมัติ
- สรุปคำสั่งและ Directory ต่างๆ
- ทิ้งท้าย
- อ้างอิง
เกริ่นนำ
- เนื่องจาก Let’s Encrypt ยังอยู่ในเวอร์ชัน Beta ดังนั้น Client อาจจะยังมี Bug อยู่บ้าง โดยส่วนตัวหลังจากที่ใช้งานมาคิดว่าถ้าเราได้ Certificate มาแล้วรวมถึงสามารถ Renew Certificate ได้ก็ไม่น่าจะมีปัญหาอะไรครับ แต่ยังไงเพื่อความปลอดภัยก็ลองกับ Development Server ก่อนก็จะดีกว่าครับ
- สำหรับการขอใบรับรอง Server จะต้องเป็น Server ที่ Host Domain นั้นๆ โดย DNS จะต้องชี้มาที่ Server เรียบร้อยแล้ว เนื่องจาก Let’s Encrypt จะเรียก Domain ที่ทำการขอเข้ามาเพื่อยืนยันความเป็นเจ้าของของ Domain
การติดตั้ง Let’s Encrypt Client
เริ่มแรกให้ทำการ ssh เข้าไปบน Server และ ติดตั้ง Git (ถ้ามีแล้วสามารถข้ามไปขั้นตอนต่อไปได้เลย)
1 2 |
sudo apt-get update sudo apt-get install git |
ทำการ Clone ตัว Client ไปไว้ที่ /opt ซึ่งเป็น Directory สำหรับการติดตั้ง Third-Party Package
1 |
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt |
เข้าไปที่ Directory ที่เราได้ Clone ตัว Client ไว้
1 |
cd /opt/letsencrypt |
ทดสอบเรียกตัว Client ซึ่งเราจะเห็นว่าทาง Let’s Encrypt ได้เตรียม Command ต่างๆ ไว้ให้เรียกใช้ได้ค่อนข้างที่จะครบครัน
1 |
./letsencrypt-auto --help |
การขอและติดตั้งใบรับรองสำหรับ Apache
เริ่มทำการติดตั้ง โดยให้ส่งชื่อ Domain ที่ต้องการจะออกใบรับรองเข้าไป
1 |
./letsencrypt-auto -d www.foo.com |
**ในขั้นตอนนี้หากพบ Error: urn:acme:error:connection ให้ตรวจสอบว่า Port: 443 บน Server ได้เปิดไว้แล้ว**
หลังจากนั้นจะมี Interactive Screen ขึ้นมาเพื่อให้เลือกว่าเราต้องการให้เว็บไซต์ของเราถูกเรียกผ่าน HTTPS เสมอหรือไม่ ซึ่งแนะนำให้เลือกเป็นแบบ Secure (ตัว Client จะตั้งค่า RewriteEngine ที่ vhost เดิมเพื่อ Redirect ไปที่ HTTPS ให้)
เมื่อการติดตั้งเสร็จเรียบร้อยแล้วตัว Client ของ Let’s Encrypt จะแนะนำให้เราตรวจสอบการทำงานของใบรับรองและ HTTPS ที่
1 |
https://www.ssllabs.com/ssltest/analyze.html?d=www.foo.com&latest |
จะเห็นได้ว่าการขอและติดตั้งใบรับรองให้กับ Apache ตัว Client ของ Let’s Encrypt แทบจะจัดการให้เราทั้งหมดซึ่งทำให้เราประหยัดเวลาไปได้มากเลยทีเดียว
สำหรับผู้ที่ใช้ Web Server อื่นๆ ที่ไม่ใช่ Apache สามารถดูวิธีการขอใบรับรองเพียงอย่างเดียวเพื่อสามารถนำไปติดตั้งเองต่อไปในหัวข้อถัดไปนะครับ
การขอใบรับรองเพียงอย่างเดียวสำหรับ Web Server อื่นๆ
คำสั่งสำหรับขอใบรับรองของ Let’s Encrypt มีอยู่หลายคำสั่งด้วยกัน แต่คำสั่งที่แนะนำจะเป็น
1 |
./letsencrypt-auto certonly --webroot -w /var/www/www.bar.com/public_html/ -d www.bar.com |
โดยคำสั่งนี้จะรับ Parameter 2 ตัวด้วยกันคือ
-w – ให้แทน /var/www/www.bar.com/public_html/ ด้วย Directory ของ Website ที่จะทำการขอ Domain
-d – ให้แทนด้วย Domain ที่ต้องการจะขอใบรับรอง
หลังจากกด Enter รอสักพักเพื่อให้ Let’s Encrypt ทำการขอใบรับรองและยืนยันความเป็นเจ้าของ และเมื่อดำเนินการเสร็จสิ้นจะมีข้อความดังภาพด้านล่างแสดงซึ่งจะแสดงตำแหน่งของใบรับรองที่ได้ รวมถึงวันหมดอายุด้วย
1 2 3 4 5 6 7 8 9 |
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/www.bar.com/fullchain.pem. Your cert will expire on 2016-05-01. 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 |
หลังจากนี้สามารถนำใบรับรองที่ได้ไปติดตั้งกับ Web Server ต่อได้เลยครับ
ส่วนวิธีอื่นๆ จะมีอีก 2 วิธีนะครับซึ่งจะอนุญาตลงรายละเอียดไว้คร่าวๆ นะครับ คือ
- ./letsencrypt-auto certonly --standalone – คำสั่งนี้เราจะต้องใช้ Port: 80 ในการขอใบรับรองดังนั้นจะไม่เหมาะกับการรันบน Production Server
- ./letsencrypt-auto certonly --manual – ใช้สำหรับการขอใบรับรองบนเครื่องที่ไม่ใช่ Web Server ซึ่งจะมีขั้นตอนการยืนยันความเป็นเจ้าของโดยใช้การรันคำสั่งอื่นๆ บนอีก Terminal นึง
การต่ออายุใบรับรอง
ใบรับรองที่ได้จาก Let’s Encrypt จะมีอายุเพียง 90 วันเราจึงจำเป็นที่จะต้องต่ออายุใบรับรองใหม่ก่อนที่ใบรับรองจะหมดอายุโดยเราสามารถใช้ Client ของ Let’s Encrypt ที่มีฟังก์ชันนี้มาให้ด้วยอยู่แล้ว
ก่อนที่จะเราจะรันคำสั่งในการต่ออายุเราสามารถตรวจสอบวันหมดอายุของใบรับรองได้โดย
1 2 3 4 |
sudo openssl x509 -enddate -noout -in /etc/letsencrypt/live/www.foo.com/fullchain.pem // result notAfter=Apr 29 12:37:00 2016 GMT |
การต่ออายุใบรับรองของ Web Server ที่ใช้ Apache สามารถใช้คำสั่ง
1 |
./letsencrypt-auto certonly --apache --keep-until-expiring -d www.foo.com |
สำหรับ Web Server อื่นๆ
1 |
./letsencrypt-auto certonly --webroot --keep-until-expiring -w /var/www/www.bar.com/public/ -d www.bar.com |
ให้สังเกต Parameter --keep-until-expiring โดยถ้าเราส่งParamter นี้เข้าไปด้วยตัว Client จะเช็คอายุของใบรับรองและจะต่ออายุให้ก็ต่อเมื่ออายุของใบรับรองต่ำกว่า 30 วัน โดยถ้าหากต้องการทดลอง Force ให้ตัว Client ต่ออายุใบรับรองให้เสมอเราสามารถใช้ Parameter --renew-by-default แทนได้และถ้าหากใบรับรองได้รับการต่ออายุแล้วจะมีข้อความขึ้นตามภาพด้านล่าง
สำหรับการต่ออายุใบรับรองทาง Let’s Encrypt ได้ตั้งข้อจำกัดไว้ให้ 1 Domain สามารถต่อใบอายุรับรองได้ 5 ครั้งภายใน 7 วัน
การตั้ง Cronjob ให้ต่ออายุใบรับรองอัตโนมัติ
เมื่อเรามีคำสั่งเพื่อต่ออายุใบรับรองได้แล้ว เราสามารถเขียน Bash ตั้ง Cronjob ให้รันคำสั่งนี้ทุกวันเพื่อที่เราจะได้ไม่ต้องมานั่งเช็ควันหมดอายุของใบรับรองและรันคำสั่งด้วยตัวเอง ขั้นตอนแรกให้เราสร้าง Script ขึ้นมาที่ /usr/local/sbin โดยใช้คำสั่ง
1 |
sudo nano /usr/local/sbin/le-renew |
และให้นำ Shell Script ด้านล่างไปวางไว้
1 2 3 4 5 6 7 8 |
#!/bin/sh if ! /opt/letsencrypt/letsencrypt-auto certonly -tvv --apache --keep-until-expiring -d www.foo.com > /var/log/letsencrypt/renew.log 2>&1 ; then echo Automated renewal failed: cat /var/log/letsencrypt/renew.log exit 1 fi // only for Apache apachectl graceful |
Save และออกมาที่หน้า Console อีกครั้งและทำการตั้งค่าไฟล์ให้สามารถ Execute ได้
1 |
sudo chmod +x le-renew |
ทดสอบคำสั่ง
1 |
sudo ./le-renew |
หลังจากนั้นให้ Log-in เป็น root และตั้งค่า Cronjob
1 2 3 |
sudo su crontab -e |
เพิ่ม Cronjob ให้รันทุกวันตอนตี 2
1 |
0 2 * * * /usr/local/sbin/le-renew >> /var/log/le-renew.log |
เป็นอันเสร็จสิ้นการตั้งค่า Cronjob ครับ
สรุปคำสั่งและ Directory ต่างๆ
Directory ต่างๆ ที่ใช้
- Let’s Encrypt Client -> /opt/letsencrypt
- ใบรับรอง (Certificate) -> /etc/letsencrypt/live/www.foo.com/
- Script ต่ออายุใบรับรอง -> /usr/local/sbin/le-renew
สามารถดูไฟล์ต่างๆ ที่ Let’s Encrypt Client เปลี่ยนโดย
1 |
./letsencrypt-auto config_changes |
Rollback การติดตั้ง SSL
1 |
./letsencrypt-auto rollback |
ยกเลิกใบรับรอง
1 |
./letsencrypt-auto revoke |
ทิ้งท้าย
จะเห็นได้ว่าตัว Client ของ Let’s Encrypt ค่อนข้างที่จะมีคำสั่งต่างๆ ให้เราใช้อย่างครบครัน ตั้งแต่ขั้นตอนแรกจนถึงสุดท้ายการ Generate ใบรับรองรวมถึงการต่ออายุทั้งหมดจะถูกจัดการโดยตัว Client ทั้งหมด นับว่าเป็น Service ที่ทำออกมาได้ดีมากๆ เลยทีเดียว หลังจากนี้เราอาจจะได้เห็นเว็บไซต์ต่างๆใช้ HTTPS กันมากขึ้น และผมหวังว่าการที่เว็บไซต์เข้ารหัสการส่งข้อมูลกันมากขึ้นจะทำให้อัตราการโจรกรรมข้อมูลบนโลกไซเบอร์จะลดน้อยลงไปด้วยเช่นกัน
หากมีคำถามใดๆ หรือบทความมีข้อผิดพลาดตรงไหนสามารถแจ้งได้ใน Comment ด้านล่างเลยครับ
อ้างอิง
- https://letsencrypt.org/howitworks/
- https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-14-04
- http://stackoverflow.com/questions/21297853/how-to-determine-ssl-cert-expiration-date-from-a-pem-encoded-certificate
- https://letsencrypt.readthedocs.org/en/latest/using.html#plugins