用消息交换增强ebXML的安全性

1/5/2008来源:Java教程人气:5425


  本文是两篇有关ebxml安全性的文章中的第一篇,主要讨论消息层。假如需要了解对ebXML概念的一般性介绍,以及研究一些基于功能阶段实现普通ebXML交互的全部用例,请参看ebXML简介。本文将重点解释消息级别的安全性和ebXML消息传送(ebMS)的安全策略机制。
  
  本文开头综述了消息层安全性的优势。文中简要讨论了消息层安全性和瞬时套接层安全性之间的区别。在摘要中提出的概念对于理解有关ebMS消息层安全性方面内容的其他部分极为重要。接下来将深入研究如何使用协作协议轮廓(Collaboration PRotocol Profile,CPP)和协作协议协定(Collaboration Protocol Agreement,CPA)来为ebXML消息层描述安全性策略。
  
  什么是消息层安全性?
  
  在实际情况中,大多数ebXML消息都有基于独有XML的消息层安全性需求,包括数字签名、认证、数据私密性、以及内容产生的威胁保护。这些消息层机制提供了超过和在瞬时应用程序层安全性(例如SSL/TLS)之上的保护。实际的ebXML部署利用应用程序层安全性机制和套接层传输机制。
  
  ebXML提供的消息层安全性标准依靠于昂贵的XML安全性操作,例如XML签名和XML加密。尽管两种标准都使用了昂贵的加密处理,但是在这些标准中执行XML处理所需的时间远远超过了执行加密操作所需的时间,因为综合XML解析、转换、模式验证和消息标准化的费用昂贵。本文认为通过将XML处理和加密处理分离到一个安全的、加固的XML网关设施中(XML防火墙),可以实现显著的性能提升并具有安全性优势。
  
  根据普遍存在的价格经济的和受信的传输层机制(例如SSL/TLS或VPN技术)而产生的消息层安全性需求经常使初学者感到困惑。术语消息层安全性是指稳定的安全特性,它适用于任何类型的基于协议的消息交换,不管是通过HTTP、SMTP、FTP或是其他协议。
  
  在消息层安全性的情况中,无论消息单位是XML文件还是二进制附件,它都是经过加密或签名的,或者既经过加密又包含签名的。对于XML文档来说,由于XML的结构化特性,具体的操作可能具有高度的颗粒性。
  
  将消息层安全性应用于有效负荷可以解决传输层机制不能很好处理的安全性问题,例如安全特性的持久性。举例来说,在SSL连接中,安全特性应用于套接字,并且任何写入或者从套接字中读出的数据都是经过加密和验证的。但是,假如将套接字拆开,那么就没有办法辨别来自套接字的部分数据是否应用了安全特性。此外,在多次反射通道的情况中,数据在已经中止SSL连接的任何地方都是清楚地。这种情况称做SSL安全性“鸿沟”,如图1所示:
  
 用消息交换增强ebXML的安全性(图一)

  
图1:SSL安全性鸿沟

  
  消息层安全性机制在ebXML和其他基于XML的Web服务协议中使用广泛。他们帮助为长时间运行的事务或者以多次反射方式涵盖多种域的事务提供持久性认证、数据加密和发送方验证。消息层安全性的用途包括剩余数据保护,即数据经过签名和加密之后再插入到数据库中。
  
  CPP安全策略
  
  为了理解CPP如何描述安全策略,有必要首先检查CPP实例的外部结构。一个CPP实例由五个直接子元素定义,如清单1所示。元素的基数用一个简单的BNF语法描述。加(+)号表示一个或多个,问号(?)表示0或1,星号(*)表示0个或多个,没有符号则表示只能是1个。
  
  清单1:协作协议轮廓(CPP)XML结构
  
  <CollaborationProtocolProfile>
  (<PartyInfo>) +
  (<SimplePart>) +
  (<Packaging>) +
  (<Signature>) ?
  (<Comment>)  *
  </CollaborationProtocolProfile>  不需要考虑清单1中的全部元素。有关ebMS消息层安全性的大部分安全策略信息位于<PartyInfo>元素和<Packaging>元素之中。读者可能注重到清单1的例子中有一个<Signature>元素。这是一个可选的W3C XML Signature,CPP的创建者可以提供它用于验证机制。对CPP来说,通常只有一个签名者,但是CPA假如进行派生则可能有其他签名者。就验证这个目的而言,ebMS对CPP自身和实际的交换信息都利用了XML Signature,熟悉到这一点很重要。接下来两段将叙述<PartyInfo>元素和<Packaging>元素中所内嵌的策略信息。
  
  <PartyInfo>元素
  
  <PartyInfo>元素描述了适用于特定贸易合作伙伴的实现细节。一个CPP可以拥有多个<PartyInfo>元素,因为大型企业可能需要从多个方面以不同的角色和业务来进行描述。<PartyInfo>元素的结构如清单2所示。
  
  清单2 <PartyInfo>的结构。
  
  <PartyInfo>
  (<PartyID>) +
  (<PartyRef>) +
  (<CollaborationRole>) +
  (<Certificate>) +
  (<SecurityDetails>) +
  (<DeliveryChannel>) +
  (<Transport>) +
  (<DocExchange>) +
  (<OverrideMshActionBinding>) *
  </PartyInfo>   用来描绘ebXML事务的安全策略的三个重要子元素是:<Certificate>元素、<CollaborationRole>元素和<DocExchange>元素。目前,<SecurityDetails>元素被用作一个扩展点,不传递直接策略。<Certificate>元素是CPP的中心内容,它是一个包含ebXML事务所用的公钥的X.509认证清单。这种结构很普通,可以在 CPP 里的其他地方引用。<CollaborationRole>元素带有子元素,用于描述原有消息层之外的安全策略项。它可以映射为特定的PKI实现,用于ebXML会话中非透明的(例如:非XML的)有效载荷。
  
  最后,<DocExchange>元素为实际运行时ebXML安全策略奠定基础。这个元素包含了对发送者和接收者的安全策略都很重要的信息。非凡值得注重的是,它定义了三个重要的子元素:<SenderNonRepudiation>、<SenderDigitalEnvelope>和<NamespaceSupported>。清单3直观地展示了这些内容的层次。
  
  清单3 <DocExchange>层次结构
  
  <PartyInfo>
  <DocExchange>
  <ebXMLSenderBinding>
  <SenderNonRepudiation>
  <SenderDigitalEnvelope>
  <NamespaceSupported>
  <SenderNonRepudiation>元素定义了计算XML签名时要用到的参数,其中包括协议(协议通常就是W3C XML签名)、用来排列摘要信息的哈希函数(如SHA-1)、具体的签名算法(如RSA或DSA)、以及一个指向签名所用的X.509证书的引用。以这里,引用可以指向<Certificate>,<PartyInfo>元素的一个直接子元素。
  
  <SenderDigitalEnvelope>参考所使用的加密机制。术语数字信封(digital envelope)源于消息层安全性事实,如ebXML里所用,一般来讲,使用快速的对称密钥(symmetric key)来加密有效载荷,然后依靠接收者的公钥来加密对称密钥,这样更有效率。从这个意义上来讲,原始对称密钥就是被另一个密钥给封住了。对于ebXML,数字信封的推荐机制是XML加密,但也可以被使用二进制机制如S/MIME和PGP/MIME。<SenderDigitalEnvelope>元素指定了协议类型、版本以及所用的加密算法。
  
  最后一个元素,<NamespaceSupported>,可以用来消除XML安全规范的不同版本之间的歧义,如XML签名和SAML。<NamespaceSupported>元素的作用是直接指定相应安全规范的名称空间(因而也指定了版本)。清单4给出了<SenderNonRepudiation>元素和<SenderDigitalEnvelope>元素的一个例子。
  
  清单4 安全策略元素示例
  
  <SenderNonRepudiation>
  <NonRepudiationProtocol>
  http://www.w3.org/2000/09/xmldsig#
  </NonRepudiationProtocol>
  
  <HashFunction>
  http://www.w3.org/2000/09/xmldsig#sha1
  </HashFunction>
  
  <SignatureAlgorithm>
  http://www.w3.org/2000/09/xmldsig#dsa-sha1
  </SignatureAlgorithm>
  
  <SigningCertificateRef certId="CompanyA_SigningCert"/>
  </SenderNonRepudiation>
  
  <SenderDigitalEnvelope>
  <DigitalEnvelopeProtocol version="2.0">
  S/MIME
  </DigitalEnvelopeProtocol>
  
  <EncryptionAlgorithm>
  DES-CBC
  </EncryptionAlgorithm>
  <SenderDigitalEnvelope>
  在清单4中的例子中,发送者支持消息层鉴权的XML签名,使用DSA算法和SHA-1哈希函数进行。对于数据私密性,则使用S/MIME v2.0机制,带有56位CBC模式的DES键。
  
  在这时看来,似乎消息层安全机制所有必需信息都已经被指明了,但还有个问题,那就是如何把这些操作应用到ebMS消息。EbMS规范使用了一个含有几个组成部分的MIME信封。驱动程序包括一些场景,在其中ebMS消息的各个部分被加密或签名。这正是<Packaging>元素的工作。<Packaging>元素描述了需要被签名或被加密的ebMS消息部件,以及无需加密的应该留给别人去修改、更新或改变的部件。
  
  <Packaging>元素
  
  <Packaging>元素描述了ebMS消息的哪些部分要签名和加密,哪些部分不需要。
  
  查看<Packaging>元素是如何工作的。首先请查看ebMS消息的消息结构,它是根据带附件的SOAP协议(SwA)定义的。SwA的结构则是根据一套名为SOAP消息包的MIME包来定义的。每条SwA消息都是一个消息包的集合,主要SOAP有效载荷位于第一个MIME容器里。图2直观地展示了ebMS消息与应用层之间其他部分的关系。
  
 用消息交换增强ebXML的安全性(图二)

  
图2 ebMS消