派生密钥令牌
建立了安全上下文并且建立(认证)了密钥之后,可使用派生密钥来签署和加密 SOAP 消息以提供消息级别保护。然后可将派生密钥用于安全上下文中所用的每个密钥。
可以通过将从安全性令牌派生的对称密钥用于签署和加密应用程序消息,可启用 Web Service Secure Conversation (WS-SecureConversation)。
通过使用 WS-SecureConversation,发起方可使用 Web Service Trust (WS-Trust) 协议与接收方建立安全上下文令牌。安全上下文令牌隐含或包含共享密钥。通过使用公共密钥,可以定义不同的密钥派生。然后,通过使用安全上下文令牌,可使用 <wsc:DerivedKeyToken> 令牌来从具有共享密钥、密钥或密钥材料的任何安全性令牌派生密钥。此密钥可用于签署或加密消息,但建议使用派生密钥来签署和加密只与安全上下文相关联的消息。
<wsc:DerivedKeyToken> 元素的语法
<wsc:DerivedKeyToken> 元素用于指示将从函数生成特定引用的密钥,以便不需要经常交换显式安全性令牌、密钥或密钥材料。派生密钥令牌不支持通过使用密钥标识或密钥名称进行引用。所有引用都必须使用 wsu: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
该现时标志以二进制八位元序列(基本 64 位编码之前的值)的形式表示。现时标志种子是必需的,并且必须由一个或多个通信方生成。使用独立的现时标志和独立生成的密钥来对请求和响应进行签署和加密。应为每条消息派生新的密钥,这意味着不应复用先前的现时标志。
隐式派生密钥生成
隐式派生密钥定义用于引用特定类型的派生密钥的快捷方式机制。确切地说,可将 @wsc:Nonce 属性添加至 WS-Security 规范中定义的安全性令牌引用 (STR)。如果隐式派生密钥存在,那么它表示密钥不在引用令牌中,而是一个从引用令牌的密钥派生的密钥。建议您不要在 <wsc:DerivedKeyToken> 元素中使用隐式派生密钥。
以下示例说明使用两个派生密钥(一个用于签署,另一个用于加密)发送的消息:
<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>