การตั้งค่า HTTPS โดยใช้ Apache บน Ubuntu Server 26.04
เว็บไซต์ที่ยังใช้ http:// อาจทำให้ผู้ใช้งานเห็นคำเตือนว่า “Not Secure” บน Browser และยังมีความเสี่ยงจากการดักฟังข้อมูลระหว่างทาง โดยเฉพาะเว็บไซต์ที่มีหน้า Login, ระบบสมาชิก, Web Application หรือระบบหลังบ้านขององค์กร ดังนั้นการเปิดใช้งาน HTTPS จึงไม่ใช่เรื่องเสริม แต่เป็นพื้นฐานสำคัญของ Web Server ยุคปัจจุบัน
บทความนี้จะแนะนำการตั้งค่า HTTPS บน Apache แบบ Hands-on บน Ubuntu Server 26.04 LTS โดยใช้ได้ทั้งกรณีออกใบรับรองฟรีจาก Let’s Encrypt ด้วย Certbot และกรณีมีไฟล์ SSL Certificate อยู่แล้ว
Apache บน Ubuntu ใช้โครงสร้างไฟล์แบบ sites-available, sites-enabled และเปิดโมดูลด้วยคำสั่ง a2enmod ซึ่งเป็นแนวทางมาตรฐานของ Apache2 บน Ubuntu Server ส่วน Certbot เป็นเครื่องมือที่ออกแบบมาเพื่อช่วยเปลี่ยนเว็บไซต์ HTTP ให้ใช้งาน HTTPS และต่ออายุ Certificate อัตโนมัติ
ข้อมูลที่ใช้ในบทความ
-
OS: Ubuntu Server 26.04 LTS
-
Web Server: Apache 2.4.x
-
Domain ตัวอย่าง:
example.com -
Web root:
/var/www/example.com/public_html -
SSL: Let’s Encrypt หรือ Certificate ที่มีอยู่แล้ว
-
User: ใช้บัญชีที่มีสิทธิ์
sudo
ตรวจสอบเวอร์ชัน Apache ที่ติดตั้งจริงบนเครื่องได้ด้วยคำสั่งนี้
apache2 -v
Prerequisites
ก่อนเริ่มควรเตรียมสิ่งต่อไปนี้ให้พร้อม
-
มี Ubuntu Server ที่ติดตั้ง Apache แล้ว
-
มี Domain จริง เช่น
example.com -
DNS Record ของ Domain ชี้มายัง IP Server แล้ว
-
เปิด Port
80/tcpและ443/tcp -
มีสิทธิ์ใช้งานคำสั่ง
sudo
ตรวจสอบ IP ของ Server
curl -4 ifconfig.me
ตรวจสอบว่า Domain ชี้มาที่ Server แล้วหรือยัง
dig +short example.com
หากยังไม่มีคำสั่ง dig ให้ติดตั้งแพ็กเกจนี้ก่อน
sudo apt update
sudo apt install dnsutils -y
โครงสร้างการทำงานของ HTTPS บน Apache
แนวคิดแบบง่ายคือ

Apache จะรับ Request ผ่าน Port 443 จากนั้นใช้ SSL Certificate เพื่อยืนยันตัวตนของเว็บไซต์ และเข้ารหัสข้อมูลระหว่าง Browser กับ Server
ขั้นตอนที่ 1: ติดตั้ง Apache
เริ่มจากอัปเดต Package Index และติดตั้ง Apache
sudo apt update
# ติดตั้ง Apache Web Server
sudo apt install apache2 -y
เปิดใช้งาน Apache ให้เริ่มทำงานอัตโนมัติหลัง Boot
sudo systemctl enable apache2
sudo systemctl start apache2
ตรวจสอบสถานะ
sudo systemctl status apache2
ทดสอบจากเครื่อง Client หรือ Browser
curl -I http://example.com
ถ้าทำงานถูกต้องควรเห็น HTTP Header เช่น
HTTP/1.1 200 OK
Server: Apache
ขั้นตอนที่ 2: เตรียม Web Root
สร้างโฟลเดอร์สำหรับเว็บไซต์
sudo mkdir -p /var/www/example.com/public_html
กำหนดสิทธิ์เจ้าของไฟล์ให้ User ปัจจุบัน
sudo chown -R $USER:$USER /var/www/example.com/public_html
สร้างไฟล์ทดสอบ
nano /var/www/example.com/public_html/index.html
ใส่เนื้อหาทดสอบ
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<title>Apache HTTPS Test</title>
</head>
<body>
<h1>Apache HTTPS บน Ubuntu Server 26.04</h1>
<p>เว็บไซต์นี้พร้อมตั้งค่า HTTPS แล้ว</p>
</body>
</html>
ขั้นตอนที่ 3: สร้าง Apache VirtualHost สำหรับ HTTP
สร้างไฟล์ VirtualHost
sudo nano /etc/apache2/sites-available/example.com.conf
เพิ่มค่า Configuration ดังนี้
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
เปิดใช้งานเว็บไซต์
sudo a2ensite example.com.conf
ปิด Default Site ถ้าไม่ต้องการใช้
sudo a2dissite 000-default.conf
ตรวจสอบ Syntax ของ Apache
sudo apache2ctl configtest
ถ้าถูกต้องจะได้ผลลัพธ์
Syntax OK
Reload Apache
sudo systemctl reload apache2
ขั้นตอนที่ 4: เปิด Firewall สำหรับ HTTP และ HTTPS
หากใช้ UFW ให้เปิด Profile ของ Apache
sudo ufw allow 'Apache Full'
ตรวจสอบสถานะ Firewall
sudo ufw status
ผลลัพธ์ควรมีลักษณะประมาณนี้
Apache Full ALLOW Anywhere
Apache Full (v6) ALLOW Anywhere (v6)
⚠️ ข้อควรระวัง: ไม่ควรปิด Firewall เพื่อแก้ปัญหาแบบถาวร ควรเปิดเฉพาะ Port ที่จำเป็น เช่น 80/tcp, 443/tcp และ 22/tcp สำหรับ SSH เท่านั้น
ขั้นตอนที่ 5: ติดตั้ง Certbot สำหรับออก SSL Certificate
แนวทางที่แนะนำสำหรับ Ubuntu คือการใช้ Certbot ผ่าน Snap ตามเอกสารของ Certbot โดยสามารถใช้ Plugin สำหรับ Apache เพื่อช่วยแก้ไข Configuration และเปิด HTTPS ได้อัตโนมัติ
ติดตั้ง Snap หากยังไม่มี
sudo apt install snapd -y
อัปเดต Snap Core
sudo snap install core
sudo snap refresh core
ติดตั้ง Certbot
sudo snap install --classic certbot
สร้าง Symbolic Link เพื่อให้เรียกคำสั่ง certbot ได้ง่าย
sudo ln -s /snap/bin/certbot /usr/bin/certbot
ตรวจสอบเวอร์ชัน
certbot --version
ขั้นตอนที่ 6: ออก SSL Certificate ด้วย Let’s Encrypt
ใช้คำสั่งนี้เพื่อออก Certificate และให้ Certbot ตั้งค่า Apache ให้โดยอัตโนมัติ
sudo certbot --apache -d example.com -d www.example.com
ระหว่างการทำงาน Certbot จะถามข้อมูล เช่น
-
Email สำหรับแจ้งเตือนวันหมดอายุ
-
ยอมรับ Terms of Service
-
ต้องการ Redirect HTTP ไป HTTPS หรือไม่
แนะนำให้เลือก Redirect เพื่อบังคับให้ผู้ใช้เข้าเว็บผ่าน HTTPS เสมอ
หลังจากเสร็จแล้ว Certbot จะสร้างไฟล์ SSL Certificate ไว้ที่ประมาณนี้
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem
โดยทั่วไป Apache จะถูกเพิ่ม VirtualHost สำหรับ Port 443 ให้อัตโนมัติ
ขั้นตอนที่ 7: ตรวจสอบ VirtualHost HTTPS
ดูไฟล์ Configuration ที่ Certbot สร้างหรือแก้ไข
sudo ls -l /etc/apache2/sites-available/
เปิดดูไฟล์ SSL ที่เกี่ยวข้อง
sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf
ตัวอย่างโครงสร้างที่ควรพบ
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
ErrorLog ${APACHE_LOG_DIR}/example.com-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-ssl-access.log combined
</VirtualHost>
</IfModule>
Directive เช่น SSLEngine, SSLCertificateFile และ SSLCertificateKeyFile เป็นส่วนหนึ่งของ mod_ssl ที่ใช้เปิดใช้งาน SSL/TLS บน Apache
ตรวจสอบ Apache อีกครั้ง
sudo apache2ctl configtest
Reload Service
sudo systemctl reload apache2
กรณีมี SSL Certificate อยู่แล้ว
หากซื้อ Certificate จากผู้ให้บริการอื่น หรือได้รับไฟล์จากองค์กรมาแล้ว ให้เตรียมไฟล์ประมาณนี้
example.com.crt
example.com.key
ca-bundle.crt
สร้างโฟลเดอร์เก็บ Certificate
sudo mkdir -p /etc/ssl/example.com
คัดลอกไฟล์ Certificate เข้าไป
sudo cp example.com.crt /etc/ssl/example.com/
sudo cp example.com.key /etc/ssl/example.com/
sudo cp ca-bundle.crt /etc/ssl/example.com/
กำหนดสิทธิ์ไฟล์ Private Key
sudo chown root:root /etc/ssl/example.com/example.com.key
sudo chmod 600 /etc/ssl/example.com/example.com.key
⚠️ ข้อควรระวัง: ไฟล์ .key คือ Private Key ห้ามส่งให้ผู้อื่น ห้ามอัปโหลดขึ้น GitHub และไม่ควรเก็บในโฟลเดอร์เว็บไซต์ เช่น /var/www/
เปิดใช้งาน SSL Module
sudo a2enmod ssl
สร้างไฟล์ VirtualHost สำหรับ HTTPS
sudo nano /etc/apache2/sites-available/example.com-ssl.conf
ใส่ Configuration
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
SSLEngine on
# ไฟล์ Certificate ของเว็บไซต์
SSLCertificateFile /etc/ssl/example.com/example.com.crt
# ไฟล์ Private Key
SSLCertificateKeyFile /etc/ssl/example.com/example.com.key
# ไฟล์ Intermediate Certificate หรือ CA Bundle
SSLCertificateChainFile /etc/ssl/example.com/ca-bundle.crt
ErrorLog ${APACHE_LOG_DIR}/example.com-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-ssl-access.log combined
</VirtualHost>
</IfModule>
เปิดใช้งาน Site
sudo a2ensite example.com-ssl.conf
ตรวจสอบ Syntax
sudo apache2ctl configtest
Reload Apache
sudo systemctl reload apache2
ขั้นตอนที่ 8: Redirect HTTP ไป HTTPS
หาก Certbot ไม่ได้ตั้งค่า Redirect ให้ หรือใช้ Certificate ขององค์กรเอง ให้แก้ไฟล์ HTTP VirtualHost
sudo nano /etc/apache2/sites-available/example.com.conf
ปรับเป็น
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
# บังคับ redirect ทุก request ไป HTTPS
Redirect permanent / https://example.com/
</VirtualHost>
ตรวจสอบและ Reload
sudo apache2ctl configtest
sudo systemctl reload apache2
ทดสอบ
curl -I http://example.com
ควรได้ผลลัพธ์ประมาณนี้
HTTP/1.1 301 Moved Permanently
Location: https://example.com/
ขั้นตอนที่ 9: ปรับแต่ง TLS Security เบื้องต้น
เปิดใช้งาน Module ที่จำเป็น
sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod rewrite
สร้างไฟล์ Configuration สำหรับ SSL Hardening
sudo nano /etc/apache2/conf-available/ssl-hardening.conf
เพิ่มค่าเบื้องต้น
# ปิด Protocol เก่า และเปิดใช้ TLS 1.2 / 1.3
SSLProtocol -all +TLSv1.2 +TLSv1.3
# Cipher Suite สำหรับ TLS 1.2
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!CAMELLIA
# ปิด SSL Compression เพื่อลดความเสี่ยงบางประเภท
SSLCompression off
# เปิด HSTS เฉพาะเมื่อมั่นใจว่าเว็บไซต์ใช้ HTTPS ได้สมบูรณ์แล้ว
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# Security Header พื้นฐาน
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
เปิดใช้งาน Configuration
sudo a2enconf ssl-hardening.conf
ตรวจสอบ
sudo apache2ctl configtest
sudo systemctl reload apache2
⚠️ ข้อควรระวังเรื่อง HSTS: หากเปิด includeSubDomains แล้ว Subdomain บางตัวในองค์กรยังไม่รองรับ HTTPS อาจทำให้ผู้ใช้เข้าใช้งาน Subdomain เหล่านั้นไม่ได้ ควรตรวจสอบให้ครบก่อนใช้งานจริง
ขั้นตอนที่ 10: ทดสอบ HTTPS
ทดสอบด้วย Browser
https://example.com
สิ่งที่ควรตรวจสอบ
-
มีรูปกุญแจบน Address Bar
-
Certificate ออกให้กับ Domain ถูกต้อง
-
ไม่มี Mixed Content เช่น รูปภาพหรือ Script ที่ยังโหลดผ่าน HTTP
-
เข้า
http://example.comแล้วถูก Redirect ไปhttps://example.com
ทดสอบด้วย curl
curl -I https://example.com
ตัวอย่างผลลัพธ์
HTTP/2 200
server: Apache
strict-transport-security: max-age=31536000; includeSubDomains
ทดสอบ Certificate ด้วย OpenSSL
openssl s_client -connect example.com:443 -servername example.com
ดูวันหมดอายุของ Certificate
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates
ขั้นตอนที่ 11: ตรวจสอบ Auto Renew ของ Let’s Encrypt
Certbot จะมีระบบต่ออายุ Certificate ให้อัตโนมัติ แต่ควรทดสอบด้วยคำสั่งนี้
sudo certbot renew --dry-run
ถ้าสำเร็จควรเห็นข้อความประมาณนี้
Congratulations, all simulated renewals succeeded
ตรวจสอบ Timer ของ Certbot
systemctl list-timers | grep certbot
หรือกรณีติดตั้งผ่าน Snap
systemctl list-timers | grep snap.certbot
Troubleshooting ที่พบบ่อย
1. Certbot ออก Certificate ไม่ได้
ตรวจสอบว่า Domain ชี้มาที่ Server ถูกต้องหรือไม่
dig +short example.com
ตรวจสอบว่า Apache ฟัง Port 80 อยู่หรือไม่
sudo ss -tulpn | grep ':80'
ตรวจสอบ Firewall
sudo ufw status
2. Apache Reload ไม่ผ่าน
ตรวจสอบ Syntax
sudo apache2ctl configtest
ดู Log เพิ่มเติม
sudo journalctl -u apache2 -xe
หรือดู Error Log ของ Apache
sudo tail -f /var/log/apache2/error.log
3. Browser แจ้งว่า Certificate ไม่ตรงกับ Domain
มักเกิดจาก
-
ใช้ Certificate ผิด Domain
-
ลืมใส่
ServerAlias www.example.com -
เข้าเว็บผ่าน IP Address แทน Domain
-
DNS ยังไม่อัปเดต
ตรวจสอบ Certificate ที่ Apache ส่งออกมา
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer
4. เว็บไซต์ยังแสดง Not Secure
ให้ตรวจสอบ Mixed Content เช่น รูปภาพ, CSS, JavaScript ที่ยังเรียกผ่าน http://
ค้นหาในไฟล์เว็บไซต์
grep -R "http://" /var/www/example.com/public_html
ถ้าพบ URL เดิม ให้ปรับเป็น https:// หรือใช้ Relative URL แทน
จุดที่ควร Capture Screenshot สำหรับบทความ
แนะนำเพิ่มภาพประกอบในบทความตามจุดต่อไปนี้
-
หน้า Apache Default Page หลังติดตั้ง
-
หน้า DNS Record ของ Domain
-
Terminal ตอนรัน
sudo certbot --apache -
Browser หลังเปิด HTTPS สำเร็จ
-
หน้ารายละเอียด Certificate ใน Browser
-
ผลลัพธ์
curl -I https://example.com -
ผลลัพธ์
sudo certbot renew --dry-run
สรุป
การตั้งค่า HTTPS บน Apache บน Ubuntu Server 26.04 มีขั้นตอนหลักคือ เตรียม VirtualHost ให้ถูกต้อง เปิด Port 80/443 ติดตั้ง Certbot ออก SSL Certificate จาก Let’s Encrypt และตรวจสอบว่า HTTP ถูก Redirect ไป HTTPS อย่างสมบูรณ์ สำหรับ Production Server ควรเพิ่มการ Hardening TLS และ Security Headers เพื่อยกระดับความปลอดภัยของเว็บไซต์
หัวใจสำคัญคืออย่าเพียงแค่ “ทำให้มี HTTPS” แต่ต้องตรวจสอบให้ครบว่า Certificate ถูกต้อง, Auto Renew ทำงาน, ไม่มี Mixed Content และ Apache Configuration ผ่านการทดสอบก่อน Reload ทุกครั้ง
—
Write by Dr.Arnut Ruttanatirakul
SysAdmin Knowledge
https://www.sysadmin.in.th
July 3, 2026

