サーバや機器によって、欲しい証明書ファイルの形式はバラバラです。 「Windows(IIS)は pfx、nginx は pem、Java は DER」と、同じ証明書を形式だけ変えたい場面がよくあります。
この記事は、形式変換の openssl ワンライナーを「変換元 → 変換先」で逆引きできるようにまとめたものです。 形式そのものの違いがあやしい人は、先に 証明書ファイルの形式まとめ を読んでおくと迷いません。
動作確認は OpenSSL 3.x(手元 3.6.2)。秘密鍵の出力は 3.x 既定で PKCS#8(
-----BEGIN PRIVATE KEY-----) になります。
証明書の変換(PEM ⇄ DER)
PEM → DER
openssl x509 -in cert.pem -outform der -out cert.der
DER → PEM
openssl x509 -inform der -in cert.der -outform pem -out cert.pem
.crt.cerも中身は証明書なので、上のコマンドの拡張子を読み替えればそのまま使えます。中身が PEM か DER か分からないときは 見分け方 を参照。
秘密鍵の変換
PEM → DER / DER → PEM(鍵)
# PEM → DER openssl pkey -in key.pem -outform der -out key.der # DER → PEM openssl pkey -inform der -in key.der -outform pem -out key.pem
openssl pkey は RSA でも EC でも使えます。RSA 限定なら openssl rsa でも同じことができます。
PKCS#1 ⇄ PKCS#8(鍵の“形式違い”)
-----BEGIN RSA PRIVATE KEY-----(PKCS#1)と -----BEGIN PRIVATE KEY-----(PKCS#8)を変換します。 古いソフトが PKCS#1 しか受け付けない、などのときに使います。
# PKCS#1(traditional) → PKCS#8 openssl pkey -in rsa-pkcs1.pem -out pkcs8.pem # PKCS#8 → PKCS#1(RSA traditional) openssl rsa -in pkcs8.pem -traditional -out rsa-pkcs1.pem
秘密鍵のパスフレーズを付ける/外す
# パスフレーズを外す(暗号化解除) openssl pkey -in enc-key.pem -out plain-key.pem # パスフレーズを付ける(AES-256で暗号化) openssl pkey -in plain-key.pem -aes256 -out enc-key.pem
パスフレーズなし鍵はサーバ再起動が楽な反面、鍵ファイルが漏れたらそのまま悪用されます。取り扱いに注意。
PFX / p12(証明書+鍵の束)の変換
Windows(IIS)やクライアント証明書でよく使う PKCS#12(.pfx / .p12) との相互変換です。
PEM → PFX(証明書+秘密鍵+中間証明書をまとめる)
openssl pkcs12 -export \ -inkey key.pem \ -in cert.pem \ -certfile chain.pem \ -out bundle.pfx
-inkey秘密鍵 /-inサーバ証明書 /-certfile中間証明書(チェーン)。- 実行するとエクスポート用パスワードを聞かれます(空も可だが付けるのが安全)。
PFX → PEM(全部まとめて取り出す)
openssl pkcs12 -in bundle.pfx -out all.pem -nodes
-nodes は秘密鍵を暗号化せず(パスフレーズなしで)出す指定です。all.pem に鍵も証明書も入ります。
PFX → 証明書だけ / 秘密鍵だけ に分ける
# 証明書だけ取り出す openssl pkcs12 -in bundle.pfx -clcerts -nokeys -out cert.pem # 秘密鍵だけ取り出す(パスフレーズなし) openssl pkcs12 -in bundle.pfx -nocerts -nodes -out key.pem # 中間証明書(CA)だけ取り出す openssl pkcs12 -in bundle.pfx -cacerts -nokeys -out chain.pem
pfx から取り出した PEM の先頭には
Bag Attributes ...という付帯情報の行が入ることがあります(localKeyIDなど)。証明書・鍵としては問題なく使えますが、気になる場合は-----BEGIN-----から-----END-----までだけを残せばOKです。古い OpenSSL で作った pfx を新しい環境で開けない/その逆のときは、
-legacyオプションが要ることがあります(OpenSSL 3.x は古い暗号方式を既定で外したため)。openssl pkcs12 -legacy -in old.pfx ...のように付けて試してください。
証明書を「連結」する(pem の合体)
サーバ証明書+中間証明書をまとめる(フルチェーン)
中間証明書の設置漏れ対策。サーバ証明書 → 中間 → ルートの順で連結します。
cat server.crt intermediate.crt > fullchain.pem
秘密鍵+証明書を1つの pem にする
サーバによっては鍵と証明書を1ファイルにまとめます(「pemの作り方」と同じ要領)。
cat server.key server.crt intermediate.crt > server.pem
連結の考え方は pemファイルの作り方 と PKI入門:なぜ中間証明書を連結するのか もあわせてどうぞ。
逆引き早見表
| やりたいこと | コマンドの核 |
|---|---|
| 証明書 PEM→DER | openssl x509 -outform der |
| 証明書 DER→PEM | openssl x509 -inform der -outform pem |
| 鍵 PEM→DER | openssl pkey -outform der |
| 鍵 PKCS#8→PKCS#1 | openssl rsa -traditional |
| 鍵のパスフレーズ除去 | openssl pkey(暗号化指定なし) |
| PEM→PFX | openssl pkcs12 -export |
| PFX→PEM | openssl pkcs12 -nodes |
| PFX から鍵だけ | openssl pkcs12 -nocerts -nodes |
| 証明書の連結 | cat a.crt b.crt > chain.pem |
さいごに
- 変換は
x509(証明書)/pkey(鍵)/pkcs12(束) の3本柱でだいたい片付きます。 - 形式の違いがあやしくなったら 証明書ファイルの形式まとめ、中身の確認は opensslコマンド総まとめ へ。
- OpenSSL 3.x で古い pfx が開けないときは
-legacyを思い出してください。