การตั้งค่า HTTPS โดยใช้ Apache บน Ubuntu Server 26.04

การตั้งค่า HTTPS โดยใช้ Apache บน Ubuntu Server 26.04

การตั้งค่า 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

ก่อนเริ่มควรเตรียมสิ่งต่อไปนี้ให้พร้อม

  1. มี Ubuntu Server ที่ติดตั้ง Apache แล้ว

  2. มี Domain จริง เช่น example.com

  3. DNS Record ของ Domain ชี้มายัง IP Server แล้ว

  4. เปิด Port 80/tcp และ 443/tcp

  5. มีสิทธิ์ใช้งานคำสั่ง 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 สำหรับบทความ

แนะนำเพิ่มภาพประกอบในบทความตามจุดต่อไปนี้

  1. หน้า Apache Default Page หลังติดตั้ง

  2. หน้า DNS Record ของ Domain

  3. Terminal ตอนรัน sudo certbot --apache

  4. Browser หลังเปิด HTTPS สำเร็จ

  5. หน้ารายละเอียด Certificate ใน Browser

  6. ผลลัพธ์ curl -I https://example.com

  7. ผลลัพธ์ 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