像本系列前面的文章中讨论的Axis2和Metro Web服务堆栈一样,Apache CXF(您在“ CXF简介 ”中遇到了)支持使用WS-Security SOAP扩展技术来为消息提供全方位的与安全性相关的功能。交流。 与这些其他堆栈类似,CXF使用WS-SecurityPolicy配置WS-Security处理(尽管也可以进行手动配置)。
CXF的实现的WS-Security的是基于开放源码的WSS4J库(见相关主题 )。 这是Axis2代码使用的库,因此,两个堆栈之间的某些WS-Security配置细节相似。 但是,解释WS-SecurityPolicy以配置WSS4J的代码层是不同的。 在Axis2中,它是由单独分发的Rampart模块处理的,而在CXF中,它是由cxf-rt-ws-policy和cxf-rt-ws-security模块(包括在标准cxf- #. jar中,其中#是版本号)。
在本文中,您将看到两个在CXF中配置WS-Security处理的示例。 第一个是简单的UsernameToken
,仅包装纯文本的用户名和密码。 第二个示例使用X.409证书和密钥对邮件进行签名和加密。 这些示例与“ Axis2 WS-Security基础 ”和“ Axis2 WS-Security签名和加密 ”中的Axis2以及“ WS-Security with Metro ”中的Metro所使用的示例相匹配,因此您可以比较技术以查看堆栈之间的差异。 请参阅下载以获取本文的示例代码。
配置基础
WS-SecurityPolicy安全配置详细说明了在客户端和服务之间交换消息所需的安全处理。 在大多数情况下,Web服务堆栈还需要一些其他信息才能将安全性应用于消息交换。 例如,WS-SecurityPolicy可能要求客户端对发送到服务器的请求消息进行签名,从而为服务提供不可否认性。 在这种情况下,客户端Web服务堆栈需要某种方式来标识在向服务发送消息时用于签名的特定私钥。
Axis2和Metro都使用自定义WS-SecurityPolicy扩展来提供这种类型的安全参数。 由于WS-SecurityPolicy通常嵌入在WSDL服务描述中,因此通常需要修改WSDL文档以添加这些详细信息(尽管Axis2允许您直接在客户端代码中设置策略,作为替代方法)。 修改WSDL文档的需求既麻烦又有点违背WSDL的意图,后者旨在充当服务描述。
CXF采用不同的方法-或应该采用不同的方法 -因为在将WS-SecurityPolicy配置应用于消息时,有多种方法可以使用所需的添加参数来配置CXF。 在客户端,您可以直接在客户端代码中或通过使用Spring XML配置文件来执行此操作。 在服务器端,尽管仍然可以在不同类型的文件中进行选择,但始终需要使用XML配置文件。 您将在本文的示例中看到客户端和服务器的这些替代方案如何工作。
CXF中的UsernameToken
UsernameToken
提供了一种使用WS-Security表示用户名和密码对的标准方法。 密码信息可以作为纯文本(通常仅在与传输层安全性[TLS]或WS-Security加密结合使用时用于生产,但便于测试)发送或作为哈希值发送。 除了对许多需要直接认证的应用程序有用之外, UsernameToken
是WS-Security功能的最简单形式,并且为示例提供了一个很好的起点。
要在CXF上实现一个简单的纯文本UsernameToken
示例,您需要一个WSDL服务定义,其中包括适当的WS-Policy / WS-SecurityPolicy配置。 清单1显示了“ CXF简介 ”中使用的基本WSDL服务定义的编辑版本。 清单1包括策略信息,要求在从客户端到服务器的请求上要求UsernameToken
。 <wsdl:binding>
的策略引用以粗体显示,策略本身也以粗体显示。
清单1.纯文本UsernameToken
WSDL
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://ws.sosnoski.com/library/wsdl"
xmlns:wns="http://ws.sosnoski.com/library/wsdl"
xmlns:tns="http://ws.sosnoski.com/library/types"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
<!-- Policy for UsernameToken with plaintext password, sent from client to
server only -->
<wsp:Policy wsu:Id="UsernameToken" xmlns:wsu=
"http://docs.oasis-open.org/wss/2004/01/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>
<!-- Empty <TransportBinding/> element required due to bug in CXF 2.2.6 -->
<sp:TransportBinding/>
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken=".../IncludeToken/AlwaysToRecipient"/>
</wsp:Policy>
</sp:SupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsdl:types>
...
</wsdl:types>
<wsdl:message name="getBookRequest">
<wsdl:part element="wns:getBook" name="parameters"/>
</wsdl:message>
...
<wsdl:portType name="Library">
<wsdl:operation name="getBook">
<wsdl:input message="wns:getBookRequest" name="getBookRequest"/>
<wsdl:output message="wns:getBookResponse" name="getBookResponse"/>
</wsdl:operation>
...
</wsdl:portType>
<wsdl:binding name="LibrarySoapBinding" type="wns:Library">
<wsp:PolicyReference xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
URI="#UsernameToken"/>
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.or