/
354.txt
527 lines (429 loc) · 18.9 KB
/
354.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
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
* 仕様書
[REFS[
- [7] [CITE@en[[[RFC 7515]] - JSON Web Signature (JWS)]], [TIME[2019-11-24 17:13:01 +09:00]] <https://tools.ietf.org/html/rfc7515>
-- [8] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-2>
-- [22] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-3>
-- [47] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-4>
-- [31] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-7>
]REFS]
* 構文
[9]
[DFN[JSON Web Signature]] ([DFN[JWS]])
は、
[[デジタル]]的に [[RFC 4949]] [[署名][デジタル署名]]されまたは [[RFC 4949]] [[MAC]]
された[[メッセージ]]です。
[SRC[>>8, >>22]]
;; [21] [[JWS]] には、[[一貫性]]保護のない[[非保安JWS]]が含まれます。
[23] [[JWS]] は、 [[RFC 7159]] [[JSON]] データや [[base64url]]
を使って記述されます。 [[JSON]] は、その定めるところにより、
値の前後に[[空白]]を挿入できます。 [SEE[ [[JSON]] ]]
[SRC[>>22]]
[24] [[JWS]] は、論理的に
[[JOSEヘッダー]]、[[JWSペイロード]]、
[[JWS署名]]で構成されます。
[FIG(list members)[ [25] [[JWS]]
: [[JOSEヘッダー]]: [[JWS保護ヘッダー]]、[[JWS非保護ヘッダー]]
: [[JWSペイロード]]:
: [[JWS署名]]:
]FIG]
-*-*-
[11]
[DFN[[RUBYB[JWSペイロード][JWS Payload]]]]は、
[RUBYB[保安される][secured]][[オクテット列]]、[RUBYB[すなわち][[[aka]]]][RUBYB[[[メッセージ]]][message]]です。
[[ペイロード]]は、
任意の[[オクテット列]]を含められます。
[SRC[>>8]]
[12]
[DFN[[RUBYB[JWS署名][JWS Signature]]]]は、
[[JWS保護ヘッダー]]と[[JWSペイロード]]に関する [[RFC 4949]] [[デジタル署名]]や
[[RFC 4949]] [[MAC]]
です。
[SRC[>>8]]
[16]
[DFN[[RUBYB[JWS署名入力][JWS Signing Input]]]]は、
[[RFC 4949]] [[デジタル署名]]または [[RFC 4949]] [[MAC]] 計算への[[入力]]です。
この値は、
= [[RFC 20 ASCII][ASCII()]] ([[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([[JWS保護ヘッダー]])))
= [CODE[.][FULL STOP]]
= [[RFC 7515 BASE64URL][BASE64URL()]] ([[JWSペイロード]])
... を[[順に連結][文字列連結]]した結果です。
[SRC[>>8]]
[19]
[DFN[[RUBYB[耐衝突名][Collision-Resistant Name]]]]は、
他の[[名前]]と[[衝突]]しない可能性が高い方法で[[名前]]を割り当てられる[[名前空間]]中の[[名前]]です。
[[ドメイン名]]、
[[ITU-T]] [[X.660]]、[[X.670]] シリーズの [[OID]]、
[[RFC 4122]] [[UUID]]
などが該当します。
管理権限を移譲された名前空間を使う場合にあっては、
名前の定義者は、
名前を定義するため使う名前空間の部分に関して、
制御下に置かれるべく十分に注意を払う必要があります。
[SRC[>>8]]
[61] [[公開ヘッダー引数名]]や [CODE[alg]] が、
[[耐衝突名]]を含む値であるべきとされています。
[[耐衝突名]]であるべきではなく[[耐衝突名]]を含むべきとされているので、
例えば [[UUID]] だけでなく、 [[UUID]] に何かを付け足した値も認められているようです。
[62] [CODE[alg]] は[[耐衝突名]]かつ [[StringOrURI]] とされています。
[20]
[DFN[StringOrURI]]
は、
[[JSON文字列]]値であって、
任意の[[文字列]]値であっても[MAY[構わない]]ものの、
[CODE[:]] が含まれる場合は
[[RFC 3986]] [[URI]]
でなければ[MUST[ならない]]ものです。
[[比較][文字列の比較]]は、
[[大文字・小文字区別あり]]で変形や[[正準化]]なく行います。
[SRC[>>8]]
* 直列化
[27]
[[JWS]]
は、
[[JWS簡潔直列化]]と
[[JWS JSON直列化]]の
2種類の表現方法があります [SRC[>>31]]。
[[JWS JSON直列化]]の方が高い記述能力を持ちます。
[32]
[[JWS]] を使う[[応用]]は、
どちらの[[直列化]]を使うか、
どの[[直列化]][RUBYB[機能][feature]]を使うかを、
規定する必要があります。
[[JWS]] の実装は、
対応したい[[応用]]で必要な機能のみ実装する必要があります。
[SRC[>>31]]
[EG[
[33]
例えば、
「[[JWS JSON直列化]]で署名か [[MAC]] の値は1つだけ対応する」
のような定めが可能です。
[SRC[>>31]]
]EG]
** JWS簡潔直列化
[17]
[DFN[[RUBYB[JWS簡潔直列化][JWS Compact Serialization]]]]は、
[[JWS]]
を簡潔で [[URL]] 安全な[[文字列]]として表現したものです。
[SRC[>>8]]
[28]
[[JWS簡潔直列化]]では、
[[JWS非保護ヘッダー]]を使うことが出来ません。
[[JOSEヘッダー]] = [[JWS保護ヘッダー]]です。
[SRC[>>8, >>22]]
[29]
[[JWS簡潔直列化]]は、
次のものを[[順に連結][文字列連結]]したものです。
[SRC[>>22, >>31]]
= [[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([[JWS保護ヘッダー]]))
= [CODE[.][FULL STOP]]
= [[RFC 7515 BASE64URL][BASE64URL()]] ([[JWSペイロード]])
= [CODE[.][FULL STOP]]
= [[RFC 7515 BASE64URL][BASE64URL()]] ([[JWS署名]])
[34]
[[署名]]・[[MAC]] は1つだけしか指定できません。 [SRC[>>31]]
** JWS JSON直列化
[18]
[DFN[[RUBYB[JWS JSON直列化][JWS JSON Serialization]]]]は、
[[JWS]]
を
[[JSONオブジェクト]]として表現したものです。
[[JWS簡潔直列化]]と違って、
複数の
[[RFC 4949]] [[デジタル署名]]と
[[RFC 4949]] [[MAC]]
の[[一方又は両方][及び/又は]]を同じ内容に適用できます。
簡潔性や [[URL]] 安全性は重視していません。
[SRC[>>8]]
[30]
[[JWS JSON直列化]]では、
[[JWS保護ヘッダー]]と[[JWS非保護ヘッダー]]の両方を使うことができます
[SRC[>>8, >>22]]。
どちらか一方は存在しなければ[MUST[なりません]] [SRC[>>22]]。
[[JOSEヘッダー]]は両者全体で構成されます [SRC[>>8, >>22]]。
[35] 一般構文と呼ばれるものと、平坦化構文と呼ばれるものの2種類があります。
[SRC[>>31]]
*** 一般構文
[36]
[DFN[[RUBYB[(完全)一般JWS JSON直列化構文][(fully) general JWS JSON serialization syntax]]]]は、
次のような最上位の
[[JSONオブジェクト]]です。
[SRC[>>31]]
[FIG(list members)[ [38] [[JSONオブジェクト]]
: [DFN[[CODE[payload][JWS Payload]]]] :
[[RFC 7516 BASE64URL][BASE64URL()]] ([[JWSペイロード]])。
[MUST[必須]]。
[SRC[>>31]]
: [DFN[[CODE[signatures]]]] :
[[JSONオブジェクト]]の[[配列]]でなければ[MUST[なりません]]。
[FIG(list members)[ [40] [[JSON配列]]
[41]
各[[JSONオブジェクト]]は、
[[JWSペイロード]]と [[JWS保護ヘッダー]]の[[署名]]や [[MAC]] を表します。
[SRC[>>31]]
[FIG(list members)[ [39] [[JSONオブジェクト]]
: [DFN[[CODE[protected][JWS保護ヘッダー]]]] :
[[JWS保護ヘッダー]]値が空でない時、
[[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([[JWS保護ヘッダー]]))
でなければ[MUST[なりません]]。
[[ヘッダー引数]]値は[[一貫性]]保護されます。
そうでないとき、
省略しなければ[MUST[なりません]]。
[SRC[>>31]]
: [DFN[[CODE[header][JWS非保護ヘッダー]]]] :
[[JWS非保護ヘッダー]]値が空でない時、
[[JWS非保護ヘッダー]]たる [[JSON]] 値でなければ[MUST[なりません]]。
[[ヘッダー引数]]値は[[一貫性]]保護されません。
そうでないとき、
省略しなければ[MUST[なりません]]。
[SRC[>>31]]
: [DFN[[CODE[signature][JWS Signature]]]] :
[[RFC 5715 BASE64URL][BASE64URL()]] ([[JWS署名]])
でなければ[MUST[なりません]]。
[SRC[>>31]]
: その他 :
他のメンバーを指定できます。
実装は、理解できないものを無視しなければ[MUST[なりません]]。
[SRC[>>31]]
]FIG]
[42]
[CODE[protected][JWS保護ヘッダー]] または [CODE[header][JWS非保護ヘッダー]]
の一方または両方がなければ[MUST[なりません]]。
最低でも [CODE[alg]] [[ヘッダー引数]]が必要です。
[SRC[>>31]]
[43]
[[署名]]や [[MAC]] 値の作成や[[検証]]に使う[[ヘッダー引数]]は、
[CODE[protected][JWS保護ヘッダー]] と
[CODE[header][JWS非保護ヘッダー]]
を[[合同]]して得られる
[[JOSEヘッダー]]です。
両者の[[ヘッダー引数]]の名前は、[[互いに素][disjoint]]でなければ[MUST[なりません]]。
[SRC[>>31]]
]FIG]
: その他 :
他のメンバーを指定できます。
実装は、理解できないものを無視しなければ[MUST[なりません]]。
[SRC[>>31]]
([CODE[protected][JWS保護ヘッダー]],
[CODE[header][JWS非保護ヘッダー]],
[CODE[signature][JWS Signature]]
も禁止はされていません。)
]FIG]
*** 平坦化構文
[37]
[DFN[[RUBYB[平滑化JWS JSON直列化構文][flattened JWS JSON serialization syntax]]]]は、
単一の[[デジタル署名]]・ [[MAC]] の場合に最適化したもので、
次のような最上位
[[JSONオブジェクト]]です。
[SRC[>>31]]
[FIG(list members)[ [44] [[JSONオブジェクト]]
: [CODE[payload][JWS Payload]] :
[[RFC 7516 BASE64URL][BASE64URL()]] ([[JWSペイロード]])。
[MUST[必須]]。
[SRC[>>31]]
: [CODE[protected][JWS保護ヘッダー]] :
[[JWS保護ヘッダー]]値が空でない時、
[[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([[JWS保護ヘッダー]]))
でなければ[MUST[なりません]]。
[[ヘッダー引数]]値は[[一貫性]]保護されます。
そうでないとき、
省略しなければ[MUST[なりません]]。
[SRC[>>31]]
: [CODE[header][JWS非保護ヘッダー]] :
[[JWS非保護ヘッダー]]値が空でない時、
[[JWS非保護ヘッダー]]たる [[JSON]] 値でなければ[MUST[なりません]]。
[[ヘッダー引数]]値は[[一貫性]]保護されません。
そうでないとき、
省略しなければ[MUST[なりません]]。
[SRC[>>31]]
: [CODE[signature][JWS Signature]] :
[[RFC 5715 BASE64URL][BASE64URL()]] ([[JWS署名]])
でなければ[MUST[なりません]]。
[SRC[>>31]]
: その他 :
他のメンバーを指定できます。
実装は、理解できないものを無視しなければ[MUST[なりません]]。
[CODE[signatures]] があっては[MUST[なりません]]。
[SRC[>>31]]
]FIG]
[45]
[CODE[protected][JWS保護ヘッダー]] または [CODE[header][JWS非保護ヘッダー]]
の一方または両方がなければ[MUST[なりません]]。
最低でも [CODE[alg]] [[ヘッダー引数]]が必要です。
[SRC[>>31]]
[46]
[[署名]]や [[MAC]] 値の作成や[[検証]]に使う[[ヘッダー引数]]は、
[CODE[protected][JWS保護ヘッダー]] と
[CODE[header][JWS非保護ヘッダー]]
を[[合同]]して得られる
[[JOSEヘッダー]]です。
両者の[[ヘッダー引数]]の名前は、[[互いに素][disjoint]]でなければ[MUST[なりません]]。
[SRC[>>31]]
* JOSE ヘッダー
[10]
[DFN[[RUBYB[JOSEヘッダー][JOSE Header]]]]は、
使用する
[[RFC 4949]] [[デジタル署名]]や
[[RFC 4949]] [[MAC]]
の[[演算]]や[[引数]]を記述する
[[JSONオブジェクト]]です。
[SRC[>>8, >>47]]
更に追加の情報も含めることが出来ます。
[SRC[>>47]]
[13]
[DFN[[RUBYB[ヘッダー引数][Header Parameter]]]]は、
[[JOSEヘッダー]]の[[メンバー]]たる[RUBYB[[[名前]]][name]]と[RUBYB[[[値]]][value]]の[[組]]です。
[SRC[>>8]]
[48]
[[ヘッダー引数]]の名前は、[[JOSEヘッダー]]内で固有でなければ[MUST[なりません]]。
[[JWS]] [[構文解析器]]は、
[[JWS]]
が[[ヘッダー引数]]の重複を含む時、
これを拒絶するか、
または重複するメンバー名について字句的に最後のもののみ採用する
[[JavaScript]] [CODE[JSON.parse]]
と同じ挙動の [[JSON]] [[構文解析器]]を使うかしなければ[MUST[なりません]]。
[SRC[>>47]]
さらに、
[[JWS保護ヘッダー]]と[[JWS非保護ヘッダー]]の間でも同名があってはなりません (>>43, >>46)。
;; [49] [[JSONオブジェクト]]は、
[CODE[{"name": "value1", "name": "value2"}]]
のごとく同名のメンバーを複数含めることが出来ます。
[[JWS]] はこれを拒絶するか、最後の [CODE[value2]] のみ採用することを求めています。
挙動に曖昧性が認められるのは、
[[相互運用性]]の火種であり、
とりわけ[[セキュリティー]]技術には好ましからざる性質です。
どちらとも実装し得る [[JSON]] 仕様側の問題といえなくもないですが。
[[JSON]] の標準的な実装である [CODE[JSON.parse]]
の挙動、すなわちエラーとせず最後のもののみを採用するのが好ましいと考えられます。
[26] [[JWS]] の [[JOSEヘッダー]]のメンバーは、
[[JWS保護ヘッダー]]と[[JWS非保護ヘッダー]]の各メンバーの[[合同]]です。
[SRC[>>22]]
[14]
[DFN[[RUBYB[JWS保護ヘッダー][JWS Protected Header]]]]は、
[[JWS署名]]の [[RFC 4949]] [[デジタル署名]]または
[[RFC 4949]] [[MAC]]演算によって[[一貫性]]保護された[[ヘッダー引数]]を含む
[[JSONオブジェクト]]です。
[SRC[>>8]]
[15]
[DFN[[RUBYB[JWS非保護ヘッダー][JWS Unprotected Header]]]]は、
[[一貫性]]保護されていない[[ヘッダー引数]]を含む
[[JSONオブジェクト]]です。
[SRC[>>8]]
-*-*-
[50]
実装は、理解しなければ[MUST[ならない]]と規定された[[ヘッダー引数]]を、
理解し処理しなければなりません。
[SRC[>>47]]
[51]
それ以外は、理解できない場合無視しなければ[MUST[なりません]]。
ただし、 [CODE[crit]] が適用されるものを除きます。
[SRC[>>47]]
[52]
[[ヘッダー引数]]名には、
[[登録ヘッダー引数名]]、
[[公開ヘッダー引数名]]、
[[私的ヘッダー引数名]]の3[RUBYB[種類][class]]があります。
[SRC[>>47]]
この「class」は[[互いに素]]のようにも感じられますが、
[[仕様書]]の定義が曖昧で意図を掴みかねます。
[53]
[DFN[[RUBYB[登録ヘッダー引数名][Registered Header Parameter name]]]]は、
[[IANA登録簿]]に登録されたものです。
[[JWS]] と [[JWE]] の両方で使うものを定める場合、用法が一貫していなければなりません。
[SRC[>>47]]
[54]
[DFN[[RUBYB[公開ヘッダー引数名][Public Header Parameter name]]]]
[SRC[>>47]]
が何であるか[[仕様書]]はなぜか明確に述べていませんが、
[[登録ヘッダー引数名]]でも[[私的ヘッダー引数名]]でもないものとみられます。
[57]
[[公開ヘッダー引数名]]に関する[[仕様書]]の節には、
次のようにあります。
[[JWS]] 利用者は、 [[RFC 7515]] にない追加の[[ヘッダー引数]]名を定義できますが、
[[IANA登録簿]]に登録するか、
または Public Name ([[耐衝突名]]が含まれる値)
であるかとする[RUBYB[べき][should]]です。
いずれにせよ、
定義者は、
名前を定義するため使う名前空間の部分に関して、
制御下に置かれるべく十分に注意を払う必要があります。
[SRC[>>47]]
(この Public Name が[[公開ヘッダー引数名]]を指しているとも解せます。
主語の利用者が誰を指すか明らかではありませんが ([[私的ヘッダー引数名]]との違いに注意)、
[[JWS]] を利用する技術の仕様策定者とみるべきでしょうか。)
[58]
新しい[[ヘッダー引数]]の追加は、[[相互運用性]]の低下を招き得るため、
慎重にする[RUBYB[べき][should]]です。
[SRC[>>47]]
[55]
[DFN[[RUBYB[私的ヘッダー引数名][Private Header Parameter name]]]]
[SRC[>>47]]
が何であるか[[仕様書]]はなぜか不明瞭にしていますが、
[[仕様書]]の[[私的ヘッダー引数名]]の節には、
[[JWS]] の生成者と消費者は
Private Names ([[登録ヘッダー引数名]]でない名前)
や[[公開ヘッダー引数名]]を使うことに合意して構わない
[SRC[>>47]]
とあります。
この Private Names が[[私的ヘッダー引数名]]とも解し得ますが、
「[[登録ヘッダー引数名]]でない」
ならそれは[[公開ヘッダー引数名]]を含むとも考えられ、
だとすると敢えて[[公開ヘッダー引数名]]に言及しているのが不審です。
[[公開ヘッダー引数名]]と違って[[私的ヘッダー引数名]]は衝突の恐れがあり、
注意して使うべきである [SRC[>>47]]
とされており、だとすると両者は[[互いに素]]であるとも思われます。
[59]
この通り[[ヘッダー引数]]名には3つの分類がありますが、
[[仕様書]]は注意せよと言っているだけで、
利用の制限も特になく、
定義も曖昧で、
実質的な違いはないといって良いでしょう。
[60] [[相互運用性]]を考慮すると、
[[JWS]]
を使う[[応用]]は、
それぞれどれを実装しなければならないか定め、
それ以外は実装してはならないと定める必要がありそうです。
[[JWS]]
の実装は、
その適用対象の[[応用]]に合わせ、
不要なものを生成せず、
対応が求められていないものを無視することを徹底するべきでしょう。
[FIG(short list)[ [56] [[ヘッダー引数]]
- [CODE[alg]] (指定必須、対応必須)
- [CODE[jku]]
- [CODE[jwk]]
- [CODE[kid]]
- [CODE[x5u]]
- [CODE[x5c]]
- [CODE[x5t]]
- [CODE[x5t#S256]]
- [CODE[typ]]
- [CODE[cty]]
- [CODE[crit]]
]FIG]
* 処理
[SEE[ [CODE[alg]] ]]
* 応用
[FIG(short list)[ [6] [[JWS]] の[[応用]]
- [[JWT]]
-- [[VAPID]]
]FIG]
* 歴史
[1] [CITE@en[JSON Web Signature (JWS)]]
( ([TIME[2011-12-14 23:15:42 +09:00]] 版))
<http://openid.net/specs/draft-jones-json-web-signature-04.html>
[2] [CITE@en[draft-ietf-jose-json-web-signature-19 - JSON Web Signature (JWS)]]
( ([TIME[2013-12-29 22:15:32 +09:00]] 版))
<http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-19>
[3]
[TIME[2015年5月][2015-05]]、
[[IETF]]
[[提案標準]]
[DFN[RFC 7515]]
として出版されました。
[4] [CITE@en[RFC 7797 - JSON Web Signature (JWS) Unencoded Payload Option]]
([TIME[2016-03-31 02:08:14 +09:00]] 版)
<https://tools.ietf.org/html/rfc7797>
[5] [CITE@en[RFC 8055 - Session Initiation Protocol (SIP) Via Header Field Parameter to Indicate Received Realm]]
([TIME[2017-02-03 01:02:37 +09:00]])
<https://tools.ietf.org/html/rfc8055>