派生鍵トークン
セキュリティー・コンテキストを確立し、秘密が設定された (認証された) ら、派生鍵を使用して SOAP メッセージの署名と暗号化を行い、メッセージ・レベルの保護を提供することができます。 その後、セキュリティー・コンテキストで使用された各鍵の派生鍵を使用することができます。
セキュリティー・トークンから派生した対称鍵を使用して、Web Services Secure Conversation (WS-SecureConversation) を使用可能にし、アプリケーション・メッセージの署名と暗号化を行うことができます。
WS-SecureConversation を使用することにより、イニシエーターは Web Services Trust (WS-Trust) プロトコルを使用して受信側とのセキュリティー・コンテキスト・トークンを作成できます。 セキュリティー・コンテキスト・トークンは共有秘密鍵を意味するか、共有秘密鍵を含みます。 共通秘密鍵を使用することにより、異なる鍵の派生を定義できます。 次に、セキュリティー・コンテキスト・トークンを使用することにより、共有秘密鍵、鍵、または鍵材料を持つセキュリティー・トークンから鍵を派生させるために、<wsc:DerivedKeyToken> トークンを使用できます。 この秘密鍵を使用してメッセージの署名や暗号化を行うことができますが、セキュリティー・コンテキストとのみ関連付けられているメッセージの署名および暗号化には派生鍵を使用することをお勧めします。
<wsc:DerivedKeyToken> エレメントの構文
<wsc:DerivedKeyToken> エレメントは、特定の参照の鍵が関数から生成され、明示的なセキュリティー・トークン、秘密鍵、または鍵材料をそれほど頻繁に交換する必要がないことを示すために使用します。 派生鍵トークンは、鍵 ID や鍵名を使用した、その派生鍵への参照をサポートしていません。 すべての参照は、wsu:Id 属性の ID を使用するか、またはセキュリティー・コンテキスト・トークン内の <wsc:Identifier> エレメントへの URI 参照 <wsse:Reference> を使用する必要があります。
<wsc:DerivedKeyToken> エレメントの構文は以下のようになります。
<wsc:DerivedKeyToken wsu:Id="...">
<wsse:SecurityTokenReference>...</wsse:SecurityTokenReference>
<wsc:Label>...</wsc:Label>
<wsc:Nonce>...</wsc:Nonce>
</wsc:DerivedKeyToken>
http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk
nonce は、バイナリー・オクテット・シーケンス (Base64 エンコード前の値) として処理されます。 nonce のシードが必要です。また、シードは通信している 1 人以上の通話者により生成される必要があります。 要求および応答の署名と暗号化用に、別々の nonce を使用し、個別に生成した鍵を持ちます。 各メッセージごとに新規の鍵を派生させる必要があります。つまり、前の nonce を再使用してはいけません。
暗黙の派生鍵生成
暗黙の派生鍵 は、特定のタイプの派生鍵を参照するためのショートカット・メカニズムを定義します。 具体的には、@wsc:Nonce 属性を、WS-Security 仕様で定義されているセキュリティー・トークン参照 (STR) に追加することができます。 暗黙の派生鍵が存在する場合、これは、その鍵は参照されるトークン内にはなく、鍵または参照されるトークンの秘密から派生した鍵であることを示します。 <wsc:DerivedKeyToken> エレメントにおける暗黙の派生鍵の使用は、推奨されません。
次の例は、署名用と暗号化用の 2 つの派生鍵を使用して送信されるメッセージを表しています。
<S11:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu="..."
xmlns:xenc="..." xmlns:wsc="..." xmlns:ds="...">
<S11:Header>
<wsse:Security>
<wsc:SecurityContextToken wsu:Id="ctx2">
<wsc:Identifier>uuid:...UUID2...</wsc:Identifier>
</wsc:SecurityContextToken>
<wsc:DerivedKeyToken wsu:Id="dk2">
<wsse:SecurityTokenReference>
<wsse:Reference URI="#ctx2"/>
</wsse:SecurityTokenReference>
<wsc:Nonce>KJHFRE...</wsc:Nonce>
</wsc:DerivedKeyToken>
<xenc:ReferenceList>
...
<ds:KeyInfo>
<wsse:SecurityTokenReference>
<wsse:Reference URI="#dk2"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
...
</xenc:ReferenceList>
<wsc:SecurityContextToken wsu:Id="ctx1">
<wsc:Identifier>uuid:...UUID1...</wsc:Identifier>
</wsc:SecurityContextToken>
<wsc:DerivedKeyToken wsu:Id="dk1">
<wsse:SecurityTokenReference>
<wsse:Reference URI="#ctx1"/>
</wsse:SecurityTokenReference>
<wsc:Nonce>KJHFRE...</wsc:Nonce>
</wsc:DerivedKeyToken>
<xenc:ReferenceList>
...
<ds:KeyInfo>
<wsse:SecurityTokenReference>
<wsse:Reference URI="#dk1"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
...
</xenc:ReferenceList>
</wsse:Security>
...
</S11:Header>
<S11:Body>
...
</S11:Body>
</S11:Envelope>