PEM を DER に変換する方法
- 入力欄に PEM ブロックを貼り付けるか、
.pem、.crt、.key、.csrファイルをドロップします。 - 変換先 で出力を選びます。
- DER:1 行の Base64:ヘッダー行と改行を除いた PEM の本体で、JSON のフィールドや環境変数にそのまま使えます。
- DER:16進数:同じバイト列を16進数で表したもので、バイト配列やプロトコルのトレースに使います。
- PEM(64 桁) と 公開鍵(PEM) は、逆方向の変換と公開鍵の取り出し用です。
- バイナリのファイルを保存するには .der をダウンロード を、テキスト形式なら 出力をコピー をクリックします。
変換ツールは証明書、CSR、CRL、公開鍵、秘密鍵(PKCS#1、PKCS#8、SEC1 EC)を自動で判別するので、入力の種類を選ぶ必要はありません。
変換で行われること
PEM は DER をテキストで包んだものです。次の証明書(省略しています)を例にします。
-----BEGIN CERTIFICATE-----
MIIBtzCCAV2gAwIBAgIUfX6gOa1S96OttEsj3WbuIdu0cE0wCgYIKoZIzj0EAwIw
...
-----END CERTIFICATE-----
2 行のマーカー行を取り除き、残りの行をつなげて Base64 デコードすれば、DER ファイルになります。この例では、ASN.1 の SEQUENCE ヘッダーである 30 82 01 b7 で始まる 443 バイトです。失われる情報は、マーカー行にあるラベルだけです。DER ファイルにはラベルがないので、DER を読むツールは、ファイルが何であるかを指定してもらうか、構造から推測する必要があります。
| 形式 | この証明書のサイズ | 使われる場所 |
|---|---|---|
| PEM | 656 バイト | nginx、Apache、HAProxy、ほとんどの Linux ツール |
| 1 行の Base64 DER | 592 文字 | JSON API、JWK の x5c 配列、環境変数 |
| DER(バイナリ) | 443 バイト | Java や Windows のツール、ファームウェア、application/pkix-cert のダウンロード |
DER が必要な場面
- 組み込み機器とファームウェア:バイト配列として C にコンパイルされる証明書は、ほぼ必ず DER です。16進数の出力を使って配列に貼り付けてください。
- Apple のプラットフォーム:
SecCertificateCreateWithDataは PEM のテキストではなく DER のデータを受け取ります。 - JWK の
x5cパラメーター や SAML メタデータの<ds:X509Certificate>要素には、PEM のヘッダーなしの Base64 DER が入ります。 - 証明書の CA Issuers の URL は、通常 DER の
.cerファイルを配信します。 - Windows:
.cerファイルはどちらの形式もありえますが、古いインポートダイアログやアプライアンスの中には DER しか受け付けないものがあります。
OpenSSL、Python、certutil で PEM を DER に変換する
openssl x509 -in cert.pem -outform der -out cert.der
openssl req -in app.csr -outform der -out app.der
openssl pkey -in key.pem -outform der -out key.der
grep -v -- '-----' cert.pem | tr -d '\n'
最後の行は、証明書が 1 つだけのファイルの 1 行の Base64 DER を出力します。Python では、ssl.PEM_cert_to_DER_cert(open("cert.pem").read()) が証明書の DER のバイト列を返します。Windows では、certutil -decode cert.pem cert.der がマーカーを取り除いてデコードします。詳しくは OpenSSL での Base64 と Python の Base64 をご覧ください。
よくある問題
- 1 つのファイルに複数のブロックがある:テキストの出力ではすべてのブロックが変換されますが、DER ファイルはちょうど 1 つのオブジェクトしか持てないため、.der をダウンロード で保存されるのは最初のオブジェクトだけです。先にチェーンを分割するか、証明書デコーダー で証明書ごとのカードからダウンロードしてください。
-----BEGIN ENCRYPTED PRIVATE KEY-----:変換はできますが、DER も暗号化されたままです。復号にはパスワードが必要で、ここでは行いません。Proc-Type: 4,ENCRYPTEDヘッダー:OpenSSL の従来の暗号化には DER の形式がありません。先にパスワードを使ってopenssl pkey -in key.pem -out plain.pemを実行してください。-----BEGIN OPENSSH PRIVATE KEY-----:そもそも ASN.1 ではないので、生成できる DER はありません。公開鍵については SSH 鍵ツール を使ってください。
よくある質問
PEM は DER を Base64 にしただけのものですか?
そうです。PEM ファイルは、DER のバイト列を Base64 でエンコードして 64 文字で折り返し、-----BEGIN label----- と -----END label----- の行で挟んだものです。その行を取り除いて Base64 をデコードすれば、DER ファイルがそのまま得られます。
PEM の秘密鍵を DER に変換するには?
ここに貼り付けて DER:1 行の Base64 か .der をダウンロード を選ぶか、openssl pkey -in key.pem -outform der -out key.der を実行します。鍵がページの外に出ることはなく、秘密の値も表示されません。
DER ファイルが PEM より小さいのはなぜですか?
Base64 は 3 バイトごとに 4 文字にし、PEM はさらに改行と 2 行のヘッダーを加えるからです。443 バイトの DER 証明書は 656 バイトの PEM ファイルになり、約 48% 大きくなります。