2.15. Authentication of the IKE SA (IKE SA の認証)
2.15. Authentication of the IKE SA (IKE SA の認証)
拡張認証を用いない場合 (2.16 節), ピアはデータブロックに署名 (または本節後述のとおりパディング共有秘密を鍵とする MAC) して相互認証する. これらの計算で IDi' と IDr' は固定ヘッダを除く ID ペイロード全体である. レスポンダの場合, 署名対象オクテットは 2 番目のメッセージ (IKE_SA_INIT 応答) ヘッダの最初の SPI の先頭オクテットから最後のペイロードの末尾オクテットまでである. 署名計算のために, イニシエータの nonce Ni (値のみ, ペイロード全体ではない) と prf(SK_pr, IDr') を付加する. Ni と prf(SK_pr, IDr') は送信されない. 同様に, イニシエータは 1 番目のメッセージ (IKE_SA_INIT 要求) に署名し, ヘッダ最初の SPI の先頭から最後のペイロードの末尾までとし, 署名のためにレスポンダの nonce Nr と prf(SK_pi, IDi') を付加する. 各側が相手の nonce に署名することが交換のセキュリティに不可欠である.
イニシエータの署名対象オクテット:
InitiatorSignedOctets = RealMessage1 | NonceRData | MACedIDForI
GenIKEHDR = [ four octets 0 if using port 4500 ] | RealIKEHDR
RealIKEHDR = SPIi | SPIr | . . . | Length
RealMessage1 = RealIKEHDR | RestOfMessage1
NonceRPayload = PayloadHeader | NonceRData
InitiatorIDPayload = PayloadHeader | RestOfInitIDPayload
RestOfInitIDPayload = IDType | RESERVED | InitIDData
MACedIDForI = prf(SK_pi, RestOfInitIDPayload)
レスポンダの署名対象オクテット:
ResponderSignedOctets = RealMessage2 | NonceIData | MACedIDForR
GenIKEHDR = [ four octets 0 if using port 4500 ] | RealIKEHDR
RealIKEHDR = SPIi | SPIr | . . . | Length
RealMessage2 = RealIKEHDR | RestOfMessage2
NonceIPayload = PayloadHeader | NonceIData
ResponderIDPayload = PayloadHeader | RestOfRespIDPayload
RestOfRespIDPayload = IDType | RESERVED | RespIDData
MACedIDForR = prf(SK_pr, RestOfRespIDPayload)
署名の下には本書で定義されていないペイロード型も含めすべてのペイロードが含まれる. 交換の最初のメッセージが複数回送信される場合 (レスポンダ cookie や別の Diffie-Hellman 群など), 署名対象は最新版である.
メッセージ 3 と 4 に, デジタル署名に用いる鍵が ID ペイロードの名前に属することを示す証明書またはチェーンを任意で含めてよい. 署名または MAC は署名者の鍵の種類と Authentication ペイロードの Auth Method フィールドで指定されるアルゴリズムで計算する. イニシエータとレスポンダが同じ暗号アルゴリズムで署名する必要はない. 共有秘密で認証する場合, 両方向で同じ鍵を用いることが多いが必須ではない.
ユーザー選択パスワードのみから共有鍵を導くのは一般的だが通常は安全でない. 辞書攻撃に耐える十分なランダム性がなく, 本認証方式はそれを防がない. (パスワードベース認証でブートストラップと IKE SA を行うアプリケーションは 2.16 節の方式を用いるべきである.) 事前共有鍵は, 交渉される最強の鍵と同程度の予測不能性を持つ必要がある. 事前共有鍵の場合, AUTH は次のように計算する.
イニシエータ:
AUTH = prf( prf(Shared Secret, "Key Pad for IKEv2"),
<InitiatorSignedOctets>)
レスポンダ:
AUTH = prf( prf(Shared Secret, "Key Pad for IKEv2"),
<ResponderSignedOctets>)
文字列 "Key Pad for IKEv2" はヌル終端なしの 17 ASCII 文字である. 共有秘密は可変長でもよい. パスワードから共有秘密を導く場合, IKE 実装は平文パスワードを保持せず prf(Shared Secret,"Key Pad for IKEv2") を保持でき, それは IKEv2 以外ではパスワード相当にならない. パスワードのみからの導出は安全でないが, 実際に行われると想定してこの構成を用いる. 共有秘密を供給する管理インタフェースは少なくとも 64 オクテットの ASCII 文字列を受け付け, 共有秘密として用いる前にヌル終端を付けてはならない. 十六進表現も受け付けなければならない. エンコーディングからバイナリ列への変換アルゴリズムが指定されていれば, 他のエンコーディングも受け付けてよい.
EAP 認証には 2 種類あり (2.16 節), 上記 AUTH 計算で異なる値を用いる. EAP が鍵生成型なら共有秘密の代わりに MSK (master session key) を代入する. 非鍵生成型では, 2 つの AUTH 計算でそれぞれ SK_pi と SK_pr を共有秘密の代わりに用いる.