享受代码,享受人生

SOA is an integration solution. SOA is message oriented first.
The Key character of SOA is loosely coupled. SOA is enriched
by creating composite apps.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

KerberosToken

Posted on 2006-04-25 09:14  idior  阅读(2347)  评论(0编辑  收藏  举报

BinarySecurityToken---KerberosToken

在WS-Security规范出现之前,针对Web Service或者其他的分布式技术并不是没有安全协议来保证它们的安全。只是这些协议一旦跨越了企业边界往往会受到防火墙的影响,而不再起作用。在WS-Security中,并没有抛弃这些现有的协议,而是将这些Binary的Security Token通过Encoding的方式集成到XML元素中,从而在Web Service中仍然能使用这些经典的安全协议,并利用SOAP消息穿越防火墙的特性,使它们适用于新的环境。这类Security Token在WS-Security中被称为BinarySecurityToken,目前仅支持Kerberos和X509v3 Certificate两种,但是利用XML的高度扩展性,用户可以定义自己的BinarySecurityToken。

下面是BinarySecurityToken的标准格式:
<wsse:BinarySecurityToken wsu:Id=...
        EncodingType=...
        ValueType=...>
      ...Binary Data ...
<wsse:BinarySecurityToken/>
其中EncodingType属性指定将Binary数据Encoding到XML中的方法(常用Base64); ValueType属性指定BinarySecurityToken的类型(比如KerberosV5); 元素内容则是经过Encoding的BinaryToken的内容。  

   
Note  Binary数据要嵌入XML时需要经过Encoding,因为其中的某些内容可能不符合XML的语法。

    
KerberosToken

Kerberos协议非常适合用于保证企业内部的安全, 也是获得Windows操作系统良好支持的一套安全协议, 理所当然它也成了WS-Security所支持的Security Token之一.
Kerberos协议的核心功能就是安全的完成了Client与Server之间的共享密钥的发布, 使得原本没有联系的Client和Server能够利用该密钥保证消息的一致性和机密性, 并且实现相互间的身份鉴别. 

   
Note  有关Kerberos协议的原理请参考Kerberos简介一文. 由于采用的是对称密钥技术, 使得Kerberos协议不具有抗否认性的功能.


WSE中目前也提供了对KerberosToken支持,下图为使用KerberosToken来保证消息安全的SOAP Envelop结构。
 
      

Kerberos协议是使用对称密钥技术的代表,消息的签名和加密都依靠对称密钥, 所以其中用到的签名算法必须是MAC(Message Authentication Code), 加密算法也必须是对称加密算法(如AES).

以下是对应于上图具体的SOAP Envelop:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
    <SOAP-ENV:Header>
        <wsse:Security
             xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/secext">
            <wsse:BinarySecurityToken
                   EncodingType="…#Base64Binary"
                   ValueType="…#Kerberosv5_AP_REQ"
                   wsu:Id="kerberosToken">
                     boIBxDCCAcCgAwIBBaEDAgEOogcD...
               </wsse:BinarySecurityToken>
            <ds:Signature>
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod
                        Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                    <ds:SignatureMethod
                        Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"/>
                    <ds:Reference URI="#DiscountRequest">
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>Fd3WSLg5yLsGMP4kPdU...</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>Fsd2h8SsxJwkDiXlJidm5P2k...</ds:SignatureValue>
                <ds:KeyInfo>
                          <wsse:SecurityTokenReference>
                                  <wsse:Reference URI="# kerberosToken "
                                     ValueType="…#Kerberosv5_AP_REQ">
                                  </wsse:Reference>
                          </wsse:SecurityTokenReference>
                   </ds:KeyInfo>
            </ds:Signature>
            <xenc:ReferenceList>
                    <xenc:DataReference URI="#DiscountResponse"/>
            </xenc:ReferenceList>
        </wsse:Security>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body wsu:Id="DiscountedBookingForPartnersResponse">
        <s:GetSpecialDiscountedBookingForPartnersResponse
            xmlns:s="http://www.MyHotel.com/partnerservice">
            <xenc:EncryptedData
                wsu:Id="DiscountResponse"
                type="http://www.w3.org/2001/04/xmlenc#Element">
                <xenc:EncryptionMethod
                    Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
                <ds:KeyInfo>
                          <wsse:SecurityTokenReference>
                                  <wsse:Reference URI="#kerberosToken"
                                    ValueType="…#Kerberosv5_AP_REQ">
                                  </wsse:Reference>
                          </wsse:SecurityTokenReference>
                   </ds:KeyInfo>
                <CipherData>
                <CipherValue>XD6sFa0DrWsHdehrHdhcW0x...</CipherValue>
                </CipherData>
            </xenc:EncryptedData>
        </s:GetSpecialDiscountedBookingForPartnersResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

以上的示例通过KerberosToken实现了用户的身份鉴别,并利用Token中的Session Key签名加密消息,从而保证消息的一致性和机密性。那么如果KerberosToken通过首次的消息交换传递给了Service之后,是否每次仍有必要重复传递一遍呢?当我们利用Kerberos协议完成了密钥的分配之后,能否通过一个约定的名称的定位到之前的Session Key,从而继续利用它来保证消息的安全性而不必重复的发送该KerberosToken。WS-Security协议中为此定义了另一种在签名和加密消息时引用KerberosToken的方法---KeyIdentity.

    
Note读者可以将这里的思路和WS-SecurityConversation协议做一番比较。
 

在完成了首次的KerberosToken的传递之后,在随后的消息交换中可以通过如下的方式引用KerberosToken。

<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
    <SOAP-ENV:Header>
        <wsse:Security  xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/secext">            
            <ds:Signature>
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod
                        Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                    <ds:SignatureMethod
                        Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"/>
                    <ds:Reference URI="#DiscountRequest">
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>Fd3WSLg5yLsGMP4kPdU...</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>                           
                <ds:SignatureValue>
                    Fsd2h8SsxJwkDiXlJidm5P2k...
                </ds:SignatureValue>
                <ds:KeyInfo>
                          <wsse:SecurityTokenReference
                              wsse11:TokenType="…#Kerberosv5_AP_REQ">
                                 <wsse:KeyIdentifier
                                   ValueType="…#Kerberosv5APREQSHA1">
                                   GbsDt+WmD9XlnUUWbY/nhBveW8I=
                                 </wsse:KeyIdentifier>
                          </wsse:SecurityTokenReference>
                   </ds:KeyInfo>
            </ds:Signature>
            <xenc:ReferenceList>
                    <xenc:DataReference URI="#DiscountResponse"/>
            </xenc:ReferenceList>
        </wsse:Security>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body wsu:Id="DiscountedBookingForPartnersResponse">
        <s:GetSpecialDiscountedBookingForPartnersResponse
            xmlns:s="http://www.MyHotel.com/partnerservice">
            <xenc:EncryptedData
                wsu:Id="DiscountResponse"
                type="http://www.w3.org/2001/04/xmlenc#Element">
                <xenc:EncryptionMethod
                    Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
                <ds:KeyInfo>
                          <wsse:SecurityTokenReference    
                             wsse11:TokenType="…#Kerberosv5_AP_REQ">
                                 <wsse:KeyIdentifier ValueType="…#Kerberosv5APREQSHA1">
                                     GbsDt+WmD9XlnUUWbY/nhBveW8I=
                                 </wsse:KeyIdentifier> 
                          </wsse:SecurityTokenReference>
                   </ds:KeyInfo>
                <CipherData>
                     <CipherValue>XD6sFa0DrWsHdehrHdhcW0x...</CipherValue>
                </CipherData>
            </xenc:EncryptedData>
        </s:GetSpecialDiscountedBookingForPartnersResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

  
Note在KeyIdentifier中并没有使用一个简单的名称标识来引用之前的KerberosToken,而是通过之前KerberosToken的摘要( SHA(Encoding(KerberosToken)) )来标识的,此举是为了降低恶意攻击者冒充KerberosToken拥有者的危险。


应用场景: 
由于使用KerberosToken具有SSO(Single Sign On)的功能,并且还可以获得用户和Service之间的相互信任,所以在企业内部广为采用。如银行内部:
      


参考资料:
OASIS Kerberos Token Profile 1.1
Protect Your Web Services Through The Extensible Policy Framework In WSE 3.0


Kerberos简介
系列文章