PEM ⇄ DER / CRT / KEY / PFX(p12) 変換 opensslワンライナー集

サーバや機器によって、欲しい証明書ファイルの形式はバラバラです。 「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→DERopenssl x509 -outform der
証明書 DER→PEMopenssl x509 -inform der -outform pem
鍵 PEM→DERopenssl pkey -outform der
鍵 PKCS#8→PKCS#1openssl rsa -traditional
鍵のパスフレーズ除去openssl pkey(暗号化指定なし)
PEM→PFXopenssl pkcs12 -export
PFX→PEMopenssl pkcs12 -nodes
PFX から鍵だけopenssl pkcs12 -nocerts -nodes
証明書の連結cat a.crt b.crt > chain.pem

さいごに