
เมื่อได้รับ SSL Certificate จาก CA แล้ว บางครั้งรูปแบบไฟล์ที่ได้รับอาจไม่ตรงกับที่เซิร์ฟเวอร์หรือแอปพลิเคชันต้องการ เช่น Apache ต้องการ PEM แต่ได้รับ PFX มา หรือ Java Application Server ต้องการ JKS บทความนี้รวบรวมคำสั่ง OpenSSL สำหรับแปลงไฟล์ SSL ทุก format ที่ใช้งานจริง
OpenSSL คืออะไร และทำไมต้องใช้ในการแปลงไฟล์ SSL
OpenSSL คือชุดเครื่องมือ Cryptography แบบ Open Source ที่ใช้งานอย่างกว้างขวางในวงการ Linux และ System Administration มานานกว่า 25 ปี เกือบทุก Linux Distribution มี OpenSSL ติดตั้งมาพร้อมกัน ทำให้เป็นตัวเลือกอันดับหนึ่งสำหรับการแปลงไฟล์ SSL ในสภาพแวดล้อม Production จริง ไม่ว่าจะเป็นเซิร์ฟเวอร์ Ubuntu, Debian, CentOS, AlmaLinux หรือ Rocky Linux ทุก Distribution ใช้คำสั่งเดียวกัน
ข้อดีของการใช้ OpenSSL แทนเครื่องมืออื่น ได้แก่ ไม่ต้องส่งไฟล์ Private Key ออกไปยังบริการภายนอก ซึ่งลดความเสี่ยงด้านความปลอดภัยอย่างมีนัยสำคัญ ทำงานได้ทั้งบน Linux, macOS และ Windows (ผ่าน WSL หรือ Git Bash) และรองรับรูปแบบไฟล์ SSL แทบทุกชนิดที่ใช้กันในปัจจุบัน นอกจากนี้ OpenSSL ยังเป็นมาตรฐานที่ DevOps และ System Admin ทั่วโลกใช้ ทำให้หาตัวอย่างและเอกสารประกอบได้ง่าย
ก่อนเริ่มแปลงไฟล์ ตรวจสอบว่า OpenSSL ติดตั้งอยู่แล้วด้วยคำสั่ง:
openssl version
ถ้ายังไม่มีให้ติดตั้งผ่าน Package Manager:
# Ubuntu/Debian
sudo apt install openssl
# CentOS/AlmaLinux/Rocky Linux
sudo dnf install openssl
รูปแบบไฟล์ SSL ที่พบบ่อย
ก่อนแปลงไฟล์ ควรเข้าใจความแตกต่างของแต่ละรูปแบบ:
- PEM (.pem, .crt, .cer, .key) — รูปแบบ Base64 ที่ใช้กันมากที่สุด ใช้กับ Apache, Nginx, HAProxy ข้อความจะเริ่มด้วย
-----BEGIN CERTIFICATE----- - DER (.der, .cer) — รูปแบบ Binary ที่ Java และ Windows มักใช้
- PFX/PKCS#12 (.pfx, .p12) — Bundle ที่รวม Certificate + Private Key + Chain ในไฟล์เดียว ใช้กับ IIS, Windows Server
- JKS (.jks) — Java KeyStore ใช้กับ Tomcat, Java Application Server
- P7B/PKCS#7 (.p7b, .p7c) — รวม Certificate หลายใบ ไม่มี Private Key ใช้กับ IIS
เคล็ดลับ: ก่อนแปลงไฟล์ ตรวจสอบรูปแบบปัจจุบันด้วย openssl x509 -in cert.crt -text -noout ถ้าแสดง text ได้ แสดงว่าเป็น PEM ถ้าไม่ได้ให้ลองคำสั่ง DER
ตารางสรุป: รูปแบบไฟล์ SSL และ Web Server ที่รองรับ
ด้านล่างนี้คือตารางอ้างอิงฉบับเร็วที่แสดงว่า Web Server หรือแพลตฟอร์มใดรองรับรูปแบบไฟล์ SSL แบบไหน ใช้ประกอบการตัดสินใจว่าต้องแปลงไฟล์ไปเป็นรูปแบบใด
| Web Server / แพลตฟอร์ม | รูปแบบที่รองรับ | ไฟล์ที่ต้องการ |
|---|---|---|
| Apache (Linux) | PEM | .crt + .key + ca-bundle.crt |
| Nginx | PEM | .crt (fullchain) + .key |
| IIS (Windows Server) | PFX | .pfx พร้อมรหัสผ่าน |
| Tomcat (Java) | JKS หรือ PKCS#12 | .jks หรือ .p12 |
| HAProxy | PEM | .pem รวม key+cert+chain |
| DirectAdmin | PEM | วาง CRT และ KEY ใน UI โดยตรง |
| cPanel | PEM | วาง Certificate text ใน UI |
| Load Balancer (AWS ELB) | PEM | .pem สำหรับแต่ละส่วน |
PEM เป็น PFX (สำหรับ IIS / Windows)
รวม Certificate, Private Key และ CA Chain ให้เป็นไฟล์ PFX เดียว:
openssl pkcs12 -export \
-out certificate.pfx \
-inkey privatekey.key \
-in certificate.crt \
-certfile ca-bundle.crt
คำสั่งนี้จะถามรหัสผ่านสำหรับป้องกันไฟล์ PFX ควรตั้งรหัสผ่านที่แข็งแกร่งเสมอ ความยาวอย่างน้อย 12 ตัวอักษร ผสมตัวพิมพ์ใหญ่-เล็ก ตัวเลข และสัญลักษณ์พิเศษ เพราะ Private Key ที่อยู่ใน PFX มีความสำคัญสูงมากและต้องได้รับการป้องกันอย่างเข้มงวด
PFX เป็น PEM (สำหรับ Apache / Nginx)
แยก Certificate ออกจาก PFX
openssl pkcs12 -in certificate.pfx -nokeys -out certificate.crt
แยก Private Key ออกจาก PFX
openssl pkcs12 -in certificate.pfx -nocerts -nodes -out privatekey.key
แยก CA Chain ออกจาก PFX
openssl pkcs12 -in certificate.pfx -cacerts -nokeys -out ca-bundle.crt
PEM เป็น DER (สำหรับ Java)
openssl x509 -outform der -in certificate.pem -out certificate.der
DER เป็น PEM
openssl x509 -inform der -in certificate.der -out certificate.pem
PEM เป็น P7B (สำหรับ IIS)
openssl crl2pkcs7 -nocrl \
-certfile certificate.crt \
-certfile ca-bundle.crt \
-out certificate.p7b
P7B เป็น PEM
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.crt
สร้าง PEM Bundle (Fullchain) สำหรับ Nginx และ HAProxy
Nginx และ HAProxy ต้องการไฟล์ PEM ที่รวม Certificate + Intermediate CA + Root CA ไว้ในไฟล์เดียว เรียกว่า Fullchain Certificate ซึ่งต้องสร้างเองจากไฟล์ที่ CA ส่งมา
สร้าง Fullchain สำหรับ Nginx
# รวม Certificate และ CA Bundle เป็น fullchain.pem
cat certificate.crt ca-bundle.crt > fullchain.pem
ใน Nginx config อ้างอิง Fullchain แทน Certificate เดี่ยว:
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privatekey.key;
สร้าง PEM Bundle สำหรับ HAProxy
HAProxy ต้องการไฟล์เดียวที่รวมทุกอย่างรวมถึง Private Key:
# รวม Private Key + Certificate + CA Chain เป็น bundle เดียว
cat privatekey.key certificate.crt ca-bundle.crt > haproxy-bundle.pem
จากนั้นอ้างอิงในไฟล์ Config ของ HAProxy:
bind *:443 ssl crt /etc/ssl/haproxy-bundle.pem
สำคัญ: ลำดับในไฟล์ Bundle ต้องถูกต้องเสมอ — Private Key ก่อน ตามด้วย Certificate ของตัวเอง แล้วถึง Intermediate CA และ Root CA ลำดับผิดจะทำให้ Handshake ล้มเหลว
PEM เป็น JKS (สำหรับ Tomcat / Java)
Java Application Server เช่น Tomcat ใช้ Keytool แทน OpenSSL สำหรับจัดการ Keystore ต้องแปลงผ่าน PFX ก่อน:
# ขั้นที่ 1: สร้าง PFX ก่อน
openssl pkcs12 -export -out certificate.pfx \
-inkey privatekey.key -in certificate.crt \
-certfile ca-bundle.crt
# ขั้นที่ 2: แปลง PFX เป็น JKS ด้วย keytool
keytool -importkeystore \
-srckeystore certificate.pfx \
-srcstoretype PKCS12 \
-destkeystore keystore.jks \
-deststoretype JKS
ข้อผิดพลาดที่พบบ่อยเมื่อแปลงไฟล์ SSL
การแปลงไฟล์ SSL ด้วย OpenSSL อาจพบข้อผิดพลาดที่น่าสับสนได้บ่อย ตารางด้านล่างนี้รวบรวม Error Message ที่พบบ่อยพร้อมวิธีแก้ไข
| Error Message | สาเหตุ | วิธีแก้ |
|---|---|---|
unable to load private key |
ไฟล์ Key ถูก Encrypt หรือ Format ผิด | ใช้ -nodes เพื่อ Decrypt หรือตรวจ Format ด้วย openssl rsa -in key.key -check |
mac verify failure |
รหัสผ่าน PFX ผิด | ตรวจสอบรหัสผ่านให้ถูกต้อง ระวัง Space และอักขระพิเศษ |
no certificate matches |
Private Key ไม่ตรงกับ Certificate | ตรวจ MD5 Modulus ของทั้งสองไฟล์ให้ตรงกัน |
error reading input file |
ชื่อไฟล์หรือ Path ผิด | ตรวจ Path ให้ถูกต้อง ใช้ Path แบบ Absolute หรือรันคำสั่งใน Directory ที่มีไฟล์ |
certificate is not self signed |
ใส่ CA Chain ผิดลำดับ | เรียง Certificate จาก Leaf → Intermediate → Root และตรวจสอบว่า Chain ครบ |
วิธีแก้ไข Private Key ที่ Encrypt ด้วย Passphrase
หาก Private Key ถูก Encrypt ด้วย Passphrase จะต้อง Decrypt ก่อนนำไปใช้กับ Web Server ส่วนใหญ่:
# ถอด Passphrase ออกจาก Private Key
openssl rsa -in privatekey-encrypted.key \
-out privatekey-decrypted.key
คำสั่งนี้จะถามรหัสผ่านปัจจุบัน หลังจากนั้นไฟล์ Output จะเป็น Plain Key ที่ใช้กับ Apache/Nginx ได้โดยตรงโดยไม่ต้องใส่รหัสผ่านตอน Restart
ตรวจสอบความถูกต้องของไฟล์
หลังแปลงไฟล์แล้ว ควรตรวจสอบว่า Private Key ตรงกับ Certificate:
# ตรวจ modulus ของ Certificate
openssl x509 -noout -modulus -in certificate.crt | openssl md5
# ตรวจ modulus ของ Private Key
openssl rsa -noout -modulus -in privatekey.key | openssl md5
# ถ้า MD5 hash ทั้งสองเหมือนกัน แสดงว่าคู่กัน
วิธีตรวจสอบวันหมดอายุและข้อมูลใน SSL Certificate
ก่อนติดตั้ง Certificate ลงบนเซิร์ฟเวอร์ ควรตรวจสอบข้อมูลสำคัญในไฟล์ให้ครบ ทั้งวันหมดอายุ Common Name (CN) และ Subject Alternative Names (SAN) เพื่อป้องกันความผิดพลาดที่ตรวจพบยากหลังติดตั้ง
ดูข้อมูลใน Certificate (PEM/CRT)
# ดูข้อมูลทั้งหมด รวมวันหมดอายุ CN และ SAN
openssl x509 -in certificate.crt -text -noout
# ดูเฉพาะวันหมดอายุ
openssl x509 -in certificate.crt -noout -dates
# ดูเฉพาะ Common Name และ SAN
openssl x509 -in certificate.crt -noout -subject -ext subjectAltName
ดูข้อมูลใน PFX
# ดูรายการ Certificate ทั้งหมดใน PFX
openssl pkcs12 -in certificate.pfx -info -nokeys
ตรวจ Certificate Chain ออนไลน์
หลังติดตั้งบนเซิร์ฟเวอร์แล้ว สามารถตรวจสอบ Chain ได้จากภายนอกด้วยคำสั่ง:
openssl s_client -connect yourdomain.com:443 -showcerts
ผลลัพธ์จะแสดง Certificate ทั้ง Chain ตั้งแต่ Leaf จนถึง Root ถ้า Chain ครบและถูกต้อง จะมีบรรทัด Verify return code: 0 (ok) ที่ท้าย
ความปลอดภัยในการจัดการไฟล์ Private Key และ Certificate
Private Key คือส่วนที่สำคัญที่สุดในระบบ SSL ถ้า Private Key รั่วไหล ผู้ไม่ประสงค์ดีสามารถ Decrypt Traffic ทั้งหมดที่เข้ารหัสด้วย Certificate นั้นได้ ดังนั้นจึงต้องปฏิบัติตามแนวทางด้านล่างอย่างเคร่งครัด
- Permission ที่ถูกต้อง: Private Key ควรมี Permission
600(เฉพาะ root อ่านได้) ใช้คำสั่งchmod 600 privatekey.key - ห้าม Commit ลง Git: ห้ามนำ Private Key ขึ้น Git Repository ไม่ว่า Public หรือ Private เพราะ Git History เก็บไฟล์ไว้แม้จะลบทีหลัง
- เก็บใน Secrets Manager: สำหรับระบบ Production ควรเก็บ Private Key ใน HashiCorp Vault, AWS Secrets Manager หรือ Azure Key Vault
- Backup อย่างปลอดภัย: ถ้า Backup Private Key ต้อง Encrypt ก่อนด้วย Passphrase และเก็บในที่แยกจากไฟล์ Certificate
- จำกัด User ที่เข้าถึง: เฉพาะ System User ที่ Web Server รันอยู่เท่านั้นควรอ่านไฟล์ Key ได้ ไม่ควรให้ User ทั่วไปเข้าถึง
- แจ้งหากถูก Compromise: ถ้าสงสัยว่า Private Key รั่ว ให้ Revoke Certificate ทันทีผ่าน CA แล้วขอ Re-issue ด้วย Key คู่ใหม่
เคล็ดลับความปลอดภัย: ตั้งค่า Cron Job ตรวจวันหมดอายุ SSL อัตโนมัติด้วยคำสั่ง openssl x509 -in /etc/ssl/certificate.crt -noout -checkend 2592000 (ตรวจว่ายังไม่หมดอายุใน 30 วัน) แล้วส่ง Telegram Alert เมื่อใกล้หมด การตั้ง Reminder ล่วงหน้า 30 วันให้เวลาเพียงพอสำหรับขอ Certificate ใหม่และติดตั้งโดยไม่มี Downtime แม้ในระบบที่ซับซ้อน ซึ่งสำคัญมากสำหรับ E-Commerce และแอปพลิเคชันที่ต้องรักษาความปลอดภัยของข้อมูลลูกค้าตลอดเวลา
ต้องการ SSL Certificate ที่ติดตั้งง่าย
AsiaGB ให้บริการ SSL Certificate จาก RapidSSL, GeoTrust พร้อมทีมซัพพอร์ตช่วยติดตั้งและแปลงไฟล์ให้ฟรี
ดู SSL Certificate