ติดตั้ง 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 ยังอยู่ในเวอร์ชัน 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 (ถ้ามีแล้วสามารถข้ามไปขั้นตอนต่อไปได้เลย)

ทำการ Clone ตัว Client ไปไว้ที่ /opt  ซึ่งเป็น Directory สำหรับการติดตั้ง Third-Party Package

เข้าไปที่ Directory ที่เราได้ Clone ตัว Client ไว้

ทดสอบเรียกตัว Client ซึ่งเราจะเห็นว่าทาง Let’s Encrypt ได้เตรียม Command ต่างๆ ไว้ให้เรียกใช้ได้ค่อนข้างที่จะครบครัน

lets-encrypt-commands

การขอและติดตั้งใบรับรองสำหรับ Apache

เริ่มทำการติดตั้ง โดยให้ส่งชื่อ Domain ที่ต้องการจะออกใบรับรองเข้าไป

**ในขั้นตอนนี้หากพบ Error: urn:acme:error:connection ให้ตรวจสอบว่า Port: 443 บน Server ได้เปิดไว้แล้ว**

หลังจากนั้นจะมี Interactive Screen ขึ้นมาเพื่อให้เลือกว่าเราต้องการให้เว็บไซต์ของเราถูกเรียกผ่าน HTTPS เสมอหรือไม่ ซึ่งแนะนำให้เลือกเป็นแบบ Secure (ตัว Client จะตั้งค่า RewriteEngine ที่ vhost เดิมเพื่อ Redirect ไปที่ HTTPS ให้)
lets-encrypt-https-option

เมื่อการติดตั้งเสร็จเรียบร้อยแล้วตัว Client ของ Let’s Encrypt จะแนะนำให้เราตรวจสอบการทำงานของใบรับรองและ HTTPS ที่

จะเห็นได้ว่าการขอและติดตั้งใบรับรองให้กับ Apache ตัว Client ของ Let’s Encrypt แทบจะจัดการให้เราทั้งหมดซึ่งทำให้เราประหยัดเวลาไปได้มากเลยทีเดียว

สำหรับผู้ที่ใช้ Web Server อื่นๆ ที่ไม่ใช่ Apache สามารถดูวิธีการขอใบรับรองเพียงอย่างเดียวเพื่อสามารถนำไปติดตั้งเองต่อไปในหัวข้อถัดไปนะครับ

การขอใบรับรองเพียงอย่างเดียวสำหรับ Web Server อื่นๆ

คำสั่งสำหรับขอใบรับรองของ Let’s Encrypt มีอยู่หลายคำสั่งด้วยกัน แต่คำสั่งที่แนะนำจะเป็น

โดยคำสั่งนี้จะรับ Parameter 2 ตัวด้วยกันคือ

-w  – ให้แทน /var/www/www.bar.com/public_html/  ด้วย Directory ของ Website ที่จะทำการขอ Domain

-d  – ให้แทนด้วย Domain ที่ต้องการจะขอใบรับรอง

หลังจากกด Enter รอสักพักเพื่อให้ Let’s Encrypt ทำการขอใบรับรองและยืนยันความเป็นเจ้าของ และเมื่อดำเนินการเสร็จสิ้นจะมีข้อความดังภาพด้านล่างแสดงซึ่งจะแสดงตำแหน่งของใบรับรองที่ได้ รวมถึงวันหมดอายุด้วย

หลังจากนี้สามารถนำใบรับรองที่ได้ไปติดตั้งกับ Web Server ต่อได้เลยครับ

ส่วนวิธีอื่นๆ จะมีอีก 2 วิธีนะครับซึ่งจะอนุญาตลงรายละเอียดไว้คร่าวๆ นะครับ คือ

  1. ./letsencrypt-auto certonly --standalone  – คำสั่งนี้เราจะต้องใช้ Port: 80 ในการขอใบรับรองดังนั้นจะไม่เหมาะกับการรันบน Production Server
  2. ./letsencrypt-auto certonly --manual  – ใช้สำหรับการขอใบรับรองบนเครื่องที่ไม่ใช่ Web Server ซึ่งจะมีขั้นตอนการยืนยันความเป็นเจ้าของโดยใช้การรันคำสั่งอื่นๆ บนอีก Terminal นึง

การต่ออายุใบรับรอง

ใบรับรองที่ได้จาก Let’s Encrypt จะมีอายุเพียง 90 วันเราจึงจำเป็นที่จะต้องต่ออายุใบรับรองใหม่ก่อนที่ใบรับรองจะหมดอายุโดยเราสามารถใช้ Client ของ Let’s Encrypt ที่มีฟังก์ชันนี้มาให้ด้วยอยู่แล้ว

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

การต่ออายุใบรับรองของ Web Server ที่ใช้ Apache สามารถใช้คำสั่ง

สำหรับ Web Server อื่นๆ 

ให้สังเกต Parameter  --keep-until-expiring  โดยถ้าเราส่งParamter นี้เข้าไปด้วยตัว Client จะเช็คอายุของใบรับรองและจะต่ออายุให้ก็ต่อเมื่ออายุของใบรับรองต่ำกว่า 30 วัน โดยถ้าหากต้องการทดลอง Force ให้ตัว Client ต่ออายุใบรับรองให้เสมอเราสามารถใช้ Parameter  --renew-by-default  แทนได้และถ้าหากใบรับรองได้รับการต่ออายุแล้วจะมีข้อความขึ้นตามภาพด้านล่าง

le-renewal

สำหรับการต่ออายุใบรับรองทาง Let’s Encrypt ได้ตั้งข้อจำกัดไว้ให้ 1 Domain สามารถต่อใบอายุรับรองได้ 5 ครั้งภายใน 7 วัน

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

เมื่อเรามีคำสั่งเพื่อต่ออายุใบรับรองได้แล้ว เราสามารถเขียน Bash ตั้ง Cronjob ให้รันคำสั่งนี้ทุกวันเพื่อที่เราจะได้ไม่ต้องมานั่งเช็ควันหมดอายุของใบรับรองและรันคำสั่งด้วยตัวเอง ขั้นตอนแรกให้เราสร้าง Script ขึ้นมาที่ /usr/local/sbin โดยใช้คำสั่ง

และให้นำ Shell Script ด้านล่างไปวางไว้

Save และออกมาที่หน้า Console อีกครั้งและทำการตั้งค่าไฟล์ให้สามารถ Execute ได้

ทดสอบคำสั่ง

หลังจากนั้นให้ Log-in เป็น root และตั้งค่า Cronjob

เพิ่ม Cronjob ให้รันทุกวันตอนตี 2

เป็นอันเสร็จสิ้นการตั้งค่า 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 เปลี่ยนโดย

Rollback การติดตั้ง SSL

ยกเลิกใบรับรอง

ทิ้งท้าย

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

หากมีคำถามใดๆ หรือบทความมีข้อผิดพลาดตรงไหนสามารถแจ้งได้ใน Comment ด้านล่างเลยครับ

อ้างอิง

  1. https://letsencrypt.org/howitworks/
  2. https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-14-04
  3. http://stackoverflow.com/questions/21297853/how-to-determine-ssl-cert-expiration-date-from-a-pem-encoded-certificate
  4. https://letsencrypt.readthedocs.org/en/latest/using.html#plugins
prapat
  • จากที่สอบถามเข้ามานะครับว่ารันคำสั่ง
    ./letsencrypt-auto certonly --standalone --email foo@bar.com -d bar.com
    แล้วยังไม่ได้ Cert ให้ลองตรวจสอบ Port: 80 นะครับว่ามี Process ไหนรันอยู่และให้ Kill Process นั้นไปก่อน
    หรืออาจจะส่งอีก Parameter --standalone-supported-challenges tls-sni-01 นึงเพื่อให้ Let’s Encrypt Client ใช้ Port 443 เป็น
    ./letsencrypt-auto certonly --standalone --standalone-supported-challenges tls-sni-01 --email foo@bar.com -d bar.com

    แต่จากในบทความนะครับว่าวิธีนี้จะไม่เหมาะกับ Production Server เนื่องจากเราอาจจะต้องหยุด Server ชั่วคราวในการ Generate Cert จึงแนะนำให้ใช้วิธี –webroot ตามในบทความครับ

  • longkyanh

    well, how can I read this 🙂

  • Songwut Kanchanagosai

    น่าจะแถม Nginx ด้วยนะครับ

    • สวัสดีครับ @songwutkanchanagosai:disqus ลองดูหัวข้อ “การขอใบรับรองเพียงอย่างเดียวสำหรับ Web Server อื่นๆ” หรือยังครับ
      สามารถขอเฉพาะ Cert แล้วไปติดตั้งด้วยต่อได้เองเลยครับ พอดีตัว Client จะรองรับการติดตั้งให้ Apache แบบอัตโนมัติมาเลยครับ เลยจะดูง่ายกว่าตัวอื่น

  • Tanashin Kishimoto

    เยี่ยมครับ