pemとp.12は何が違うのか?

(久しぶりの更新になってしまった・・・) 業務をしていてふと、疑問に思ったのでサクッと調べてみた。

証明書の拡張子の種類

以下のサイトの表がわかりやすい。

https://www.nextdoorwith.info/wp/se/infra/ssl-tls-pki/digital-certificate-encoding-extensions-difference/

どうやら、「エンコードの種類」もしくは「証明書 or 鍵なのか」で拡張子を分けるぽい

エンコードで分ける

  • 拡張子の種類としては 「.der」と「.pem」が存在する
  • どちらも「ASN.1」というデータ構造で定義している

「ASN.1」は深くは調べないが、データ構造の表現方法の一種なのだなと理解。

https://e-words.jp/w/ASN.1.html

.derについて

  • DER(Distinguished Encoding Rules)形式
  • 「ASN.1」で表現されたデータを「バイナリデータ化」したもの
  • バイナリデータなので、そのままでは読めない(エディタとかでドラッグしても表示されないっぽい)
  • 1つのファイルに「1つの証明書」しか含められない

.pemについて

  • PEM(Privacy Enhanced Mail)形式
  • 「ASN.1」で表現されたデータを「バイナリデータ化」して、さらに、「Base64」で変換したテキストファイル
[memo]
Base64 = バイナリデータをテキスト(ascii)データに変換する
  • .der形式 から pemファイルが生まれるというわけ🧚‍♀️
  • 「----BEGIN 」で始まる

  • メール送信プロトコルであるSMTPでは、バイナリデータを送ることができないので、メールで証明書を送る手段として生まれたのが「PEM」らしい

  • OpenSSLのデフォルトフォーマットLinuxでよく使われる(今いるチームのシステムでもpemファイル使ってるな〜

  • 拡張子が「.cer」になることもあるらしいが、Linuxでは「.pem」が使われるとのこと

  • .pemファイルはエディタとかで開ける、メモ帳でも開ける、そのまま読める

  • 1つのファイルに「複数の証明書」を含められる → 複数含める場合としては「中間証明書」をくっつける場合 とかがあるらしい

証明書か鍵かで分ける

  • 拡張子の種類としては、「.crt もしくは .cer」、「.key」、「.pfx もしくは .p12」

.crt もしくは .cer

  • 中身が証明書(公開鍵もしくは誰かの公開鍵の証明書)の時に使用される拡張子
  • Windowsでは「.cer」を、LinuxやApahceでは「.crt」を使うことが多い
  • バイナリデータ(DER形式)もしくはテキストデータ(PEM形式)のどちらかの形式になっている

.key

  • 中身が秘密鍵の時に使用される拡張子
  • バイナリデータ(DER形式)もしくはテキストデータ(PEM形式)のどちらかの形式になっている

.pfx もしくは .p12

  • PKCS#12形式(Personal Information Exchange)」と呼ばれる(古い名前として「PFX」とも呼ばれる)
  • 証明書と証明書に紐づく秘密鍵が1つのファイルにまとめられている形式
  • つまり、公開鍵と秘密鍵が一緒に入ってるファイル ☝️
  • このファイルにはパスワードがかけられているので、中身を確認するにはパスワードの入力が必須!
  • バイナリ形式なので、そのまま読めない
  • Windows OSで証明書を使うときは、このフォーマットのことが多いらしい




・・・・・・・ということで、ざっくり調査してみました。

当初のpemとp12の違いは何か理解。

わざわざシステムで使うときにp.12の形式の証明書をpemにしてたのは、中身を確認するためだったのとシステムのOSがLinuxだからなのかな〜という理解 👀

他に参考にしたサイトたち

https://milestone-of-se.nesuke.com/sv-basic/windows-basic/certificate-export-format/

http://tooljp.com/windows/chigai/html/Cipher/PEM-CRT-CER-CERT-KEY-DER-CSR.html