-
Notifications
You must be signed in to change notification settings - Fork 4
/
80.txt
201 lines (146 loc) · 9.36 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
[6] [DFN[[[[CODE[.pem]]]]]] は、[[証明書]]や[[秘密鍵]]など[[暗号化]]に関わる[[ファイル]]の交換・保存用のデータ形式です。
* 仕様書
[7] [CODE[[[.pem]]]] ファイル形式を規定した[[仕様書]]はなさそうです。
[8] [[PEM]] は[[電子メール]]における[[暗号化]]の仕様を指すとされていますが、
[[PEM]] に (少なくても [[RFC]] として出版されたものには)
本ファイル形式の規定はなく、なぜ [CODE[[[.pem]]]] ファイルと呼ばれているかは定かではありません。
[9] [[PEM]] の実装が使っていたファイル形式なのかもしれません。あるいは [[PEM]]
の記憶が濃い時代に [[PEM]] 風のファイル形式として名付けられたのかもしれません。
(現在でいう) [[Base64]] のことを [[PEM]] と呼んでいたのかもしれません。
;; [10] [[MIME]] の一機能に過ぎない [[Base64]] のことを「[[MIME]]」と呼ぶ風習がかつて一部にありました。
[[MIME]] より前の時代に (まだ名前がなかった) [[Base64]] のことを「[[PEM]]」
と呼んでいても不思議ではありません。
[22] [[PEM]] 版 [[Base64]] は、 [[RFC 1421]] [SRC[>>21]] が最新の定義です。
(ただしこの [[RFC]] は既に [[HISTORIC]] となっています。)
[REFS[
- [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]
* 構文
[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 とそれぞれ呼んでいるようです。
[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]])
- [CODE[[[CERTIFICATE]]]] - [[証明書]] ([[PKCS #7]]) [SRC[>>29]]
- [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]
* MIME 型
[41] [[MIME型]]としては [CODE(MIME)@en[[[application/x-pem-file]]]] が使われます。
* 拡張子
[33] 一般には[[拡張子]] [CODE[[[.pem]]]] が使われます。
[34] 内容により [CODE[[[.cer]]]]、[CODE[[[.csr]]]]、[CODE[[[.key]]]]
などが用いられることもあります。
これらは [CODE[[[.pem]]]] 形式でない元のバイナリーファイルでも使われることがあり、
[[拡張子]]だけではファイル形式を判定できません。
* 関連
[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>