แปลงไฟล์ SSL ระหว่าง PEM CRT PFX ด้วย OpenSSL

เมื่อได้รับ 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 ที่พบบ่อย

ก่อนแปลงไฟล์ ควรเข้าใจความแตกต่างของแต่ละรูปแบบ:

เคล็ดลับ: ก่อนแปลงไฟล์ ตรวจสอบรูปแบบปัจจุบันด้วย 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 นั้นได้ ดังนั้นจึงต้องปฏิบัติตามแนวทางด้านล่างอย่างเคร่งครัด

เคล็ดลับความปลอดภัย: ตั้งค่า 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