Pemファイルとは何ですか?また、他のOpenSSL生成鍵ファイルフォーマットとどう違うのですか?

私は2台のDebianサーバーの保守を担当しています。セキュリティ証明書について何かしなければならないことがあるたびに、チュートリアルをググって、最終的にうまくいくまで殴り続けます。

しかし、検索しているとしばしば異なるファイル形式(.key, .csr, .pem)に出くわしますが、それぞれのファイル形式がどのような目的を持っているのか、きちんとした説明を見つけることができません。

ServerFaultの皆さんは、この件について何か明確な説明をしてくれるでしょうか?

質問へのコメント (1)
ソリューション

SSLは長い間使われているので、コンテナ・フォーマットも合意されているはずです。そして、あなたは正しい。その通りです。だから、これは私が知っていることで、他の人からも意見があると思います。

  • .csr - これは証明書署名要求(Certificate Signing Request)です。いくつかのアプリケーションは、証明書発行機関に提出するためにこれを生成することができます。実際のフォーマットはRFC 2986で定義されているPKCS10です。PKCS10には、サブジェクト、組織、州など、要求された証明書の重要な詳細の一部またはすべてと、署名される証明書の公開鍵が含まれます。これらがCAによって署名され、証明書が返される。返される証明書は、公開証明書(公開鍵は含まれるが、秘密鍵は含まれない)であり、それ自体はいくつかの形式がある。
  • .pem-RFC1421から1424で定義されており、公開証明書だけを含むコンテナ形式(ApacheのインストールやCAの証明書ファイル/etc/ssl/certsなど)、または公開鍵、秘密鍵、ルート証明書を含む証明書チェーン全体を含むことができます。紛らわしいことに、PKCS10フォーマットはPEMに変換することができるので、CSRをエンコードすることもできる(例えばここで使われているように)。この名前はPrivacy Enhanced Mail (PEM)に由来する。PEMはセキュアな電子メールのための失敗したメソッドであるが、使用されたコンテナフォーマットは存続しており、x509 ASN.1キーのbase64翻訳である。
  • .key - これは特定の証明書の秘密鍵だけを含むPEM形式のファイルであり、単に従来の名前であり、標準化されたものではない。Apache のインストールでは、これは頻繁に /etc/ssl/private に置かれます。これらのファイルの権限は非常に重要で、設定が間違っていると、これらの証明書のロードを拒否するプログラムもあります。
  • .pkcs12 .pfx .p12** - 元々はRSAによってPublic-Key Cryptography Standards(略称PKCS)で定義されたもので、 "12"バリアントは元々Microsoftによって拡張され、後にRFC 7292として提出された。これは、公開証明書と秘密証明書のペアを含むパスワード付きコンテナ形式です。pem ファイルとは異なり、このコンテナは完全に暗号化されている。Openssl は、これを公開鍵と秘密鍵の両方を含む .pem ファイルに変換することができる:openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes` とする。

この他にも、時々現れるフォーマットがいくつかある:

  • .der** - ASN.1構文をバイナリでエンコードする方法で、.pemファイルはBase64でエンコードされた.derファイルに過ぎません。OpenSSLはこれらを.pemに変換することができる(openssl x509 -inform der -in to-convert.der -out converted.pem)。Windowsはこれらを証明書ファイルと見なす。デフォルトでは、Windowsは別の拡張子を持つ.DER形式のファイルとして証明書をエクスポートします。例えば
  • .cert .cer .crt** - 拡張子が異なる.pem(まれに.der)形式のファイルで、Windowsエクスプローラによって証明書として認識されます。
  • .p7b .keystore* - PKCS番号7としてRFC 2315で定義されている、Windowsが証明書の交換に使用するフォーマット。Javaはこれをネイティブに理解しますが、多くの場合、代わりに .keystore を拡張子として使用します。pem形式の証明書とは異なり、この形式には認証パス証明書を含めるための定義された*方法があります。
  • .crl** - 証明書失効リスト。認証局は、有効期限が切れる前に証明書の認証を解除する方法として、これを作成する。認証局のウェブサイトからダウンロードできることもある。

まとめると、証明書とそのコンポーネントを提示する方法は4つある:

  • PEM**-RFCによって管理され、オープンソースのソフトウェアで優先的に使用される。さまざまな拡張子(.pem、.key、.cer、.cert など)を持つことができる。
  • PKCS7**-Javaで使用され、Windowsでサポートされているオープンスタンダード。秘密鍵は含まれない。
  • PKCS12**-後にRFCで定義されたマイクロソフトのプライベート標準であり、プレーンテキストのPEM形式に対して強化されたセキュリティを提供する。これには秘密鍵を含めることができる。Windowsシステムで優先的に使われ、opensslを使うことでPEM形式に自由に変換できる。
  • DER** - PEMの親フォーマット。Base64エンコードされたPEMファイルのバイナリ版と考えると便利。Windows以外ではあまり使われない。

参考になれば幸いである。

解説 (20)

PEMは証明書ではなく、単なるデータのエンコード方法です。 X.509証明書は、一般的にPEMを使ってエンコードされるデータの一種です。

PEMはX.509証明書(その構造はASN.1を使って定義されている)をASN.1のDER(識別符号化規則)を使って符号化し、Base64符号化を通してプレーンテキストのアンカー行(BEGIN CERTIFICATEとEND CERTIFICATE)の間に貼り付けたものである。

PKCS#7 または PKCS#12 表現を使用して同じデータを表現することができ、openssl コマンドラインユーティリティを使用してこれを行うことができます。

PEMの明らかな利点は、アンカー行があり、7ビットでクリーンであるため、電子メール・メッセージの本文に貼り付けても安全であることです。

RFC1422に、鍵と証明書に関連するPEM標準についての詳細がある。

解説 (2)

.crtファイルがすでに.pem`になっていることもある。参照: https://stackoverflow.com/questions/991758/openssl-pem-key

解説 (2)