引言
web 服务是一些虚拟软件组件,可以通过各种协议和格式对它进行访问和调用。这些组件所处的环境各不相同且是分布式的。因此,需要一个安全通信基础架构来确保这些组件之间的消息(和内容)的安全性。
web 服务安全性(web services security ,ws-security 或 wss) 十分灵活,可以将它设计成一个基础平台,可以在此平台上构建各种安全模型,包括公钥基础架构(pki)、kerberos 和安全套接字层(ssl)。特别是,ws-security 支持多种安全性令牌、多种信任域、多种签名格式以及多种加密技术。
这个规范提供了三种主要机制:
安全性令牌传播
消息完整性
消息机密性。
这些机制本身并不提供完整的安全性解决方案。相反,ws-security 是一个构件,它可以与其他的 web 服务扩展及更高层的特定于应用程序的协议一起使用,从而提供各种各样的安全性模型和加密技术。这些机制可以独立使用(例如,用于传递安全性令牌),也可以非常紧密地集成在一起(例如,签名和加密消息,以及提供与用于签名和加密的密钥相关联的安全性令牌层次)。
本文假定您具有一定的 web 服务、j2ee 技术及 websphere® application server v5.0.2 的基本知识。通过阅读本文,您将会理解如何在现有的基础架构上使用 ws-security,同时也将了解一种声明性的编程模型,即 websphere application server v5.0.2 提供保护应用程序的通信基础架构。
websphere application server v5.0.2 中的 ws-security
websphere application server v5.0.2 通过一种声明性模型来使用 ws-security。这种模型的创建和修改可以通过 websphere studio application developer version 5.1、websphere application server v5.0.2 中可用的应用服务器工具包(astk)或 websphere 管理控制台来完成。为了更深地理解这一技术,我们将在此描述一下手动过程。
可以传播的安全性令牌是 username 令牌、基于 x.509 的证书以及轻量级第三方验证(ltpa);同时还有一个 api 来为用户定义的令牌提供插件。消息完整性是由基于 pki 的数字签名提供的(目前还不支持对称密钥签名),而消息机密性是由 xml 加密法提供的。
websphere 安全性处理程序通过读取已声明的部署扩展来获取配置和实施 ws-security 基础架构,如图 1 所示。它们被实现为基于 websphere 运行时的 jax-rpc 处理程序,并且对于应用程序开发人员是透明的。

样本帐户服务
websphere application server v5.0.2 有一种方便而强大的方式来启用 ws-security,从而为应用程序的通信链路提供 mls。它可以让您获取现有的任何服务的 web 服务描述语言(wsdl),并为您提供必要的 ws-security 扩展和绑定来保护 web 服务客户端和服务器之间的消息。
本文假定已经有了一个要应用 ws-security 必须启用的 web 服务。这里使用的示例服务是 accountservice,它是由一个假设的银行(somebank)提供的。
accountservice 是一个简单的 web 服务;出于演示的目的,它并没有执行真正的业务处理。它包含一个简单的操作 accountenquiry,这一操作获取 accountrequest 消息并返回 accountresponse 消息。accountrequest 消息包含有 accountid 和 accounttype 信息。accountresponse 包含有帐户信息传递之后的结算。accountenquiry 操作并没有执行任何基于请求消息的处理,而是返回一个固定的结算值 12345.0。然而,这些消息是很重要的,因为我们将要使用 tcpmon(一个真正监听消息的实体)来监控它们在线路中传送的情况――首先看采用不安全的消息格式的情况,然后再看具有各种 ws-security 配置的情况。
为了演示的方便,我们在服务中将 accountenquiry 操作作为四个独立的端口公开;配置 ws-security 之后就会使用这些端口。然而,对于不安全的服务来说,所有的端口都是相类似的。在为 accountservice 配置 ws-security 时会讨论这些端口。
我们先来安装 accountservice 和它的客户端。
安装和运行不安全的服务
要安全和测试不安全的 accountservice,您需要执行以下的操作:
下载 wss-sample.zip 文件并将其解压到一个临时文件夹中。
使用 websphere 管理控制台来安装企业应用程序 accountservice(即 somebankservice.ear 文件)。可在 code/service 目录下安装。请确保选择的是缺省的选项,并在安装后保存配置。
使用控制台来启动企业应用程序。
打开一个浏览器,访问 http://localhost:9080/somebankservice/services/somebankport 来测试服务是否可用 。如果您得到消息“and now ... some services”,就表明您已经成功地配置了 somebank accountservice。
您还可以访问 http://localhost:9080/somebankservice/services/somebankport?wsdl 来检查 accountservice wsdl 是否可用。该 wsdl 必须和附录所示的 wsdl 相类似。
安装和运行不安全的客户端
要安装 accountservice 的客户端,您需要执行以下的操作:
使用 websphere 管理控制台来安装 web 应用程序(即 somebankclient.war 文件)。可在 code/client 目录下安装。在安装 war 文件时,请确保在 web 模块中键入 context root。请选择缺省值,并在安装后保存配置。
使用控制台启动 web 应用程序。
打开一个浏览器,访问 http://localhost:9080/<context-root> 来测试一下客户端是否正确安装。
您将会看到图 2 所示的屏幕。

客户端的缺省选择是可用的,可以用它们来测试刚刚安装的 accountservice。单击 submit,您将会看到如图 3 所示的结果页面。

现在我们已经成功地安装了服务和客户端,现在让我们回顾一下客户端的输入选项:
account id and account type: 这些是虚构的输入,因为服务响应是固定的。但是它们也是重要的,因为在您使用 tcpmon 来监控消息时您将会看到它们。
message encryption: 在配置 ws-security 之后打开线路中的消息的 xml 加密,从而提供消息的机密性。
message signing:在配置 ws-security 之后打开线路中的消息的 xml 数字签名,从而提供消息的完整性。
service port:指向基于 http 的端口,在这一端口中服务是可用的。您可以使用这一选项来指向一个 tcpmon 代理端口(将在下面讨论),以便观察 web 服务请求和响应消息。
transport protocol:用于选择是否使用 ssl。如果选中 https,则客户端就会被局限于使用 websphere 内部 ssl 端口 9443。显然,如果这样选择的话,tcpmon 就不能够在线路中观察消息了。
因此,同时使用 mls 和 tls 来配置安全性选项时会有八种组合,由以下选项构成:
xml 加密 [启用/禁用]
数字签名 [启用/禁用]
ssl [启用/禁用]。
这使得客户端具有足够多的选择来观察 ws-security 机制。
使用 tcpmon 来观察消息
tcpmon 是 websphere application server v5.0.2 附带的一个实体。通过代理端口,tcpmon 可以用于查看和检查 soap 消息(请求和响应)。
要配置 tcpmon 以便在不安全的场景中监控消息,您需要执行以下的操作:
检查 <was_home>/bin 目录中是否有一个 tcpmon.bat 文件。如果有,则直接执行步骤 3。
将清单 1 复制和粘贴到一个文件中,从而创建 tcpmon.bat 文件。
清单 1. tcpmon.bat 的源代码
@rem copyright ibm corp. 2002 ,2003
@setlocal
@echo off
set console_encoding=-dws.output.encoding=console
call "%~dp0setupcmdline.bat"
"%java_home%/bin/java" %console_encoding% "-
dws.ext.dirs=%was_ext_dirs%;%was_user_dirs%" -classpath
"%was_home%"/lib/webservices.jar;"%was_classpath%";"%classpath%"
com.ibm.ws.bootstrap.wslauncher com.ibm.ws.webservices.engine.utils.tcpmon
@endlocal
运行 tcpmon.bat 程序,您将会看到图 4 所示的屏幕。

在 listen port # 字段中键入可用的端口(例如,9999)。
在 target hostname 字段中键入 localhost。
在 target port # 字段中键入 9080。
单击 add,这样就会显示一个面板,该面板监听端口 9999 并将请求转发给 localhost:9080。
现在,请切换到显示 accountservice 客户端的浏览器,在 service port 字段中键入端口 9999。单击 submit。
account service 客户端具有如上所述的行为。在 tcpmon 面板中,请注意请求(上面板)和响应(下面板)消息,如图 5 所示。

请仔细观察这些消息,特别是 soap 头部和主体。找出请求的 soap 主体,
闽公网安备 35060202000074号