ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ขอ SSL ฟรีจาก Let's Encrypt บน IIS ด้วย win-acme

ขอ SSL ฟรีจาก Let's Encrypt บน IIS ด้วย win-acme

Let's Encrypt เป็นผู้ออก SSL Certificate ฟรีที่เบราว์เซอร์ทุกตัวเชื่อถือ ใบรับรองมีอายุสั้น (ปัจจุบัน 90 วัน และ Let's Encrypt ประกาศแผนจะลดอายุลงอีก) จึงต้องต่ออายุอัตโนมัติ บน Linux มักใช้ Certbot ส่วนบน Windows Server ที่ใช้ IIS เครื่องมือที่นิยมที่สุดคือ win-acme (ไฟล์ wacs.exe) ซึ่งเป็นโปรแกรมโอเพนซอร์สที่ขอใบรับรอง สร้าง HTTPS Binding ใน IIS และสร้าง Scheduled Task สำหรับต่ออายุให้ครบในขั้นตอนเดียว

บทความนี้ใช้วิธีตรวจสอบโดเมนแบบ HTTP (http-01) ซึ่งเหมาะกับเว็บไซต์ทั่วไปที่ชี้โดเมนมาที่เซิร์ฟเวอร์แล้ว

สิ่งที่ต้องเตรียม

  • Windows Server 2019 หรือ 2022 ที่ติดตั้ง IIS ตาม ติดตั้ง IIS Web Server บน Windows Server และบัญชีในกลุ่ม Administrators
  • เว็บไซต์ใน IIS ที่มี Binding แบบ http พอร์ต 80 พร้อม Host name เช่น example.com และ www.example.com เพราะ win-acme ใช้ Host name ใน Binding เป็นรายชื่อโดเมนที่จะขอ
  • A Record ของทุกชื่อชี้มาที่ IP ของเซิร์ฟเวอร์แล้ว ตรวจด้วยวิธีใน ตรวจสอบ DNS ด้วย nslookup และ dig
  • พอร์ต 80 และ 443 เปิดใน Windows Defender Firewall ตาม เปิด Port บน Windows Defender Firewall หากเซิร์ฟเวอร์มี Security Group หรือ Firewall ภายนอกจากฝั่งผู้ให้บริการ ให้เปิดพอร์ตนั้นเพิ่มด้วย

หมายเหตุ: พอร์ต 80 ต้องเปิดให้ทุก IP เข้าถึงได้ตลอดเวลา ไม่ใช่เฉพาะตอนขอครั้งแรก เพราะเซิร์ฟเวอร์ของ Let's Encrypt ต้องเข้ามาตรวจทุกครั้งที่ต่ออายุ ถ้าเว็บไซต์อยู่หลัง Cloudflare แบบ Proxy ดูข้อควรระวังใน เลือก SSL/TLS Mode บน Cloudflare ให้ถูกต้อง

ขั้นตอนที่ 1: ดาวน์โหลดและแตกไฟล์ win-acme

  1. ดาวน์โหลดจากเว็บไซต์ทางการ win-acme.com (หรือหน้า Releases ของโครงการบน GitHub) เลือกไฟล์รุ่นล่าสุดแบบ x64 trimmed ซึ่งเพียงพอสำหรับ IIS
  2. สร้างโฟลเดอร์ถาวร เช่น C:\Tools\win-acme แล้วแตกไฟล์ zip ลงไป อย่าแตกไว้ใน Downloads หรือโฟลเดอร์ชั่วคราว เพราะ Scheduled Task ที่สร้างขึ้นจะชี้มาที่ตำแหน่งนี้ ถ้าย้ายหรือลบทิ้ง การต่ออายุจะหยุดทำงาน
  3. ถ้า Windows บล็อกไฟล์ที่ดาวน์โหลดมา ให้คลิกขวาที่ไฟล์ zip ก่อนแตก เลือก Properties แล้วเลือก Unblock

ขั้นตอนที่ 2: รัน wacs.exe และขอใบรับรอง

คลิกขวาที่ wacs.exe แล้วเลือก Run as administrator หรือเปิด PowerShell แบบ Administrator แล้วรัน

cd C:\Tools\win-acme
.\wacs.exe

โปรแกรมเป็นเมนูแบบข้อความ ข้อความและตัวอักษรของเมนูอาจต่างกันเล็กน้อยตามเวอร์ชัน ลำดับโดยทั่วไปเป็นดังนี้

  1. เลือก N: Create certificate (default settings) ซึ่งใช้ Source เป็น IIS ตรวจแบบ http-01 และติดตั้ง Binding ให้
  2. โปรแกรมแสดงรายชื่อเว็บไซต์ใน IIS ที่มี Host name ให้พิมพ์หมายเลขของเว็บไซต์ที่ต้องการ
  3. โปรแกรมแสดงรายชื่อ Binding ของเว็บไซต์นั้น ให้กด Enter เพื่อเลือกทั้งหมด หรือพิมพ์หมายเลขเฉพาะชื่อที่ต้องการ คั่นด้วยจุลภาค
  4. ยืนยันรายชื่อโดเมนที่จะอยู่ในใบรับรอง
  5. ครั้งแรกจะถามอีเมลและให้ยอมรับข้อตกลงการใช้งาน (Terms of Service) ของ Let's Encrypt

ถ้าสำเร็จจะเห็นข้อความประมาณว่าตรวจสอบโดเมนผ่าน (Authorization result: valid) ติดตั้งใบรับรองลงใน Certificate Store สร้างหรืออัปเดต Binding แบบ https และบอกวันที่จะต่ออายุครั้งถัดไป

ถ้าต้องการใบรับรองแบบ Wildcard (*.example.com) ต้องใช้การตรวจแบบ DNS (dns-01) ผ่านเมนู M: Create certificate (full options) ซึ่งต้องเพิ่ม TXT Record ที่ DNS ของโดเมน หรือใช้ปลั๊กอินของผู้ให้บริการ DNS รายละเอียดดูที่ เอกสาร DNS validation ของ win-acme

ขั้นตอนที่ 3: ตรวจ Scheduled Task สำหรับต่ออายุ

win-acme สร้าง Task ใน Task Scheduler ชื่อขึ้นต้นด้วย win-acme renew ซึ่งรันทุกวัน และต่ออายุใบรับรองเมื่อถึงกำหนด (ค่าเริ่มต้นประมาณ 55 วันหลังออกใบรับรอง) ตรวจสอบได้ด้วย PowerShell

Get-ScheduledTask | Where-Object TaskName -like "win-acme*" | Get-ScheduledTaskInfo

ผลลัพธ์แสดง LastRunTime, LastTaskResult และ NextRunTime ค่า LastTaskResult เป็น 0 หมายถึงรันสำเร็จ (รายละเอียดการใช้ Task Scheduler ดูที่ ตั้งเวลาให้งานทำงานอัตโนมัติด้วย Task Scheduler บน Windows Server)

ข้อมูลการตั้งค่าและรายการใบรับรองที่ win-acme ดูแลอยู่เก็บที่ C:\ProgramData\win-acme\ ส่วน Log อยู่ในโฟลเดอร์ย่อย Log ของโฟลเดอร์เดียวกัน ควรรวมโฟลเดอร์นี้ไว้ในแผนสำรองข้อมูลของเซิร์ฟเวอร์

ขั้นตอนที่ 4: ทดสอบการต่ออายุ

เปิด wacs.exe แบบ Administrator อีกครั้ง เลือกเมนู A: Manage renewals จะเห็นรายการใบรับรองพร้อมวันต่ออายุถัดไป จากเมนูนี้สามารถเลือกรันการต่ออายุทันทีเพื่อทดสอบได้

หรือใช้ Command Line ต่ออายุเฉพาะรายการที่ถึงกำหนด (ถ้ายังไม่ถึงกำหนด โปรแกรมจะแจ้งว่ายังไม่ต้องต่ออายุ ซึ่งเป็นผลปกติ)

.\wacs.exe --renew

ไม่ควรบังคับต่ออายุซ้ำ ๆ ด้วยตัวเลือก --force เพราะ Let's Encrypt จำกัดจำนวนใบรับรองซ้ำชุดเดิมต่อสัปดาห์ (Rate Limit) ถ้าเกินจะขอใหม่ไม่ได้ชั่วคราว

ตรวจสอบผลลัพธ์

  • เปิด https://example.com และ https://www.example.com ต้องไม่มีคำเตือน และผู้ออกใบรับรอง (Issuer) เป็นของ Let's Encrypt
  • ใน IIS Manager ที่ Bindings ของเว็บไซต์ ต้องมี https พอร์ต 443 สำหรับทุกชื่อ และเลือก Require Server Name Indication ไว้
  • Let's Encrypt ยกเลิกการส่งอีเมลเตือนใบรับรองใกล้หมดอายุไปแล้วตั้งแต่ปี 2025 จึงควรตั้งการตรวจวันหมดอายุเองตาม ตรวจสอบ SSL Certificate และวันหมดอายุ หรือใช้บริการ Uptime Monitoring ที่ตรวจ SSL ได้

ถ้าต้องการบังคับให้ผู้เข้าชมใช้ HTTPS เสมอ ดูตัวอย่างกฎ URL Rewrite ใน ติดตั้ง SSL Certificate บน IIS ข้อดีคือกฎนั้นไม่กระทบการตรวจของ Let's Encrypt เพราะ Let's Encrypt ยอมรับการ Redirect จาก http ไป https ระหว่างตรวจโดเมน

ปัญหาที่พบบ่อย

Authorization failed หรือ Validation failed

Let's Encrypt เข้ามาอ่านไฟล์ใต้ http://example.com/.well-known/acme-challenge/ ไม่ได้ สาเหตุที่พบบ่อย

  • DNS ยังชี้ไปที่อื่น เช่น โฮสต์เก่า หรือมี AAAA Record (IPv6) ที่ชี้ไปเซิร์ฟเวอร์อื่นหรือยังไม่ได้ตั้ง IPv6 บน IIS เพราะ Let's Encrypt จะเชื่อมต่อผ่าน IPv6 ก่อนถ้ามี AAAA Record
  • พอร์ต 80 ถูกปิดที่ Firewall ของ Windows หรือ Firewall ภายนอก
  • เว็บไซต์ตั้ง Require SSL ไว้ในหน้า SSL Settings ทำให้คำขอผ่าน http ถูกปฏิเสธด้วย Error 403
  • web.config ของแอปพลิเคชันมีกฎ Rewrite ที่ส่งทุก URL เข้าแอป ให้เพิ่มเงื่อนไขยกเว้นเส้นทาง .well-known

ข้อความ Error ใน Log ของ win-acme จะบอกรายละเอียด เช่น Connection refused, Timeout หรือ 404 ช่วยระบุได้ว่าสาเหตุอยู่ที่เครือข่ายหรืออยู่ที่ IIS

เว็บไซต์ไม่ปรากฏในรายการให้เลือก

win-acme แสดงเฉพาะเว็บไซต์ที่มี Binding พร้อม Host name ถ้า Binding ใช้ Host name ว่าง (รับทุกชื่อ) ให้แก้ Binding เพิ่มชื่อโดเมนก่อน แล้วรัน wacs.exe ใหม่

ใบรับรองหมดอายุทั้งที่เคยตั้งไว้แล้ว

ตรวจ LastTaskResult ของ Task ตามขั้นตอนที่ 3 และตรวจว่าโฟลเดอร์ของ wacs.exe ยังอยู่ที่เดิม ถ้าย้ายโฟลเดอร์ไปแล้ว ให้รัน wacs.exe จากตำแหน่งใหม่ เลือกเมนูจัดการ Scheduled Task (ในเมนู More options) เพื่อสร้าง Task ใหม่ให้ชี้ตำแหน่งที่ถูกต้อง

หากขอใบรับรองไม่สำเร็จและไม่แน่ใจว่าปัญหาอยู่ที่ DNS หรือ Firewall ภายนอก ติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security