วิธีสร้าง Self-Signed Certificate & Key บน CentOS / RHEL ใส่ใน Apache


1.สร้าง directory เก็บไฟล์ certificate (ถ้ายังไม่มี)

sudo mkdir -p /etc/pki/tls/certs
sudo mkdir -p /etc/pki/tls/private

2.สร้าง self-signed certificate กับ private key ด้วยคำสั่งนี้

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/pki/tls/private/chaiyakul.com.key \
  -out /etc/pki/tls/certs/chaiyakul.com.crt

จะถามข้อมูลบางอย่าง เช่น

  • Country Name (2 letter code)
  • State or Province Name
  • Locality Name
  • Organization Name
  • Common Name (ยกตัวอย่าง ใส่ chaiyakul.com หรือ www.chaiyakul.com)
  • Email Address

กรอกข้อมูลตามจริงหรือเว้นว่างได้ (แต่ Common Name ต้องใส่โดเมนหรือ IP ที่ใช้งาน)

3.แก้ไขไฟล์ SSL config ให้ชี้ไปที่ไฟล์นี้ (ตามตัวอย่างก่อนหน้า)

SSLCertificateFile /etc/pki/tls/certs/chaiyakul.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/chaiyakul.com.key

4.ทดสอบ config Apache

sudo apachectl configtest

ถ้า Syntax OK แสดงว่าไฟล์ config ถูกต้อง

5.รีสตาร์ท Apache

sudo systemctl restart httpd

หมายเหตุ

  • Self-signed cert จะทำให้ browser แจ้งเตือนว่าไม่ปลอดภัย (untrusted) เพราะไม่ผ่าน CA ที่เชื่อถือได้
  • เหมาะสำหรับทดสอบในเครื่องหรือระบบ internal
  • หากจะใช้จริงบนอินเทอร์เน็ต ควรใช้ Let’s Encrypt เพื่อขอฟรี certificate ที่ trusted

ตำแหน่ง VirtualHost

ตำแหน่งของการกำหนด <VirtualHost *:443> (SSL) อยู่ในไฟล์คอนฟิกของ Apache ครับ ขึ้นอยู่กับว่า Apache บนเครื่องคุณถูกตั้งค่าอย่างไร — โดยทั่วไปมักจะอยู่ในไฟล์เหล่านี้:

ตำแหน่งไฟล์สำหรับ VirtualHost SSL

แบบที่ 1: แยกไฟล์แต่ละ VirtualHost

/etc/httpd/conf.d/ssl.conf         ← ไฟล์หลักสำหรับ SSL (CentOS/RHEL)

แนะนำให้เพิ่มหรือแก้ไข <VirtualHost *:443> ในไฟล์นี้ หรือสร้างไฟล์ใหม่ใน /etc/httpd/conf.d/ เช่น:

/etc/httpd/conf.d/chaiyakul-ssl.conf

แบบที่ 2: รวมอยู่ใน httpd.conf

/etc/httpd/conf/httpd.conf

ถ้ามีการตั้ง SSL ในไฟล์นี้ (ไม่แนะนำ) ให้ใส่ <VirtualHost *:443> ภายในหรือ Include ไฟล์จาก conf.d/

✅ แนะนำ

สร้างไฟล์ใหม่ใน /etc/httpd/conf.d/ เพื่อแยก site ต่างๆ ชัดเจน เช่น:

sudo nano /etc/httpd/conf.d/chaiyakul-ssl.conf

แล้ววาง VirtualHost แบบนี้:

<VirtualHost *:443>
    ServerName chaiyakul.com
    ServerAlias www.chaiyakul.com

    DocumentRoot /var/www/html/chaiyakul.com

    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/chaiyakul.com.crt
    SSLCertificateKeyFile /etc/pki/tls/private/chaiyakul.com.key

    <Directory /var/www/html/chaiyakul.com>
        Options -Indexes +FollowSymLinks
        AllowOverride All
    </Directory>

    ErrorLog logs/ssl_error_log
    CustomLog logs/ssl_access_log combined
</VirtualHost>

เสร็จแล้วให้:

sudo apachectl configtest
sudo systemctl restart httpd