ขอ 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
- ดาวน์โหลดจากเว็บไซต์ทางการ win-acme.com (หรือหน้า Releases ของโครงการบน GitHub) เลือกไฟล์รุ่นล่าสุดแบบ x64 trimmed ซึ่งเพียงพอสำหรับ IIS
- สร้างโฟลเดอร์ถาวร เช่น
C:\Tools\win-acmeแล้วแตกไฟล์ zip ลงไป อย่าแตกไว้ใน Downloads หรือโฟลเดอร์ชั่วคราว เพราะ Scheduled Task ที่สร้างขึ้นจะชี้มาที่ตำแหน่งนี้ ถ้าย้ายหรือลบทิ้ง การต่ออายุจะหยุดทำงาน - ถ้า Windows บล็อกไฟล์ที่ดาวน์โหลดมา ให้คลิกขวาที่ไฟล์ zip ก่อนแตก เลือก Properties แล้วเลือก Unblock
ขั้นตอนที่ 2: รัน wacs.exe และขอใบรับรอง
คลิกขวาที่ wacs.exe แล้วเลือก Run as administrator หรือเปิด PowerShell แบบ Administrator แล้วรัน
cd C:\Tools\win-acme
.\wacs.exe
โปรแกรมเป็นเมนูแบบข้อความ ข้อความและตัวอักษรของเมนูอาจต่างกันเล็กน้อยตามเวอร์ชัน ลำดับโดยทั่วไปเป็นดังนี้
- เลือก N: Create certificate (default settings) ซึ่งใช้ Source เป็น IIS ตรวจแบบ http-01 และติดตั้ง Binding ให้
- โปรแกรมแสดงรายชื่อเว็บไซต์ใน IIS ที่มี Host name ให้พิมพ์หมายเลขของเว็บไซต์ที่ต้องการ
- โปรแกรมแสดงรายชื่อ Binding ของเว็บไซต์นั้น ให้กด Enter เพื่อเลือกทั้งหมด หรือพิมพ์หมายเลขเฉพาะชื่อที่ต้องการ คั่นด้วยจุลภาค
- ยืนยันรายชื่อโดเมนที่จะอยู่ในใบรับรอง
- ครั้งแรกจะถามอีเมลและให้ยอมรับข้อตกลงการใช้งาน (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/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
Related Posts
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี


