SSL 證書和私鑰可以儲存為多種檔案格式。內容是相同的——區別在於編碼和封裝方式。大多數困惑來自於需要為特定伺服器提供特定格式。
格式對比
| 格式 | 副檔名 | 編碼 | 包含內容 | 使用者 |
|---|---|---|---|---|
| PEM | .pem, .crt, .cer, .key | Base64(文字) | 證書、金鑰或證書鏈(每檔案一個) | Nginx、Apache、大多數 Linux 伺服器 |
| DER | .der, .cer | 二進位制 | 單個證書或金鑰 | Java、某些 Windows 應用 |
| PFX/PKCS#12 | .pfx, .p12 | 二進位制 | 證書 + 金鑰 + 證書鏈合為一個檔案 | Windows IIS、Azure、macOS Keychain |
PEM —— 最常見的格式
PEM(Privacy Enhanced Mail)是 Base64 編碼的文字。可以用文字編輯器開啟:
-----BEGIN CERTIFICATE-----
MIIFYjCCBEqgAwIBAgISA8ht...
(base64 encoded data)
-----END CERTIFICATE-----
PEM 檔案可以包含證書、私鑰或證書鏈。檔案頭告訴你裡面是什麼:
BEGIN CERTIFICATE—— 一張證書BEGIN PRIVATE KEY—— 一個私鑰(或BEGIN RSA PRIVATE KEY/BEGIN EC PRIVATE KEY)BEGIN CERTIFICATE REQUEST—— 一個 CSR
GetHTTPS 輸出 PEM 格式 —— privkey.pem、cert.pem、chain.pem、fullchain.pem。
DER —— 二進位制編碼
DER 是 PEM 以文字編碼的相同資料的二進位制形式。不是人類可讀的。主要用於 Java 應用(keytool)和某些 Windows 元件。
PFX/PKCS#12 —— 打包格式
PFX(Personal Information Exchange)將證書、私鑰和證書鏈打包成一個受密碼保護的檔案。Windows IIS、Azure App Service 和 macOS Keychain 需要此格式。
格式之間的轉換
所有轉換使用 OpenSSL:
PEM → PFX
openssl pkcs12 -export \
-out certificate.pfx \
-inkey privkey.pem \
-in cert.pem \
-certfile chain.pem
系統會提示你設定匯出密碼。
PFX → PEM
# Extract certificate
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out cert.pem
# Extract private key
openssl pkcs12 -in certificate.pfx -nocerts -nodes -out privkey.pem
# Extract chain
openssl pkcs12 -in certificate.pfx -cacerts -nokeys -out chain.pem
PEM → DER
openssl x509 -in cert.pem -outform DER -out cert.der
DER → PEM
openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem
我需要哪種格式?
| 伺服器/平臺 | 格式 | 所需檔案 |
|---|---|---|
| Nginx | PEM | fullchain.pem + privkey.pem |
| Apache | PEM | cert.pem + chain.pem + privkey.pem |
| IIS (Windows) | PFX | certificate.pfx(從 PEM 轉換) |
| Azure App Service | PFX | certificate.pfx |
| AWS (ACM) | PEM | cert.pem + chain.pem + privkey.pem(貼上到控制檯) |
| Java (Tomcat) | JKS 或 PFX | PEM → PFX → JKS 使用 keytool 轉換 |
| Node.js | PEM | 在程式碼中直接讀取檔案 |
如何識別檔案的格式
不確定檔案是什麼格式?檢查:
# If it starts with "-----BEGIN" — it's PEM (base64 text)
head -1 mystery-file.pem
# If it's binary (garbled text) — it's DER or PFX
file mystery-file.cer
# Output like "data" or "certificate" = DER
# Output like "PKCS12" = PFX
# Inspect a PEM certificate
openssl x509 -in cert.pem -noout -text
# Inspect a DER certificate
openssl x509 -in cert.der -inform DER -noout -text
# Inspect a PFX file
openssl pkcs12 -in cert.pfx -info -nokeys
常見的副檔名混淆
| 副檔名 | 通常表示 | 也可能是 |
|---|---|---|
.pem | PEM(Base64) | 始終是 PEM |
.crt | PEM 證書 | Windows 上可能是 DER |
.cer | PEM 證書 | Windows 上可能是 DER |
.key | PEM 私鑰 | DER(罕見) |
.pfx | PKCS#12 包 | 始終是 PFX |
.p12 | PKCS#12 包 | 始終是 PFX(與 .pfx 相同) |
.der | DER(二進位制) | 始終是 DER |
.jks | Java KeyStore | 始終是 JKS |
經驗法則: 用文字編輯器開啟檔案。如果看到 -----BEGIN CERTIFICATE-----,無論副檔名是什麼,它都是 PEM 格式。如果看到二進位制亂碼,它就是 DER 或 PFX。
常見問題
.crt、.cer 和 .pem 有什麼區別?
它們都可以是 PEM 格式。副檔名是命名約定,不是格式標識。.crt 和 .cer 通常用於證書檔案,.pem 用於任何 PEM 編碼的檔案。在 Windows 上,.cer 檔案有時是 DER 編碼的——用文字編輯器開啟檢查即可。
為什麼 GetHTTPS 給我 4 個檔案?
為了最大相容性。GetHTTPS 提供:privkey.pem(私鑰)、cert.pem(僅你的證書)、chain.pem(中間 CA 證書)、fullchain.pem(證書 + 證書鏈合併)。Nginx 需要 fullchain.pem;Apache 需要單獨的 cert.pem + chain.pem;IIS 需要 PFX(從 PEM 轉換)。
如何為 Windows/IIS 建立 PFX?
使用上面的 OpenSSL PEM → PFX 命令。你需要從 GetHTTPS 獲取的 privkey.pem、cert.pem 和 chain.pem。生成的 .pfx 可以匯入到 IIS、Azure App Service 或 macOS Keychain。
沒有私鑰能轉換格式嗎?
你可以在沒有私鑰的情況下將證書在 PEM 和 DER 之間轉換。但建立 PFX 需要私鑰(它將證書和金鑰打包在一起)。如果丟失了私鑰,你需要生成新的證書。
Let’s Encrypt 使用什麼格式?
Let’s Encrypt(透過包括 GetHTTPS 在內的任何 ACME 用戶端)輸出 PEM 格式。如果你的伺服器需要其他格式,使用上面的 OpenSSL 命令進行轉換。