了解 WS-SecureConversation 如何能改善 Web 服務的安全性能
簡介:WS-Security 為 SOAP 消息交換添加了企業級的安全特性,但卻有大量的性能損失。WS-Trust 構建於 WS-Security 基礎上,提供了一種交換安全令牌的方式,WS-SecureConversation 構建於 WS-Security 和 WS-Trust 基礎上,改善了進行中的消息交換的性能。Dennis Sosnoski 將繼續他的 Java Web 服務 專欄系列,本期文章將介紹 WS-Trust 和 WS-SecureConversation。
WS-Security 構建於成熟的密碼學以及 XML 加密及簽名的行業標准基礎上,為 Web 服務應用程序提供了一整套的安全特性。對於很多應用程序,WS-Security 的特性必不可少,但往往要以犧牲性能為代價。本系列之前的文章探討了常見的 WS-Security 配置是如何影響主要的開源 Java™ Web 服務堆棧(Apache Axis2、Metro 和 Apache CXF)的性能的。
WS-Security 之所以常常伴隨性能損失主要是因為大量使用了非對稱加密。正如在 “Axis2 WS-Security 簽名和加密” 一文中討論的,非對稱加密由於可處理密匙對,因此是一種很有用的工具。密匙對中的一個密匙被用來加密另一個密匙能夠解密的消息。密匙對的所有者可以讓一個密匙公開可用以便任何人都能使用它來加密發至此所有者的消息,並且還能解密來自此所有者的消息(由此驗證發送者的身份)。非對稱加密的一個劣勢是與對稱加密相比,它需要更大的密匙大小以及更多的處理負荷,因為對稱加密基於的是只為此次交換中所涉各方所知的單個私密密匙。
WS-SecureConversation 是一種標准,允許對稱加密被用於進行中的客戶機和服務器之間的消息交換,從而消除了非對稱加密增加的負荷。為了保障對稱加密所需的私密密匙信息的安全交換,WS-SecureConversation 構建於 WS-Security 和另一種標准 WS-Trust 的基礎上。WS-Trust 本身基於的是 WS-Security,定義了對發出並處理安全令牌的 Web 服務的接口。
WS-Trust
WS-Trust 綜合了兩個相關函數。第一個函數是為了支持對安全令牌的處理 — 具體而言就是發出、更換以及取消安全令牌。第二個函數是為了支持中介信任關系。這兩個函數看起來雖然不同,但它們之間是相互關聯的,都要求安全令牌必須是可信的,並且信任也必須要以某種形式的令牌表示。
WS-Trust 的核心是一組用來發出、更換、取消以及驗證安全令牌的消息。這些消息可以由客戶機通過調用一種稱為 Security Token Service(STS)的特定類型的 SOAP Web 服務進行交換。它們還可以以其他的方式傳遞(比如以對另外一個服務的請求的安全頭部的形式)。
STS 的基礎知識
STS 是一種 Web 服務,可實現一個由 WS-Trust 規范定義的簡單接口。這個接口允許客戶機使用安全令牌提交對幾種類型操作的請求。由於一個 STS 就是一種 Web 服務,因此 WS-Security 可被直接用在請求和響應消息內,而 WS-SecurityPolicy 則可被用來指定由客戶機提供的憑證的類型或需要在消息上進行的其他的安全性處理。
最基本的一種操作是發出新令牌。清單 1 顯示了為此目的而向一個 STS 發出一個示例請求,這個示例是經過編輯的,其中刪除了各種頭部,只列出請求主體。(稍後您將看到未刪除頭部的示例。)清單 1 所請求的是由 WS-SecureConversation 使用的一種稱為 Security Context Token (SCT) 的特定令牌:
清單 1. 向 STS 請求一個安全令牌
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
...
</soap:Header>
<soap:Body xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd"
wsu:Id="Id-7059772">
<wst:RequestSecurityToken
xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<wst:RequestType>http://.../ws-sx/ws-trust/200512/Issue</wst:RequestType>
<wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:Address>http://localhost:8800/cxf-seismicsc-signencr/</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wst:Lifetime xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsu:Created>2010-05-12T10:33:22.774Z</wsu:Created>
<wsu:Expires>2010-05-12T10:38:22.774Z</wsu:Expires>
</wst:Lifetime>
<wst:TokenType
>http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/sct</wst:TokenType>
<wst:KeySize>128</wst:KeySize>
<wst:Entropy>
<wst:BinarySecret Type="http://docs.oasis-open.org/ws-sx/ws-trust/200512/Nonce"
>kIYFB/u430k3PlOPfUtJ5A==</wst:BinarySecret>
</wst:Entropy>
<wst:ComputedKeyAlgorithm
>http://.../ws-sx/ws-trust/200512/CK/PSHA1</wst:ComputedKeyAlgorithm>
</wst:RequestSecurityToken>
</soap:Body>
</soap:Envelope>
清單 1 的請求主體顯示了用於對 STS 的大多數請求的這個基本的 <wst:RequestSecurityToken> 元素。所需要的 <wst:RequestType> 子元素標識了此請求的特定類型,在本例中,為 Issue 請求。其余的子元素是 Issue 請求的一些可選參數,用來標識:
使用所請求的這個令牌能夠訪問的服務端點(<wsp:AppliesTo> 元素)
此令牌有效的時間區間(<wst:Lifetime> 元素)
令牌的類型(<wst:TokenType> 元素)
所請求的密匙的大小,單位為比特(<wst:KeySize> 元素)
由客戶機提供的用來生成私密密匙的熵數據(<wst:Entropy> 元素)
用來生成私密密匙的算法(<wst:ComputedKeyAlgorithm> 元素)
如果收到此請求的 STS 批准了全部所需的由客戶機提供的憑證並同意了此請求的條款,那麼它就會在對 Issue 請求的響應中返回一個安全令牌。清單 2 顯示了成功響應 Issue 請求的一個例子,其中也刪除了頭部:
清單 2. 以來自 STS 的安全令牌進行響應
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
...
</soap:Header>
<soap:Body xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd"
wsu:Id="Id-4824957">
<wst:RequestSecurityTokenResponseCollection
xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<wst:RequestSecurityTokenResponse>
<wst:RequestedSecurityToken>
<wsc:SecurityContextToken
xmlns:wsc="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512"
xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd"
wsu:Id="sctId-A167EB2B526E0894DA12736604029099">
<wsc:Identifier>A167EB2B526E0894DA12736604029098</wsc:Identifier>
</wsc:SecurityContextToken>
</wst:RequestedSecurityToken>
<wst:RequestedAttachedReference>
<wsse:SecurityTokenReference
xmlns:wsse=".../oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Reference xmlns:wsse=".../oasis-200401-wss-wssecurity-secext-1.0.xsd"
URI="#sctId-A167EB2B526E0894DA12736604029099"
ValueType=".../ws-sx/ws-secureconversation/200512/sct"/>
</wsse:SecurityTokenReference>
</wst:RequestedAttachedReference>
<wst:RequestedUnattachedReference>
<wsse:SecurityTokenReference
xmlns:wsse=".../oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Reference xmlns:wsse=".../oasis-200401-wss-wssecurity-secext-1.0.xsd"
URI="A167EB2B526E0894DA12736604029098"
ValueType=".../ws-sx/ws-secureconversation/200512/sct"/>
</wsse:SecurityTokenReference>
</wst:RequestedUnattachedReference>
<wst:Lifetime xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsu:Created>2010-05-12T10:33:22.909Z</wsu:Created>
<wsu:Expires>2010-05-12T10:38:22.909Z</wsu:Expires>
</wst:Lifetime>
<wst:RequestedProofToken>
<wst:ComputedKey
>http://docs.oasis-open.org/ws-sx/ws-trust/200512/CK/PSHA1</wst:ComputedKey>
</wst:RequestedProofToken>
<wst:Entropy>
<wst:BinarySecret Type="http://docs.oasis-open.org/ws-sx/ws-trust/200512/Nonce"
>DpkK6qcELTO8dlPdDHMi2A==</wst:BinarySecret>
</wst:Entropy>
</wst:RequestSecurityTokenResponse>
</wst:RequestSecurityTokenResponseCollection>
</soap:Body>
</soap:Envelope>
清單 2 中的響應顯示了 <wst:RequestSecurityTokenResponseCollection> 元素包裝了一個 <wst:RequestSecurityTokenResponse> 元素,而後者反過來又包裝了這個響應令牌信息。由於此請求請求的是一個 SCT(如 清單 1 請求消息內的值
<wst:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</wst:TokenType>
所示),因此此響應提供了:
這個實際的 SCT(包裝於 <wst:RequestedSecurityToken> 元素內)
一些引用結構(<wst:RequestedAttachedReference> 和 <wst:RequestedUnattachedReference>)
此令牌有效的時間區間(<wst:Lifetime> 元素)
一個 proof 令牌(<wst:RequestedProofToken> 元素)
由服務器提供的用來生成私密密匙的熵數據(<wst:Entropy> 元素)
此 proof 令牌的內容定義了這個共享的秘密值以用作非對稱加密的基礎。在本例中,該共享的秘密值是通過使用一種確定的算法綜合了由客戶機和服務器提供的熵值生成的。
其他選項
除了 Issue 請求類型外,還可以向 STS 做 Validate、Renew 和 Cancel 請求。這些請求均需要之前已發出的令牌以便引用或提供。它們允許此客戶機驗證此令牌或者請求延長或終止此令牌的有效時間區間。
當只返回單一一個令牌時,來自 STS 的響應可以直接使用 <wst:RequestSecurityTokenResponse> 元素,而不用像 清單 2 所示的那樣將其包裝於 <wst:RequestSecurityTokenCollection> 元素內。對 STS 的請求則可以使用一個 <wst:RequestSecurityTokenCollection> 元素,該元素包裝了任意數量的 <wst:RequestSecurityToken> 元素。
WS-Trust 還允許在 SOAP 消息頭內直接傳輸安全令牌,而不是通過 STS Web 服務接口。如果令牌獲取自一個與服務不在一處的 STS,那麼這將是共享令牌的惟一方式。
WS-SecureConversation
WS-SecureConversation 構建於 WS-Trust 基礎上,使用一個 STS 來管理 SCT。一個 SCT 代表的是在消息交換所涉各方之間共享的上下文,此共享上下文內的信息允許各方使用非對稱加密來確保信息的安全。
特別地,此上下文向消息交換中所涉的各方提供了一個共享的秘密值(如 清單 2 響應消息內所示)。這個共享的秘密值本身可以是在交換過程中用來對消息進行非對稱加密的密匙,但更建議的一種方式是使用這個共享秘密值作為獲取交換中所需的實際私密密匙的基礎值。這看起來雖然有點過於復雜,但卻可以更好地難住那些監視消息交換並試圖破譯密匙的人。
STS 和服務
WS-SecureConversation 在理論上可以用於多方的消息交換,但它最為常見的用法是用在一個客戶機與一個服務器之間的通信。當用在這種配置中時,向客戶機提供 SCT 的這個 STS 與此服務器位於一處,可在相同的端點地址訪問到。這意味著服務器上的 Web 服務代碼需要一種方式來辨別哪些消息是針對 STS 的,哪些消息是針對服務本身;用此請求上的這個動作可服務此目的。
圖 1 展示了這種位於一處的 STS 配置以及消息交換:
圖 1. 與服務位於一處的 WS-SecureConversation STS
當客戶機想要開始與服務器交換消息時,它首先會聯系此 STS 並建立上下文。此消息,如 圖 1 中的消息 1 所示,指定了動作 http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT。此響應,消息 2,則向客戶機提供了此 SCT。上下文在消息 3 中被引用,由它指定與實際的服務應用程序相關的任何動作。在此時間區間內,這個 SCT 在自此客戶機至此服務的任何連續消息中均有效。消息 3 和 4 使用了基於共享秘密的對稱加密,客戶機和服務之間的所有後續消息也是如此。服務應用程序使用由此客戶機提供的上下文引用來直接訪問來自這個上下文(由 STS 保存的)的共享秘密。
WS-Policy 配置
WS-SecureConversation 使用的 WS-Policy 和 WS-SecurityPolicy 配置與本系列之前的文章中討論的基本 WS-Security 處理所使用的配置相似。一個大的區別在於當使用 WS-SecureConversation 時,此策略必須涵蓋兩種不同的交換 — 即客戶機與 STS 之間的交換以及客戶機與實際的服務之間的交換。對於與 STS 之間的交換,可在策略描述中通過使用一個嵌套的策略加以處理,而此策略的主體則用於客戶機與服務之間的交換。
清單 3 顯示了用在本文的示例中的策略:
清單 3. 示例 WS-SecureConversation 策略
<wsp:Policy wsu:Id="SecConv"
xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<wsp:ExactlyOne>
<wsp:All>
<wsap:UsingAddressing xmlns:wsap="http://www.w3.org/2006/05/addressing/wsdl"/>
<sp:SymmetricBinding>
<wsp:Policy>
<sp:ProtectionToken>
<wsp:Policy>
<sp:SecureConversationToken sp:IncludeToken=".../AlwaysToRecipient">
<wsp:Policy>
<sp:RequireDerivedKeys/>
<sp:BootstrapPolicy>
<wsp:Policy>
<sp:AsymmetricBinding>
<wsp:Policy>
<sp:InitiatorToken>
<wsp:Policy>
<sp:X509Token sp:IncludeToken=".../AlwaysToRecipient">
<wsp:Policy>
<sp:RequireThumbprintReference/>
</wsp:Policy>
</sp:X509Token>
</wsp:Policy>
</sp:InitiatorToken>
<sp:RecipientToken>
<wsp:Policy>
<sp:X509Token sp:IncludeToken=".../IncludeToken/Never">
<wsp:Policy>
<sp:RequireThumbprintReference/>
</wsp:Policy>
</sp:X509Token>
</wsp:Policy>
</sp:RecipientToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:TripleDesRsa15/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:IncludeTimestamp/>
<sp:OnlySignEntireHeadersAndBody/>
</wsp:Policy>
</sp:AsymmetricBinding>
<sp:SignedParts>
<sp:Body/>
<sp:Header Name="To" Namespace=".../addressing"/>
<sp:Header Name="From" Namespace=".../addressing"/>
<sp:Header Name="FaultTo" Namespace=".../addressing"/>
<sp:Header Name="ReplyTo" Namespace=".../addressing"/>
<sp:Header Name="MessageID" Namespace=".../addressing"/>
<sp:Header Name="RelatesTo" Namespace=".../addressing"/>
<sp:Header Name="Action" Namespace=".../addressing"/>
</sp:SignedParts>
<sp:Trust13>
<wsp:Policy>
<sp:MustSupportIssuedTokens/>
<sp:RequireClientEntropy/>
<sp:RequireServerEntropy/>
</wsp:Policy>
</sp:Trust13>
</wsp:Policy>
</sp:BootstrapPolicy>
</wsp:Policy>
</sp:SecureConversationToken>
</wsp:Policy>
</sp:ProtectionToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic128Rsa15/>
</wsp:Policy>
</sp:AlgorithmSuite>
</wsp:Policy>
</sp:SymmetricBinding>
<sp:EncryptedParts>
<sp:Body/>
</sp:EncryptedParts>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
在 清單 3 中,外面的策略指定了使用對稱加密(<sp:SymmetricBinding>)來加密正在交換中的消息的主體(<sp:EncryptedParts> 設置,臨近清單底部)。在對稱加密策略內,<sp:ProtectionToken> 以及嵌套的 <sp:SecureConversationToken> 元素表明該 WS-SecureConversation 將被用來執行對稱加密。
當 STS 被訪問時應用的策略是由嵌套在 <sp:SecureConversationToken> 內的 <sp:BootstrapPolicy>(如加粗部分所示)定義的。這個策略只指定了消息主體以及地址頭的簽名使用 X.509 證書,與本系列前期文章中使用的簽名類型相同。
請注意,客戶機與 STS 之間交換的消息在策略使用時,並未加密。這就使得我們更容易了解所發生的事情,但是對於實際使用,您可能想要使用 TLS/SSL 傳輸加密或者 WS-Security 加密來保護這次交換。
消息交換
清單 4 顯示了消息 1 和 2 的頭部 — 分別為對 STS 的請求以及對客戶機的響應。(在 清單 1 和 清單 2 中,您已經看到過這些消息的主體。)
清單 4. STS 請求和響應的頭部
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<Action xmlns="http://www.w3.org/2005/08/addressing"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-32320445"
>http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/SCT</Action>
<MessageID xmlns="http://www.w3.org/2005/08/addressing"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-2673180"
>urn:uuid:24ce01d5-3c17-4df6-ad89-2fc0720152cd</MessageID>
<To xmlns="http://www.w3.org/2005/08/addressing"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-5132526"
>http://localhost:8800/cxf-seismicsc-signencr/</To>
...
<wsse:Security xmlns:wsse="...wssecurity-secext-1.0.xsd" soap:mustUnderstand="1">
<wsse:BinarySecurityToken xmlns:wsse="...wssecurity-secext-1.0.xsd"
xmlns:wsu="...wssecurity-utility-1.0.xsd"
EncodingType="...soap-message-security-1.0#Base64Binary"
ValueType="...x509-token-profile-1.0#X509v3"
wsu:Id="CertId-CF15C330C32618BF4912736604028486"
>MIICo...8/0n33w==</wsse:BinarySecurityToken>
<wsu:Timestamp xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-7">
<wsu:Created>2010-05-12T10:33:22.831Z</wsu:Created>
<wsu:Expires>2010-05-12T10:38:22.831Z</wsu:Expires>
</wsu:Timestamp>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-8">
<ds:SignedInfo>
...
<ds:Reference URI="#Id-7059772">
...
</ds:Reference>
...
<ds:Reference URI="#Timestamp-7">
...
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>TYIbt...V0dd8=</ds:SignatureValue>
<ds:KeyInfo Id="KeyId-CF15C330C32618BF4912736604028487">
<wsse:SecurityTokenReference xmlns:wsse="...wssecurity-secext-1.0.xsd"
xmlns:wsu="...wssecurity-utility-1.0.xsd"
wsu:Id="STRId-CF15C330C32618BF4912736604028488">
<wsse:Reference xmlns:wsse="...wssecurity-secext-1.0.xsd"
URI="#CertId-CF15C330C32618BF4912736604028486"
ValueType="...x509-token-profile-1.0#X509v3"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</soap:Header>
<soap:Body xmlns:wsu="..." wsu:Id="Id-7059772">
...
</soap:Body>
</soap:Envelope>
soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<Action xmlns="http://www.w3.org/2005/08/addressing"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-33522601"
>http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTR/SCT</Action>
<MessageID xmlns="http://www.w3.org/2005/08/addressing"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-9229531"
>urn:uuid:d9d1b9b2-a864-446b-ab81-3176f868046e</MessageID>
<To xmlns="http://www.w3.org/2005/08/addressing"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-25551189"
>http://www.w3.org/2005/08/addressing/anonymous</To>
<RelatesTo xmlns="http://www.w3.org/2005/08/addressing"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-32148925"
>urn:uuid:24ce01d5-3c17-4df6-ad89-2fc0720152cd</RelatesTo>
<wsse:Security xmlns:wsse="...wssecurity-secext-1.0.xsd" soap:mustUnderstand="1">
<wsu:Timestamp xmlns:wsu=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssecurity-utility-1.0.xsd"
wsu:Id="Timestamp-7">
<wsu:Created>2010-05-12T10:33:22.913Z</wsu:Created>
<wsu:Expires>2010-05-12T10:38:22.913Z</wsu:Expires>
</wsu:Timestamp>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-8">
<ds:SignedInfo>
...
<ds:Reference URI="#Id-4824957">
...
</ds:Reference>
...
<ds:Reference URI="#Timestamp-7">
...
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>tr1tx...GY4wk=</ds:SignatureValue>
<ds:KeyInfo Id="KeyId-A167EB2B526E0894DA127366040291811">
<wsse:SecurityTokenReference xmlns:wsse="...wssecurity-secext-1.0.xsd"
xmlns:wsu="...wssecurity-utility-1.0.xsd"
wsu:Id="STRId-A167EB2B526E0894DA127366040291812">
<wsse:KeyIdentifier EncodingType="...soap-message-security-1.0#Base64Binary"
ValueType="...soap-message-security-1.1#ThumbprintSHA1"
>uYn3PK2wXheN2lLZr4n2mJjoWE0=</wsse:KeyIdentifier>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</soap:Header>
<soap:Body xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-4824957">
...
</soap:Body>
</soap:Envelope>
在 清單 4 中,可以看到此證書從客戶機發送到了服務器,並且此證書引用被返回給客戶機,且每個方向上的證書被用來驗證時間戳和消息主體的簽名。對於這種策略配置,客戶機證書需要受此 STS 信任,且此 STS 證書必須存在於此客戶機的可信存儲內。
清單 5 顯示了使用了 WS-SecureConversation 的客戶機與服務之間的消息交換(經大量編輯後的):
清單 5. 對服務的請求以及對客戶機的響應
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<Action xmlns="http://www.w3.org/2005/08/addressing">urn:matchQuakes</Action>
<MessageID xmlns="http://www.w3.org/2005/08/addressing"
>urn:uuid:c724a446-4375-4e8a-a318-fd3c84510eae</MessageID>
...
<wsse:Security xmlns:wsse="...wssecurity-secext-1.0.xsd" soap:mustUnderstand="1">
<wsc:SecurityContextToken xmlns:wsc=".../ws-secureconversation/200512"
xmlns:wsu="...wssecurity-utility-1.0.xsd"
wsu:Id="sctId-A167EB2B526E0894DA12736604029099">
<wsc:Identifier>A167EB2B526E0894DA12736604029098</wsc:Identifier>
</wsc:SecurityContextToken>
<wsc:DerivedKeyToken xmlns:wsc=".../ws-secureconversation/200512"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="derivedKeyId-9">
<wsse:SecurityTokenReference xmlns:wsse="...wssecurity-secext-1.0.xsd">
<wsse:Reference xmlns:wsse="..." URI="#sctId-A167EB2B526E0894DA12736604029099"
ValueType="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/sct"/>
</wsse:SecurityTokenReference>
<wsc:Offset>0</wsc:Offset>
<wsc:Length>16</wsc:Length>
<wsc:Nonce>AyUGKYBNNQstD9EmZUJqlA==</wsc:Nonce>
</wsc:DerivedKeyToken>
<wsc:DerivedKeyToken xmlns:wsc=".../ws-secureconversation/200512"
xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="derivedKeyId-11">
...
</wsc:DerivedKeyToken>
<xenc:ReferenceList xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:DataReference URI="#EncDataId-12"/>
</xenc:ReferenceList>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-10">
<ds:SignedInfo>
...
<ds:Reference URI="#Id-28812627">
...
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>6NHo8Si1ntZIb2Ivg3S/n1+2uzI=</ds:SignatureValue>
<ds:KeyInfo Id="KeyId-CF15C330C32618BF4912736604029689">
<wsse:SecurityTokenReference xmlns:wsse="..." xmlns:wsu="..."
wsu:Id="STRId-CF15C330C32618BF49127366040296810">
<wsse:Reference xmlns:wsse="..." URI="#derivedKeyId-9"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</soap:Header>
<soap:Body xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-28812627">
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" ...>
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<wsse:SecurityTokenReference xmlns:wsse="...wssecurity-secext-1.0.xsd">
<wsse:Reference xmlns:wsse="..." URI="#derivedKeyId-11"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>+krS8lGA...CKSN0fwKR36Q==</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<Action xmlns="http://www.w3.org/2005/08/addressing"
>http://ws.sosnoski.com/seismic/wsdl/SeismicInterface/quakeResponse</Action>
<MessageID xmlns="http://www.w3.org/2005/08/addressing"
>urn:uuid:c3aa0671-8751-4d6b-8d4c-0e37ce3e394a</MessageID>
<To xmlns="http://www.w3.org/2005/08/addressing"
>http://www.w3.org/2005/08/addressing/anonymous</To>
<RelatesTo xmlns="http://www.w3.org/2005/08/addressing"
>urn:uuid:c724a446-4375-4e8a-a318-fd3c84510eae</RelatesTo>
<wsse:Security xmlns:wsse="...wssecurity-secext-1.0.xsd" soap:mustUnderstand="1">
<wsc:DerivedKeyToken xmlns:wsc="...ws-secureconversation/200512"
...
</wsc:DerivedKeyToken>
<wsc:DerivedKeyToken xmlns:wsc="...ws-secureconversation/200512"
...
</wsc:DerivedKeyToken>
<xenc:ReferenceList xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:DataReference URI="#EncDataId-12"/>
</xenc:ReferenceList>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-10">
<ds:SignedInfo>
...
<ds:Reference URI="#Id-10766816">
...
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>rU6YoV7BiO0qSQjWw2vwCp9R+fg=</ds:SignatureValue>
<ds:KeyInfo Id="KeyId-A167EB2B526E0894DA127366040304813">
<wsse:SecurityTokenReference xmlns:wsse="...wssecurity-secext-1.0.xsd" ...>
<wsse:Reference xmlns:wsse="..." URI="#derivedKeyId-9"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</soap:Header>
<soap:Body xmlns:wsu="...wssecurity-utility-1.0.xsd" wsu:Id="Id-10766816">
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" ...>
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<wsse:SecurityTokenReference xmlns:wsse="...wssecurity-secext-1.0.xsd">
<wsse:Reference xmlns:wsse="..." URI="#derivedKeyId-11"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>Cl0iUu...TJ6WkZl2A==</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</soap:Body>
</soap:Envelope>
在 清單 5 中, SecurityContextToken 被包括於每個消息的頭部,並由 <wsc:DerivedKeyToken> 元素引用,這些元素給出了獲得實際用於簽名並加密數據的那些私密密匙所需的參數。
結束語
至此,您已經了解了 WS-Trust 和 WS-SecureConversation 的基礎知識,本系列的下一篇文章將會談論 Apache Axis2、Metro 和 Apache CXF Web 服務堆棧上的 WS-SecureConversation 帶來的性能益處。並且在獲得此性能成果的過程中,您還將看到在這三個堆棧上配置 WS-SecureConversation 的細節。