-
Notifications
You must be signed in to change notification settings - Fork 4
/
80.txt
260 lines (187 loc) · 13 KB
/
80.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
[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>
]REFS]
[43] [[証明書ダウンロード]]仕様書 [SRC[>>42]] は[[証明書]]や[[証明書]]鎖に関する
[CODE[[[.pem]]]] ファイル形式を定義しています。
[7] それ以外の [CODE[[[.pem]]]] ファイル形式一般を規定した[[仕様書]]はなさそうです。
;; [44] 歴史の項も参照。
* 構文
[11] [CODE[[[.pem]]]] 形式のファイルは、 [[ASCII]] 文字列で構成される[[テキストファイル]]です。
;; [12] [[非ASCII文字]]が含まれる場合にどう解釈されるかは定かではありません。
[13] [CODE[[[.pem]]]] 形式のファイルは、1つ以上の[[メッセージ]]で構成されます。
[FIG(railroad)[
= +
== [[メッセージ]]
]FIG]
;; [14] 多くの場合は[[メッセージ]]は1つだけですが、 [[certification path]]
を表す一連の[[証明書]]を表す場合や[[ルート証明書]]として使われる[[証明書]]群を表す場合、
[[秘密鍵]]と[[証明書]]を含めた場合など、複数の[[メッセージ]]が含まれることがあります。
複数含まれる場合、用途により、順序が指定されることがあります。例えば[[中間証明書]]は[[ルート証明書]]や[[末端実体証明書]]に近い順序に並べる必要があるかもしれません。
;; [19] [[メッセージ]]の前後に[[空行]]が含まれることがあるかもしれませんが、
どの実装でも問題ないのかは定かではありません。
[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[-----]] が続きます。最後に[[改行]]が入ります。
[FIG(railroad)[
= [CODE[[[-----BEGIN ]]]]
= メッセージ種別
= [CODE[[[-----]]
]FIG]
[17] [[post-EB]] は [CODE[-----END ]] の後にメッセージ種別が入り、
[CODE[-----]] が続きます。最後に[[改行]]が入ります。
[FIG(railroad)[
= [CODE[[[-----END ]]]]
= メッセージ種別
= [CODE[[[-----]]
]FIG]
;; [27] [CODE[BEGIN]] と [CODE[END]] の後には [CODE(char)[[[U+0020]]]] が入ります。
;; [18] 最後の[[メッセージ]]の後に[[改行]]が省略できるのかどうかは定かではありません。
[20] データは、[[オクテット列]]を [[Base64]] で[[符号化]]したものです。
[[PEM]] 版 [[Base64]] [SRC[>>21]] は1行を丁度64文字とすることを求めています。
;; [23] すべての [CODE[[[.pem]]]] ファイルがこれに従っているかは定かではありません。
;; [28] 元々の [[PEM]] の暗号化メールでは、データの部分は [[RFC 822]] 風の[[ヘッダー]]、
[[空行]]、[[本体]]で構成される[[メッセージ]]で、 [[Base64]] はそのうちの[[本体]]の部分だけでした。
[24] [[改行]]は、 [[LF]] のものと [[CRLF]] のものがあります。
;; [25] [[CR]] だけのものがあるかどうかは定かではありません。すべての実装がこれらの[[改行]]
(やその混在) を扱えるのかは不明です。
;; [32] 構文的に正しくないファイルを与えられた時どう解釈するのかは定かではありません。
* メッセージ種別
[26] [[メッセージ種別]]には、次のものがあります。
[FIG(list)[
- [CODE[[[CERTIFICATE]]]] - [[証明書]] ([[DER]]) [SRC[>>42]]
- [CODE[[[CERTIFICATE]]]] - [[PKCS #7証明書鎖]] [SRC[>>42, >>29]]
- [CODE[[[CERTIFICATE]]]] - [[Netscape Certificate Sequence]] [SRC[>>42]]
- [CODE[[[X509 CERTIFICATE]]]]
- [CODE[[[TRUSTED CERTIFICATE]]]]
- [CODE[[[PKCS7]]]] - [[PKCS #7証明書鎖]] [SRC[>>29]]
- [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]]
- [CODE[[[PUBLIC KEY]]]] - [[公開鍵]] [SRC[>>30]]
- [CODE[[[ENCRYPTED PRIVATE KEY]]]] - [[暗号化]]された[[秘密鍵]] ([[PKCS #8]]) [SRC[>>4]]
- [CODE[[[CERTIFICATE REQUEST]]]] - [[CSR]] ([[PKCS #10]])
- [CODE[[[NEW CERTIFICATE REQUEST]]]] - [[CSR]] ([[PKCS #10]])
- [CODE[[[X509 CRL]]]] - [[CRL]]
]FIG]
[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[[[DSA PRIVATE KEY]]]] - [[SSH]]
- [CODE[[[SSH2 ENCRYPTED PRIVATE KEY]]]] - [[SSH]]
]FIG]
* 処理
[52] [CODE[[[.pem]]]] ファイルとして構文解析して [[Base64]] [[符号化]]されたバイナリーデータを取り出した後の処理方法は、
利用する場面によって異なります。
[54] [CODE[[[.pem]]]] ファイルの内容が意図したものと異なる場合もあります。
[[EB]] の記述が想定と異なる場合もありますし、 [[EB]] の記述と実際の内容が異なる場合もあります。
[CODE[[[.pem]]]] ファイルを送信したプロトコルにおける [[MIME型]]と内容が異なる場合もあります。
こうした場合にどう処理するべきなのか、どう処理されているのかは定かではありません。
[53] [[Webブラウザー]]で[[ダウンロード]]した場合の処理は、[[証明書ダウンロード]]を参照。
* MIME 型
[41] [[MIME型]]としては [CODE(MIME)@en[[[application/x-pem-file]]]] が使われます。
[55] 内容により異なる [[MIME型]]が使われることもあります。
;; [56] [[証明書ダウンロード]]も参照。
* 拡張子
[33] 一般には[[拡張子]] [CODE[[[.pem]]]] が使われます。
[34] 内容により [CODE[[[.cer]]]]、[CODE[[[.csr]]]]、[CODE[[[.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]] となっています。)
[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>
]REFS]
* 関連
[37] [[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]] 風ヘッダーを足した[[秘密鍵]]ファイルを使うことがあります。
(本項の形式を使うこともあります。)
* メモ
[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]