[6] [DFN[[[[CODE[.pem]]]]]] は、[[証明書]]や[[秘密鍵]]などの[[暗号化]]に関わる[[ファイル]]の交換・保存用のデータ形式です。

* 仕様書

[REFS[
- [42] [CITE@en-US[NSS Certificate Download Specification - Mozilla | MDN]] ([TIME[2014-05-07 16:41:21 +09:00]] 版) <https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Certificate_Download_Specification>
- [59] [CITE@en[RFC 7468 - Textual Encodings of PKIX, PKCS, and CMS Structures]] ([TIME[2015-04-20 12:22:43 +09:00]] 版) <https://tools.ietf.org/html/rfc7468>
]REFS]

[43] [[証明書ダウンロード]]仕様書 [SRC[>>42]] は[[証明書]]や[[証明書]]鎖に関する
[CODE[[[.pem]]]] ファイル形式を定義しています。

[7] それ以外の [CODE[[[.pem]]]] ファイル形式一般を規定した[[仕様書]]は長年存在していませんでしたが、
2015年に [DFN[[[RFC 7468]]]] として [[IETF]] で標準化されました。

;; [44] 歴史の項も参照。

* 構文

[11] [CODE[[[.pem]]]] 形式のファイルは、 [[ASCII]] 文字列で構成される[[テキストファイル]]です。

;; [12] [[非ASCII文字]]が含まれる場合にどう解釈されるかは定かではありません。

;; [74] [CODE[[[report-uri]]]] で指定された [[URL]] に送信される [[JSON]]
では、 [CODE[[[.pem]]]] 形式の[[文字列]]が使われます。

[13] [CODE[[[.pem]]]] 形式のファイルは、1つ以上の[[メッセージ]]で構成されます [SRC[>>59]]。

[FIG(railroad)[
= +
== ?
=== 前書き
== [[メッセージ]]
]FIG]

;; [14] 多くの場合は[[メッセージ]]は1つだけですが、 
[[certification path]] を表す[[一連の証明書][証明書鎖]]を表す場合、
[[ルート証明書として使われる証明書群][証明書データベース]]を表す場合、
[[秘密鍵]]と[[証明書]]を含めた場合、
その他用途次第で複数の[[メッセージ]]が含まれることがあります。
複数含まれる場合、用途により、順序が指定されることがあります。
例えば[[中間証明書]]は[[ルート証明書]]や[[末端実体証明書]]に近い順序に並べる必要があるかもしれません
([SEE[ [[証明書鎖]] ]])。

[62] [[メッセージ]]の前に他のデータがあっても構わず、構文解析器は無視しなければ[MUST[なりません]] [SRC[>>59]]。
[[仕様書]]ではその意味は規定されていませんが、
補足説明などを入れるために使われているようです。

[92] [[メッセージ]]は複数あり得るので、その前に挿入できるということは、
実質上[[メッセージ]]と[[メッセージ]]の間に挿入できるということです。
しかし最後の[[メッセージ]]の後には挿入できません。

-*-*-

[15] [[メッセージ]]は、 [[pre-EB]]、データ、 [[post-EB]] で構成されます。

[FIG(railroad)[
= [[pre-EB]]
= データ
= [[post-EB]]
]FIG]

;; [31] [[OpenSSL]] は [[EB]] を header line、footer line とそれぞれ呼んでいるようです。

;; [51] [[pre-EB]] の前や [[post-EB]] の後に何らかのデータがあっても、無視します [SRC[>>42]]。

[16] [[pre-EB]] は [CODE[-----BEGIN ]] の後にメッセージ種別が入り、
[CODE[-----]] が続きます [SRC[>>59]]。最後に[[改行]]が入ります。

[FIG(railroad)[
= [CODE[[[-----BEGIN ]]]]
= メッセージ種別
= [CODE[[[-----]]
= [[改行]]
]FIG]

[17] [[post-EB]] は [CODE[-----END ]] の後にメッセージ種別が入り、
[CODE[-----]] が続きます [SRC[>>59]]。最後に[[改行]]が入ります。

[FIG(railroad)[
= [CODE[[[-----END ]]]]
= メッセージ種別
= [CODE[[[-----]]
= [[改行]]
]FIG]

;; [27] [CODE[BEGIN]] と [CODE[END]] の後には [CODE(char)[[[U+0020]]]] が入ります。

[64] [[pre-EB]] と [[post-EB]] の[[メッセージ種別]]は同じでなければ[['''なりません''']]
[SRC[>>59]]。実装は違っていてもエラーとせず無視して構いません [SRC[>>59]]。

;; [65] 異なっていても扱える実装と、扱えない実装があります [SRC[>>59]]。

;; [18] 最後の[[メッセージ]]の後には[[改行]]がある[['''べき''']]です [SRC[>>59]]。

[20] データは、[[オクテット列]]を [[Base64]] で[[符号化]]したものです。
[[PEM]] 版 [[Base64]] [SRC[>>21]] は1行を丁度64文字とすることを求めています。
[[RFC 7468]] も64文字丁度の [[RFC 4648]] [[Base64]] としなければ[MUST[ならない]]と規定しています [SRC[>>59]]。
構文解析器は他の文字数でも扱えて構いません [SRC[>>59]]。

;; [19] 最後の行は、64文字以下で構いません [SRC[>>59]]。

;; [23] すべての [CODE[[[.pem]]]] ファイルがこれに従っているかは定かではありません。

;; [28] 元々の [[PEM]] の暗号化メールでは、データの部分は [[RFC 822]] 風の[[ヘッダー]]、
[[空行]]、[[本体]]で構成される[[メッセージ]]で、 [[Base64]] はそのうちの[[本体]]の部分だけでした。

[78] [[RFC 7468]] の [[ABNF]] 構文は[[詰め]]の省略を認めていますが、
その意味と処理方法は説明されていません。 [[RFC 7468]] の参照する [[RFC 4648]]
によると原則として[[詰め]]の省略は禁止されており、矛盾しています。

;; [[Base64]] も参照。

[63] 構文解析器は、[[空白]]その他 [[Base64]] 以外の[[文字]]を無視する[['''べきです''']]。
行末の空白は、無視する実装が多いようです。 [[Base64]] の行頭や行内の空白は、
扱えない実装が多いようです。余分な空白を生成しては[['''なりません''']]。 [SRC[>>59]]

[24] [[改行]]は、 [CN[CR]]、[CN[LF]]、
[[[CN[CR]][CN[LF]]]] のいずれかによって表されます [SRC[>>59]]。

[25] 
[[OpenSSH]] は少なくても[[秘密鍵]] ([CODE[OPENSSH PRIVATE KEY]])
の扱いに関してかなり厳しく、 [CN[CR]] が入っているとエラーにします。
[CN[LF]] のみである必要があります。


[FIG(railroad)[
= |
== [CN@en[[[CR]]]]
== [CN@en[[[LF]]]]
== [[[CN@en[CR]][CN[LF]]]]
]FIG]

;; [32] 構文的に正しくないファイルを与えられた時どう解釈するのかは定かではありません。

* メッセージ種別

[26] [[メッセージ種別]] ([[RFC 7468]] のいう[DFN[[RUBYB[ラベル]@en[label]]]]) には、次のものがあります。

[FIG(list)[
- [CODE[[[CERTIFICATE]]]] - [[証明書]] ([[DER]]) [SRC[>>42, >>59]]
- [CODE[[[CERTIFICATE]]]] - [[PKCS #7証明書鎖]] [SRC[>>42, >>29]]
- [CODE[[[CERTIFICATE]]]] - [[Netscape Certificate Sequence]] [SRC[>>42]]
- [CODE[[[X509 CERTIFICATE]]]] - [[証明書]] [SRC[>>59]]
- [CODE[[[X.509 CERTIFICATE]]]] - [[証明書]] [SRC[>>59]]
- [CODE[[[TRUSTED CERTIFICATE]]]]
- [CODE[[[PKCS7]]]] - [[PKCS #7]] [SRC[>>29, >>59]]
- [CODE[[[CERTIFICATE CHAIN]]]] - [[PKCS #7証明書鎖]] [SRC[>>59]]
- [CODE[PKCS7 CERTIFICATE CHAIN]] - [[PKCS #7証明書鎖]] [SRC[>>79]]
- [CODE[[[CMS]]]] - [[CMS]] [SRC[>>59]]
- [CODE[[[RSA PRIVATE KEY]]]] - [[RSA]] [[秘密鍵]] ([[PKCS #1]]) [SRC[>>30]]
- [CODE[[[RSA PUBLIC KEY]]]] - [[RSA]] [[公開鍵]] ([[PKCS #1]]) [SRC[>>30]]
- [CODE[[[DSA PRIVATE KEY]]]] - [[DSA]] [[秘密鍵]] [SRC[>>35]]
- [CODE[[[PRIVATE KEY]]]] - [[秘密鍵]] ([[PKCS #8]]) [SRC[>>4, >>59]]
- [CODE[[[PUBLIC KEY]]]] - [[公開鍵]] [SRC[>>30, >>59]]
- [CODE[[[ENCRYPTED PRIVATE KEY]]]] - [[暗号化]]された[[秘密鍵]] ([[PKCS #8]]) [SRC[>>4, >>59]]
- [CODE[[[CERTIFICATE REQUEST]]]] - [[CSR]] ([[PKCS #10]]) [SRC[>>59]]
- [CODE[[[NEW CERTIFICATE REQUEST]]]] - [[CSR]] ([[PKCS #10]]) [SRC[>>59]]
- [CODE[NETSCAPE CERTIFICATE SEQUENCE]] - [[Netscape Certificate Sequence]] [SRC[>>79]]
- [CODE[[[X509 CRL]]]] - [[CRL]] [SRC[>>59]]
- [CODE[[[CRL]]]] - [[CRL]] [SRC[>>59]]
- [CODE[[[ATTRIBUTE CERTIFICATE]]]] - [[属性証明書]] [SRC[>>59]]
- [CODE[[[EC PARAMETERS]]]] - [[楕円曲線]]の[[引数]] [SRC[>>75]]
- [CODE[[[DH PARAMETERS]]]] - [[DH]]の[[引数]] [SRC[>>76]]
- [CODE[ED25519 PRIVATE KEY]]
- [CODE[OPENSSH PRIVATE KEY]] - [[SSH]]
]FIG]

* 類似ファイル形式



[37] [[PEM]] は [[RFC 4716]] のファイル形式と似ていますが、微妙に違います。

[REFS[
- [36] [CITE@en[RFC 4716 - The Secure Shell (SSH) Public Key File Format]] ([TIME[2015-02-08 18:20:33 +09:00]] 版) <https://tools.ietf.org/html/rfc4716>
]REFS]

[38] [[OpenPGP]] の [[ASCII Armor]] とも似ていますが、そちらは元の [[PEM]]
の形式により似ています (微妙に違います)。

[40] [[SSH]] クライアントはこれらのいずれとも微妙に違った、本項の [[PEM]]
形式に [[RFC 822]] 風ヘッダーを足した[[秘密鍵]]ファイル [SRC[>>58]] を使うことがあります。
(本項の形式を使うこともあります。)
[[RFC 4716]] は [[SSH]] 用として更に微妙に異なる構文を規定しています。

[97] 
[[SSH]] 用のファイル形式もまた [[PEM]] 形式と呼ばれているようです。
ややこしいことに [[SSH]] が使うファイル形式も実装の世代によって
[[メッセージ種別]] (やそれによって表される内容) の違いがあって互換性の問題が生じていて、
(新旧どちらも「PEM 形式」であるにも関わらず) 一方が 
「[[PEM]]形式」と呼ばれることがあるようです。

[98] 
[[SSH]] 用ファイル形式は [[RFC 822]] ヘッダーが1個もないと、
通常の [[PEM]] 形式になります。


[77] これらのファイル形式は、おそらくは大元は共通なのでしょうが、
他のファイル形式を参考に自身の用途に移植して実装した時に、
それぞれの思惑で少しずつ違いが生じたのでしょう。


[99] 
まあそもそもどのファイル形式も本家の [[PEM]] とは関係ないので、
どれを [[PEM]] と呼んでも別にいい (どれも等しく俗称) だったのでしょう。

;; [100] すると混乱極まった後に遅れて一部の形式だけを[[標準化]]する [[RFC]]
を出した [[IETF]] は混乱をややこしくする形で固定化してしまったわけです。
俗称の一部分にだけお墨付きを出して残りは放置なのですから。


[39] 類似ファイル形式 (元の [[PEM]], >>37, >>38, >>40) で使われるメッセージ種別相当の文字列には次のものがあります。
[FIG(list)[
- [CODE[[[PRIVACY-ENHANCED MESSAGE]]]] - [[PEM]] [[暗号化]]メールの「内側」
- [CODE[[[PGP MESSAGE]]]] - [[OpenPGP]]
- [CODE[[[PGP PUBLIC KEY BLOCK]]]] - [[OpenPGP]]
- [CODE[[[PGP PRIVATE KEY BLOCK]]]] - [[OpenPGP]]
- [CODE[[[PGP MESSAGE, PART [VAR[X]]/[VAR[Y]]]]]] - [[OpenPGP]]
- [CODE[[[PGP MESSAGE, PART [VAR[X]]]]]] - [[OpenPGP]]
- [CODE[[[PGP SIGNATURE]]]] - [[OpenPGP]]
- [CODE[[[SSH2 PUBLIC KEY]]]] - [[SSH]]
- [CODE[RSA PRIVATE KEY]] - [[RSA]]
- [CODE[[[DSA PRIVATE KEY]]]] - [[SSH]]
- [CODE[[[SSH2 ENCRYPTED PRIVATE KEY]]]] - [[SSH]]
- [CODE[ED25519 PRIVATE KEY]]
]FIG]

;; [101] 狭義 [[PEM]] で使われるものと共通しているものもいくつかあります。
「どちらの形式でも使われる」
というよりは、
元々広義 [[PEM]] で使われていたのが狭義 [[PEM]] とそれ以外とで分断された見え方に
(今では) なっているというだけのことなのでしょう。





;; [96] [CODE[ssh-keygen]] が生成する[[秘密鍵]]は [[PEM]] 形式ないしそれに類似する形式ですが、
[[公開鍵]]はまた別の形式です。


* 処理

[52] [CODE[[[.pem]]]] ファイルとして構文解析して [[Base64]] [[符号化]]されたバイナリーデータを取り出した後の処理方法は、
利用する場面によって異なります。

[54] [CODE[[[.pem]]]] ファイルの内容が意図したものと異なる場合もあります。
[[EB]] の記述が想定と異なる場合もありますし、 [[EB]] の記述と実際の内容が異なる場合もあります。
[CODE[[[.pem]]]] ファイルを送信したプロトコルにおける [[MIME型]]と内容が異なる場合もあります。

[66] [[EB]] の記述と実際の内容が異なる場合でも、構文解析器は[RUBYB[華麗]@en[gracefully]]に処理できなければ[['''なりません''']]。実際の内容に従い処理しても構いませんが、
セキュリティー上問題ないか注意する必要があります。既存の実装がどう処理するかは、
それぞれです。 [SRC[>>59]]

[53] [[Webブラウザー]]で[[ダウンロード]]した場合の処理は、[[証明書ダウンロード]]を参照。

* MIME 型

[41] [[MIME型]]としては [CODE(MIME)@en[[[application/x-pem-file]]]] が使われます。

[55] 内容により異なる [[MIME型]]が使われることもあります。
[SEE[ [[証明書ダウンロード]], [CODE(MIME)@en[application/pem-certificate-chain]] ]]

;; [56] 
意味的には [CODE[+pem]] としても良さそうなものですが ([SEE[ [[構造化構文接尾辞]] ]])、
実際には使われていないようです。

* 拡張子

[33] 一般には[[拡張子]] [CODE[[[.pem]]]] が使われます。

[34] 内容により [CODE[[[.cer]]]]、[CODE[[[.csr]]]]、[CODE[[[.key]]]]
などが用いられることもあります
(それぞれ[[証明書]]、[[CSR]]、[[鍵]])。
これらは [CODE[[[.pem]]]] 形式でない元のバイナリーファイルでも使われることがあり、
[[拡張子]]だけではファイル形式を判定できません。

* メッセージ種別 [CODE[CERTIFICATE]]

[67] ラベル [DFN[[CODE[[[CERTIFICATE]]]]]] は、[[公開鍵]][[証明書]]に用いられます
[SRC[>>59]]。

[68] データは、 [[ASN.1]] [CODE[[[Certificate]]]] です。
[[BER]] でなければ[['''なりません''']]。 [[DER]]
が[RUBYB[非常に好ましい]@en[strongly preferred]]です。 [SRC[>>59]]

[69] 実際には [[X.509]] [[証明書]]の他に、
[[PKCS #7証明書鎖]] [SRC[>>42, >>29]] や
[[Netscape Certificate Sequence]] [SRC[>>42]]
にもラベル [CODE[[[CERTIFICATE]]]] が使われることがあります。

[70] また [[X.509]] [[証明書]]を表すためにラベルとして [DFN[[CODE[[[X509 CERTIFICATE]]]]]]
や [DFN[[CODE[[[X.509 CERTIFICATE]]]]]] が使われることがあります [SRC[>>59]]。
これらを生成しては[['''なりません''']]が、構文解析器は等価として扱う[['''べきです''']]
[SRC[>>59]]。

[71] メッセージの前後に説明文が記述されることがあります。
その場合は[[証明書]]を説明するものである[['''べき''']]です。 [SRC[>>59]]

[EG[
[72] [SRC[>>59]]
[PRE(code)[
Subject: CN=Atlantis
Issuer: CN=Atlantis
Validity: from 7/9/2012 3:10:38 AM UTC to 7/9/2013 3:10:37 AM UTC
-----BEGIN CERTIFICATE-----
...
]PRE]
]EG]

[73] [[拡張子]]として [CODE[[[.cer]]]] を使うこともありますが、 [[DER]]
形式と区別するため [CODE[[[.crt]]]] を使う[['''べき''']]です [SRC[>>59]]。
実際には [CODE[[[.pem]]]] が使われることもよくあります。


[91] 
[[CAfile]]
や
[[CApath]]
で使われます。

[93] 
[[[CODE[x5u]]で指定された証明書鎖]]で使われます。


* 実装

[83] 
[[PKI]] の実装のほとんどが、何らかの形で対応しています。

[84] 
[[OpenSSL]] はもちろん対応しています。
[CODE[openssl]] のサブコマンドのほとんどが、
[[PEMファイル]]の入出力に対応しています。
([[DER]] など他の形式にも対応しています。)

* 文脈

[104] 
[[MySQL]] プロトコルの
[CODE[caching_sha2_password]]
用の[[公開鍵]]応答では、
[CODE[PUBLIC KEY]]
の [CODE[.pem]] ファイルが返されます。

* 歴史

[8] 本ファイル形式名の [[PEM]] は[[電子メール]]における[[暗号化]]の仕様を指すとされていますが、
[[PEM]] に (少なくても [[RFC]] として出版されたものには) 
本ファイル形式の規定はなく、なぜ [CODE[[[.pem]]]] ファイルと呼ばれているかは定かではありません。
本ファイル形式は [[PEM]] の影響を受けているようですが、 [[PEM]]
で規定されるメッセージ形式とは明らかに違いがあります。

[9] [[PEM]] の実装が使っていたファイル形式なのかもしれません。あるいは [[PEM]]
の記憶が濃い時代に [[PEM]] 風のファイル形式として名付けられたのかもしれません。
(現在でいう) [[Base64]] のことを [[PEM]] と呼んでいたのかもしれません。

;; [10] [[MIME]] の一機能に過ぎない [[Base64]] のことを「[[MIME]]」と呼ぶ風習がかつて一部にありました。
[[MIME]] より前の時代に [[Base64]] のことを「[[PEM]]」と呼んでいても不思議ではありません。

[50] 本ファイル形式を明確に規定する仕様書として現時点で唯一発見できているのが、
[[証明書ダウンロード]]です。

[46] [[証明書ダウンロード]]仕様書 [SRC[>>42]] の最も初期と思われる1996年版 [SRC[>>45]]
の定義は、 [[PEM]] という語は登場しませんが、当時の [[PEM]] の [[RFC]] である
[[RFC 1113]] の [[Base64]] [SRC[>>47]] を参照しています。

;; [48] ちなみに [[Base64]] という名称も [[PEM]] の [[RFC]] には登場していません。
[[RFC]] としての初出は [[MIME]] ですが、それ以前から [[Base64]] という呼称があったのかは不明です。
いずれにしても1996年には既に [[MIME]] と [[Base64]] は有名になっていました。
[[Base64]] と呼びつつも [[PEM]] の [[RFC]] を参照しているのは興味深いところです。

;; [49] [[証明書ダウンロード]]仕様書が最初の定義で [[Netscape]] 社が本形式を考案したのか、
より以前からあった形式を [[Netscape]] が実装したのかは不明です。

[22] [[PEM]] 版 [[Base64]] は、 [[RFC 1421]] [SRC[>>21]] が最新の定義です。
(ただしこの [[RFC]] は既に [[HISTORIC]] となっています。)

[87] 
[TIME[2007年8月][2007-08]]に発行された [[IETF]] [[提案標準]]
[[RFC 4945]]
には、 [CODE[.pem]] ファイルの構文が (曖昧ながら) 定められていました。
[SRC[>>86]]

[61] 
[TIME[2015年][year:2015]]に [[RFC 7468]] が [[IETF]] [[提案標準]] [[RFC]]
として発行され [SRC[>>60]]、 [CODE[[[.pem]]]] ファイル一般の構文が初めて明文化されました。

[88] 先行仕様の [[RFC 4945]] にはなぜか一言も言及がありません。
明らかに重複しており、[[更新]]なりなんなり手続きが必要だったはずです。
[[RFC 4945]] で仕様が明文化されていたことは世間ではあまり知られていませんでした。
まさか [[IETF]] でも知る人ぞ知る状態だったのでしょうか。

[REFS[
- [45] [CITE[Netscape Certificate Download Specification]] ([TIME[2015-04-12 12:43:10 +09:00]] 版) <http://web.archive.org/web/19970709163955/http://home.netscape.com/eng/security/downloadcert.html>
- [47] [CITE@en[RFC 1113 - Privacy enhancement for Internet electronic mail: Part I - message encipherment and authentication procedures]] ([TIME[2015-03-22 21:14:51 +09:00]] 版) <http://tools.ietf.org/html/rfc1113#section-4.3>
- [21] [CITE@en[RFC 1421 - Privacy Enhancement for Internet Electronic Mail: Part I: Message Encryption and Authentication Procedures]] ([TIME[2015-02-22 14:28:36 +09:00]] 版) <https://tools.ietf.org/html/rfc1421#section-4.3.2.4>
- [86] [CITE@en[[[RFC 4945]] - The Internet IP Security PKI Profile of IKEv1/ISAKMP, IKEv2, and PKIX]], [TIME[2020-03-29 19:06:48 +09:00]] <https://tools.ietf.org/html/rfc4945#section-6>
- [60] [CITE@en[RFC 7468 - Textual Encodings of PKIX, PKCS, and CMS Structures]] ([TIME[2015-04-20 12:22:43 +09:00]] 版) <https://tools.ietf.org/html/rfc7468>
]REFS]


* メモ

[82] 
[[PEMファイル]]は、[[証明書]]や [[PKI]] を使う、あらゆる[[応用]]に使われます。
例えば次のようなものがあります。
[SEE[ [[証明書]]、[[PKI]] ]]

- [[Webサーバー]] ([[HTTPS]]) の[[サーバー証明書]]
- [[Webサーバー]] ([[HTTPS]]) の[[クライアント証明書]]
- [[S/MIME]] で[[署名]]や[[暗号化]]した[[インターネットメール]]
- [[SSH]] 接続
-- [94] [[AWS]] の [[EC2]] の[[インスタンス]]に [[SSH]] で接続
- [95] [[OpenSSL]] およびそれを[[ライブラリー]]として組み込んだ各種[[応用]]の利用

[85] 
[[PEMファイル]]といっても中身にいろいろな種類があるし、
使いみちもいろいろあるので、
何でも出来ちゃうすごいもののように聞こえて、
とっつきにくくみえますね。

[FIG(amazon)[
[[暗号化]]
]FIG]

[1] [CITE[証明書のファイル形式について]]
([TIME[2009-05-14 20:39:44 +09:00]])
<http://moca.wide.ad.jp/moca_guide/about_fileformat.html>

[2] [CITE@ja[.PEM SSL サーバ証明書とは。]]
([TIME[2014-10-24 16:51:29 +09:00]] 版)
<http://www.digicert.ne.jp/howto/basis/pem-ssl-creation.html>

[3] [CITE@ja[SSL/TLS/PKI メモ]]
([[Masatoshi Sato]] 著, [TIME[2011-07-08 01:12:34 +09:00]] 版)
<http://siisise.net/linux/ssl.html>

[FIG(quote)[
[FIGCAPTION[
[4] [CITE@en[RFC 5958 - Asymmetric Key Packages]]
([TIME[2015-04-05 22:36:35 +09:00]] 版)
<https://tools.ietf.org/html/rfc5958#section-5>
]FIGCAPTION]

> .p8 files are sometimes PEM-encoded.  When .p8 files are PEM encoded
>    they use the .pem file extension.  PEM encoding is either the Base64
>    encoding, from Section 4 of '''['''RFC4648''']''', of the DER-encoded
>    EncryptedPrivateKeyInfo sandwiched between:
>    -----BEGIN ENCRYPTED PRIVATE KEY-----
>    -----END ENCRYPTED PRIVATE KEY-----
>    or the Base64 encoding, see Section 4 of '''['''RFC4648''']''', of the DER-
>    encoded PrivateKeyInfo sandwiched between:
>    -----BEGIN PRIVATE KEY-----
>    -----END PRIVATE KEY-----
> 

]FIG]


[5] [CITE[java - what is the differences between "BEGIN RSA PRIVATE KEY" and "BEGIN PRIVATE KEY" - Stack Overflow]]
([TIME[2015-04-08 01:00:10 +09:00]] 版)
<http://stackoverflow.com/questions/20065304/what-is-the-differences-between-begin-rsa-private-key-and-begin-private-key>

[30] [CITE[rsa - RSA key processing tool]] ([TIME[2015-04-11 00:09:25 +09:00]] 版) <https://www.openssl.org/docs/apps/rsa.html>

[35] [CITE[dsa - DSA key processing]] ([TIME[2015-04-11 00:20:50 +09:00]] 版) <https://www.openssl.org/docs/apps/dsa.html>

[29] [CITE[pkcs7 - PKCS#7 utility]] ([TIME[2015-04-11 00:07:16 +09:00]] 版) <https://www.openssl.org/docs/apps/pkcs7.html>

[FIG(quote)[
[FIGCAPTION[
[57] [CITE[SSL_CTX_load_verify_locations - set default locations for trusted CA certificates]]
([TIME[2015-04-18 21:29:53 +09:00]] 版)
<https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html>
]FIGCAPTION]

> Before, between, and after the certificates text is allowed which can be used e.g. for descriptions of the certificates.

]FIG]


[58] [CITE[PEM, PEM_read_bio_PrivateKey, PEM_read_PrivateKey, PEM_write_bio_PrivateKey, PEM_write_PrivateKey, PEM_write_bio_PKCS8PrivateKey, PEM_write_PKCS8PrivateKey, PEM_write_bio_PKCS8PrivateKey_nid, PEM_write_PKCS8PrivateKey_nid, PEM_read_bio_PUBKEY, PEM_read_PUBKEY, PEM_write_bio_PUBKEY, PEM_write_PUBKEY, PEM_read_bio_RSAPrivateKey, PEM_read_RSAPrivateKey, PEM_write_bio_RSAPrivateKey, PEM_write_RSAPrivateKey, PEM_read_bio_RSAPublicKey, PEM_read_RSAPublicKey, PEM_write_bio_RSAPublicKey, PEM_write_RSAPublicKey, PEM_read_bio_RSA_PUBKEY, PEM_read_RSA_PUBKEY, PEM_write_bio_RSA_PUBKEY, PEM_write_RSA_PUBKEY, PEM_read_bio_DSAPrivateKey, PEM_read_DSAPrivateKey, PEM_write_bio_DSAPrivateKey, PEM_write_DSAPrivateKey, PEM_read_bio_DSA_PUBKEY, PEM_read_DSA_PUBKEY, PEM_write_bio_DSA_PUBKEY, PEM_write_DSA_PUBKEY, PEM_read_bio_DSAparams, PEM_read_DSAparams, PEM_write_bio_DSAparams, PEM_write_DSAparams, PEM_read_bio_DHparams, PEM_read_DHparams, PEM_write_bio_DHparams, PEM_write_DHparams, PEM_read_bio_X509, PEM_read_X509, PEM_write_bio_X509, PEM_write_X509, PEM_read_bio_X509_AUX, PEM_read_X509_AUX, PEM_write_bio_X509_AUX, PEM_write_X509_AUX, PEM_read_bio_X509_REQ, PEM_read_X509_REQ, PEM_write_bio_X509_REQ, PEM_write_X509_REQ, PEM_write_bio_X509_REQ_NEW, PEM_write_X509_REQ_NEW, PEM_read_bio_X509_CRL, PEM_read_X509_CRL, PEM_write_bio_X509_CRL, PEM_write_X509_CRL, PEM_read_bio_PKCS7, PEM_read_PKCS7, PEM_write_bio_PKCS7, PEM_write_PKCS7, PEM_read_bio_NETSCAPE_CERT_SEQUENCE, PEM_read_NETSCAPE_CERT_SEQUENCE, PEM_write_bio_NETSCAPE_CERT_SEQUENCE, PEM_write_NETSCAPE_CERT_SEQUENCE - PEM routines]]
([TIME[2015-04-18 21:50:36 +09:00]] 版)
<https://www.openssl.org/docs/crypto/pem.html>

[75] [CITE@en[OpenSSL]]
([[OpenSSL Foundation, Inc.]] 著, [TIME[2015-09-27 01:47:48 +09:00]] 版)
<https://www.openssl.org/docs/manmaster/apps/ecparam.html>

[76] [CITE@en[OpenSSL]] ([[OpenSSL Foundation, Inc.]] 著, [TIME[2015-09-27 11:37:26 +09:00]] 版) <https://www.openssl.org/docs/manmaster/apps/dhparam.html>

[79] [CITE[X.509 Style Guide]]
([TIME[2004-09-21 00:09:43 +09:00]])
<https://www.cs.auckland.ac.nz/~pgut001/pubs/x509guide.txt>

[80] [CITE@en[/docs/manmaster/man3/SSL_CTX_load_verify_locations.html]]
([[OpenSSL Foundation, Inc.]]著, [TIME[2018-09-23 23:43:52 +09:00]])
<https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html>

[FIG(quote)[
[FIGCAPTION[
[81] [CITE@en[/docs/manmaster/man3/SSL_CTX_load_verify_locations.html]]
([[OpenSSL Foundation, Inc.]]著, [TIME[2018-09-23 23:44:22 +09:00]])
<https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html>
]FIGCAPTION]

> The file can contain several CA certificates identified by
>  -----BEGIN CERTIFICATE-----
>  ... (CA certificate in base64 encoding) ...
>  -----END CERTIFICATE-----
> sequences. Before, between, and after the certificates text is allowed which can be used e.g. for descriptions of the certificates.

]FIG]


[89] [CITE@en[/docs/man1.1.1/man3/SSL_CTX_load_verify_locations.html]]
([[OpenSSL Foundation, Inc.]]著, [TIME[2020-06-01 16:04:37 +09:00]])
<https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_load_verify_locations.html>

[90] [CITE@en[/docs/manmaster/man3/SSL_CTX_load_verify_locations.html]]
([[OpenSSL Foundation, Inc.]]著, [TIME[2020-06-01 18:16:19 +09:00]])
<https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html>

[103] [CITE@en[The OpenSSH Private Key Format]], [[AJ ONeal]], [TIME[2023-06-15T20:57:26.000Z]], [TIME[2023-08-22T07:39:15.647Z]] <https://coolaj86.com/articles/the-openssh-private-key-format/>

[102] [CITE@ja[OpenSSH/OpenSSL 鍵データ相互変換 - Qiita]], [TIME[2023-08-22T07:34:16.000Z]] <https://qiita.com/angel_p_57/items/6e826105d50cbb0e0abe>
