级别: 初级 库 俊国 (kujunguo@cn.ibm.com), 软件工程师, IBM 刘 静 (liujcdl@cn.ibm.com), 软件工程师, IBM
2009 年 3 月 12 日 J2EE 和 .Net 之间的互操作是 web services 互操作的重要组成部分。本文介绍了 WebSphere Application Server(以下称为 WAS) V7.0 下 JAX-WS 编程模型的 web services 和 .NET 平台下的WCF 3.0 services 互操作的基本配置和部署过程。同时以 WS-Secure Conversation 为例,阐述了两个平台下 web services 服务策略配置的不同及注意事项。通过文中实例,您可以了解到配置 web services 互操作应用的一般知识和基本概念。
引言
Web Services 通过一系列的标准技术,已成为企业实现面向服务的体系架构(Service Oriented Architecture,SOA)的首选。它实现了真正意义上的平台无关性和语言独立性。随着 Web Services 的应用越来越广泛,其安全性和互操作性也变得越来越重要。于是关于 Web Services 安全和互操作方面的规范被制定出来并被不断更新。
目前 Web Services 的安全规范有很多,包括 WS-Addressing,WS-Security,WS-Reliable Messaging (WS-RM),WS-Secure Conversation(WS-SC) 等,它们分别从不同的角度和范围来保证 Web Services 的安全性。
由于 Web Services 安全规范涉及到消息的认证机制、机密性和完整性等各个方面,且可选择的余地很大,因此不同应用服务器提供的对 Web Services 安全机制的支持也不尽相同。这样,如何让运行在不同应用服务器环境中的 Web Services 和 Client 之间进行安全地互操作也成为问题。在 J2EE 和微软的 .Net 日益成为两大主流平台的今天,解决它们之间的互操作更是成了众多 web services 互操作标准的重要课题。微软的 Windows Communication Foundation V3.0(以下简称WCF)是一个用于创建和运行分布式系统的技术集合,是微软为 SOA 而设计的一套完整的技术框架,它整合了 .Net 平台下以往全部的分布式开发技术。所以 J2EE 和 .Net 平台的互操作主要是和 .Net 上 WCF 应用的互操作。
为此,专门致力于提高互操作性的组织 Web Services Interoperability (WS-I)提出了一系列概要,包括 WS-I Basic Profile,WS-I Basic Secure Profile 等,表明为实现互操作,开发者及部署者应该如何使用各种 Web Services 标准。WAS V7.0 实现了对 WS-I Basic Security Profile 1.0 的完全支持,以及对 WS-I Basic Security Profile 1.1 的大部分支持。在支持 Web Services 的应用服务器中,WAS 对各种标准的支持是比较全面,比较早的。
WAS V7.0 中包含了一组 Java API for XML-Based Web Services (以下简称JAX-WS) 样本程序,本文通过对样本程序配置Web Service Secure Conversation 安全策略集,展示了如何在 WAS V7.0 和微软的 WCF 之间实现互操作性。
WAS 与 WCF 互操作场景介绍
WAS V7.0 中包含了一组 JAX-WS 样本程序,用以展示同步和异步的 MEPs(simple message exchange patterns)编程模型。这些样本程序支持 SOAP 1.1 和 SOAP 1.2 规范,它们符合 Web Service 的标准,如 WS-Addressing(WS-A), WS-Security,WS-Reliable Messaging (WS-RM),以及 WS-Secure Conversation(WS-SC)。本文将描述如何在 WAS 中配置 WS-SC 策略集和绑定,如何在 WCF 中配置 WS-SC 绑定,然后测试 WAS 和 WCF 的互操作性 (JAX-WS Service 和 WCF Client,以及 JAX-WS Client 和 WCF Service)。
WS-Secure Conversation 概述
WS-Secure Conversation (以下简称 WS-SC)为 Web Service 提供者和请求者之间的消息交换提供了一种安全的会话机制,可以使用对称加密算法进行签名和为消息加密。一般来说,对称的加密算法比不对称算法消耗更少的 CPU 资源,提供更好的性能和吞吐量。
Web Service 安全规范为安全的消息定义了一些基础机制。Web Services Trust(以下简称 WS-Trust)规范规定了如何在通信的双方之间建立并代理安全关系。WS-Trust 规范定义了那些发送到安全令牌服务(security token service)的请求的语法,和安全令牌服务的响应以及后续响应的语法。在 WAS 中,这种安全令牌服务被称为信任服务(trust service)。通过 WS-Trust 规范,一方可以请求信任服务发行安全上下文令牌(SCT),然后这个令牌被用于在双方之间建立一个安全会话(WS-SC)。
建立一个 WS-SC 消息交换,需要两个步骤。第一步被称为引导(bootstrap)。在引导时,Web Service Client 从被 Web Service 信任的安全信任服务处获取一个安全上下文令牌(SCT)。第二步,Client 使用基于这个 SCT 而衍生出的密钥为消息签名和加密,实现与 Web Service 之间安全地交换消息。
在 WAS 下配置 WS-SC QoS
WAS V7.0 支持两种安全会话场景:WS-Secure Conversation 和 WS-Secure Conversation with WS-Reliable Messaging,本文采用第一种场景 WS-SC 实现与微软的 WCF 的互操作。
首先为 WAS 定制一个策略集和绑定,然后为 WCF 定制一个可互操作的绑定,最后使用WAS V7.0 中提供的样本应用程序和 WCF 样本程序来测试双方在应用 WS-SC 后的互操作。
-
如果是 WCF 的 Client 访问 JAX-WS Service,在 WAS 中需要做以下几件事情:
-
准备 JAX-WS Service 需要的证书和密钥库。
-
为安全令牌服务生成一个系统策略集,并配置绑定。WAS V7.0 支持从管理控制台上设置安全策略。通过服务->策略集->系统策略集,我们可以看到 WAS V7.0 缺省定义了一组系统策略集,每个系统策略集由一个或多个策略组成。您可以使用这些已有的系统策略集及其缺省绑定,也可以创建自定义的策略集及自定义的绑定。这里为安全令牌服务使用自定义的策略集,并配置自定义的绑定。
-
为 Web Service 自定义一个策略集,并配置自定义的绑定。在 WAS 管理控制台上,通过服务->策略集->应用程序策略集,可以看到 WAS V7.0缺省定义了一组应用程序策略集。这里为 Web Service 使用自定义的策略集,并配置自定义的绑定。
-
配置 Web Service 的密钥长度。WAS 和 WCF 的签名密钥使用不同的密钥长度,WAS 使用 20 字节长的密钥,WCF 使用 16 字节长的密钥。为实现互操作,需要修改 WAS 中 Web Service 的密钥长度。
-
如果是 JAX-WS Client 访问 WCF 的 Web Service ,在 WAS 中需要做以下几件事情:
-
准备 JAX-WS Client 需要的证书和密钥库。
-
为 Client 自定义一个策略集,并配置绑定。与配置 web Service 的策略集类似,在 WAS 管理控制台上,通过服务->策略集->应用程序策略集,为 Client 定义策略集,可以使用缺省的应用程序策略集,也可以自定义策略集。这里为 Web Service 使用自定义的策略集,并配置自定义的绑定。
-
配置 Client 的密钥长度。如上文所述,为实现互操作,需要修改 WAS 的 Client 的密钥长度。
在 .Net 下配置 WCF WS-SC QoS 简介
-
如果是 WCF Client 访问 JAX-WS Service,在 WCF 中需要做以下几件事情:
-
将证书导入到 Windows 证书库里面。
-
为 WCF Client 定制一个绑定。
-
如果是 JAX-WS Client 访问 WCF Service,在 WCF 中需要做以下几件事情:
-
将证书导入到 Windows 证书库里面。
-
为 WCF Service 定制一个绑定。
这一部分的详细介绍可以参考 Microsoft 的 MSDN 网站。
通过 WS-SC 实现 WAS 与 .Net 间的安全会话
环境安装
首先要安装 WAS 和 .Net 环境
-
安装 WAS V7.0。
-
安装 Microsoft .Net Framework 3.0,参见文后资源链接。
-
安装 Microsoft Windows SDK,参见文后资源链接。
本文提供如下样本程序清单
1. mySysKeys
包括:sender.jks: client 端 keystore、receiver.jks: service 端 keystore、alice-key.p12: 包含 Alice 的私钥、alice-cert: Alice 的证书、bob-key.p12: 包含 Bob 的私钥、bob-cert: Bob 的证书、myca: alice 和 bob 证书的根证书。
2. WCFClient
包括:WSWindowsClient.exe: WCF Web services 客户端程序、WSWindowClient.exe.config: 客户端配置文件、WSWindowsClient.cs: 客户端 C# 源代码。
3. WCFService
包括:WSWindowsService.exe: WCF Web service 端程序、WSWindowService.exe.config: service 端配置文件、WSWindowsService.cs: 服务端 C# 源代码。
4. SC_PolicySets&Bindings
包括:SCCltBinding: JAX-WS 客户端绑定配置、SCCltInterop: JAX-WS 客户端策略集、SCSvcBinding: JAX-WS 服务端的绑定配置、SCSvcInterop: JAX-WS 服务端的策略集、STSBinding: 用于 Trust Service 的绑定、STSInterop: 用于 Trust Service 的策略集。
证书准备
本文沿用安全通信中常用的“Alice<->bob”模式来讲解,即 Alice 作为发送方,bob 作为接收方。证书的制作过程也不在这里详细介绍,大家可以参见 WAS V7 信息中心的ikeyman工具的使用来制作自己的证书。注意,本文提供的证书只用于测试。
为
WCF
应用导入证书
先将所需证书导入到 .Net 所在的 Windows 机器。
1. 从开始菜单运行 mmc 命令,启动管理控制台。
2. 在文件菜单中点“添加管理单元”,在“独立”选项卡上点“添加”,选择“证书”,选择“我的用户帐户”,然后点“完成”。如图 1 所示:
图 1:通过 MMC 控制台导入证书
3. 在上图中,选择证书(当前用户)->个人->证书,右键点击所有任务->导入,将 alice-key.p12 导入,提示密码时,输入 sampleapp。
4. 接下来将 bob-cert.der 导入到证书(当前用户)->受信任人->证书中。
5. 再将 myca.cer 导入到受信任的根证书颁发机构中。
如果您要测试 JAX-WS Client 访问 WCF Service 的例子,还需要完成以下操作:选文件-> 添加管理单元,在“独立”选项卡上点“添加”,选择“证书”->“计算机帐户”,然后点“完成”。按上述步骤,将 bob-key.p12 导入到证书(本地计算机)的个人证书中。将 alice-cert.der 导入到证书(本地计算机)的受信任人的证书中。将 myca.cer 导入到证书(本地计算机)的受信任的根证书颁发机构中。
为 JAX-WS 应用导入证书
对于 JAX-WS Service,需要将 WCF Client 端的 alice 的证书导入到 WAS 端的 keystore 中。本文提供已经导好的 jks 类型的 keystore:receiver.jks,所以只需要将 mySysKeys.zip 拷贝到 WebSphere 服务器端,解开 mySysKeys.zip 到某个目录即可。对于 JAX-WS Client 访问 WCF Service 的情形,需要将 bob 的证书导入到 WAS 端的 keystore 中,本文提供已经导好的 keystore:sender.jks,同样只需要放到 WAS 端某个目录即可。
WCF 和 WAS JAX-WS 互操作的具体配置
以下我们主要讲解 WCF Client 和 JAX-WS Service 互操作的配置过程。对于 JAX-WS Client 访问 WCF Service 的配置不做介绍,读者可以参照本文提供的例子自行测试研究。
WAS 端的 QoS 配置
WAS 端的 QoS 配置由策略集(PolicySet)和绑定(binding)两部分组成。策略集定义了服务特性,绑定则定义了用于这些服务特性的属性值。创建策略集及绑定的常见操作可以参见IBM WebSphere Application Server V7.0 中的 Web Services 安全策略及配置 一文。在 WAS V7.0 的管理控制台中,可以看到本文中提到的用于配置策略集和绑定的菜单项。
图 2. WAS 管理控制台服务配置入口
图 2 是 WAS 管理控制台中关于服务配置的菜单。首先,在服务->策略集->系统策略集下通过复制 TrustServiceSecurityDefault 来创建一个名为 STSInterop 的系统策略集。在创建时,注意将“Attach this policy set in place of the original for all attached applications, services, endpoints, and operations”选框勾上。
然后在服务->信任服务->信任服务连接中,选中“发布令牌”和“更新”令牌,在指定绑定按钮上,选“新建特定于信任服务的绑定”,创建一个名为 STSBinding 的绑定。为该绑定添加 WS-Addressing 和 WS-Security 服务特性。接下来要为该绑定的 WS-Security 配置一些资源。如图 3 所示。
图 3. WS-Security 绑定配置菜单
点击“认证和保护”,进入图 4 所示的面板,可以看到,初始时各项资源的状态都是“未配置”。
图 4. WS-Security 认证和保护初始状态
点 AsymmetricBindingInitiatorSignatureToken0, 将 JAAS login 设为 wss.consume.x509。如图 5 所示。
图 5. 配置认证和保护中的签名令牌
继续点“应用”后,会发现上面的“回调处理程序”变亮,点击进入图 6。
图 6. 配置签名令牌的回调处理程序
对于“证书库”,选择“无”;对于“信任锚库”,点击“新建”,进入图 7 所示界面。
图 7. 配置回调程序所需的密钥库
输入 STSTrustAnchor 作为名称,选用外部密钥库,输入 receiver.jks 所在的全路径,密钥库类型为 JKS,密码为 sampleapp 。点击“确定”后完成。这样我们就已经配好了 AsymmetricBindingInitiatorSignatureToken0。
回到“信任服务连接-> STSBinding -> WS-Security->认证和保护”界面(图 8)。
图 8. 认证和保护主面板中的消息配置栏目
点“request:app_signparts”进入,输入 req-sign-msg-part 作为名称,点击“应用”,进入图 9。
图 9. 配置如何处理已签名消息
再选中 request:app_signparts,点“编辑”,进入图 10 界面。
图 10. 编辑 request:app_signparts
在“变换算法”下面点击“新建”,进入图 11。
图 11. 为 request:app_signparts 添加变换算法
其中,URL 选择http://www.w3.org/2001/10/xml-exc-c14n#。点击“确定”后,回到req-sign-msg-part 界面,进入图 12。
图 12. 添加签名密钥
选中 req-sign-keyinfo,点击“添加”,再“确定”。至此,我们已经配置完毕req-sign-msg-part 。回到“信任服务连接->STSBinding->WS-Security->认证和保护”界面,进入图 13。
图 13. 配置完签名令牌和签名消息资源后的状态
可以看到,我们一共配置了两项签名资源。这样,service 端 bob 就能正确处理 alice 发送的签名过的消息了。
接下来还需要配置加密相关的选项。过程与配置签名类似,我们在此列出主要步骤:
-
在“信任服务连接-> STSBinding -> WS-Security->认证和保护”界面上,选 AsymmetricBindingRecipientEncryptionToken0,确保 JAAS login 设为 wss.comsume.x509。点击“应用”后将产生一个回调处理程序。
-
配置回调处理程序:定制密钥库,同样输入 receiver.jks 所在的全路径和密码,类型为 JKS。提供密钥名称为“cn=bob,ou=myou,o=myco”,别名为 bob。因为 alice 是用 bob 的公钥加密,所以此处配置的是 bob 的私钥信息,用来解密 alice 发来的消息。
-
在“认证和保护”界面中选 Request message signature and encryption protection-> request:app encparts ,输入名称 req-enc-msg-part 。点“应用”。在密钥信息中,选中“req-enc-keyinfo”,点“添加”,最后“确定”。
至此,bob 能正确处理 alice 发来的签名和加密过的消息了。
然后,我们需要配置 response 消息相关的选项,以便 bob 能正确应答 alice ,和上面配置 request 消息类似,我们需要分别配置签名相关的资源和加密相关的资源。同样是在 WS-Security 的“认证和保护”面板中配置,具体过程不再累述,大家可以参照本文提供的配置文件进行操作。
安装和配置 JAX-WS 应用程序
本例中,我们采用的是 WAS 自带的 JAX-WS 样本程序 JaxWSServicesSamples ,在 <WAS_HOME>/samples/lib/JaxWSServiceSamples 下可以找到它的安装包 JaxWSServicesSamples.ear 。在控制台上安装时,注意选中“部署 web service”,其它按默认设置。
安装完毕后,在管理控制台上选服务->服务提供者,可以看到下面图 14 界面。
图 14. JaxWSServiceSamples 中服务提供者列表
可以看到,JaxWSServiceSamples 中一共包含六个 web service,本例中我们只测试 EchoService ,所以下面只讲解如何配置 EchoService 。
先在服务->策略集->应用程序策略集下通过复制 SecureConversation 的方式创建一个自己的策略集,名称为 SCSvcInterop。
然后回到服务->服务提供者界面,选 EchoService 进入,先全选,再点击“连接策略集”,选择 SCSvcInterop,这样 EchoService 将采用 SCSvcInterop 定义的服务特性。
然后在“指定绑定”中新建一个名为 SCSvcBinding 的绑定,为该绑定添加 WS-Addressing 和 WS-Security 。策略集和绑定指定完毕后的界面如图 15。
图 15. 设置过策略集和绑定的 web service
接下来的工作是配置 SCSvcBinding 中的 WS-security 资源,过程同配置 STSBinding 类似,读者可以参照本文提供的配置文件 bindings.xml 自行操作。
至此,WebSphere 应用服务器端的配置完毕,需要重启 server 使之生效。
WCF 客户端的配置
对于WCF应用,Microsoft Windows SDK 提供的程序 svcconfigeditor 可以图形化地配置WCF 应用的各种属性。在 <Microsoft SDKs_HOME>/Windows/v6.0A/bin 启动该程序,打开 WCF 客户端配置文件 WSWindowsClient.exe.config 。显示界面如图 16。
图 16. 用 svcconfigeditor 编辑 WCF 配置文件
下面列出主要配置过程,不一一图解说明。
1. 在左边面板上选 Bindings EchoSOAP(customBinding) ,在右边面板上设置 message version 为 Soap11WSAddressing10。
2. 在左边面板上选 Bindings->EchoSOAP(customBinding) ,右键选“Add Binding Element Extensions…”,在弹出的对话框中选 security,点“add”按钮。
3. 在左边面板上选 Bingdings->EchoSOAP(customBinding) ->security ,添加安全属性:
AuthenticationMode : SecureConversation
Default Algorithm : Basic128Rsa15
MessageSecurityVersion:
WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPo
licy11BasicSecurityProfile10
Require Signature Confirmation : True
SecurityHeaderLayout : Lax
|
4. 在左边面板上选Bingdings->EchoSOAP(customBinding) ->security ->secureConverstaionBootstrap ,在右边设置:
AllowSerializedSigningTokenOnReply : True
AuthenticationMode : MutualCertificate
Default Algorithm : Basic128Rsa15
MessageSecurityVersion :
WSSecurity10WSTrustFebruaryWSSecureConversationFebruary2005WSS
ecurityPolicy11BasicSecurityProfile10
RequireSignatureConfirmation : False
|
5. 在左边面板上选 Advanced-> Endpoint Behaviors, 右键选“New Endpoint Behavior Configuration” ,输入 Client-Cert-Behavior作为名称。再点Client-Cert-Behavior ,右键选“Adding Behavior Element Extension”,在弹出对话框中选 clientCredentials ,点“Add”完成。
6. 在左边面板上选 Advanced-> Endpoint Behaviors->clientCredentials ->clientCertificate,在右边设置:
FindValue: 12
X509FindType: FindBySerialNumber
|
7. 在左边面板上选 Advanced->Endpoint Behaviors->clientCredentials ->clientCertificate ->serviceCertificate->defaultCertificate,在右边设置:
FindValue: 13
StoreName: TrustedPeople
X509FindType: FindBySerialNumber
|
8. 在左边面板上选 Advanced->EndpointBehaviors->clientCredentials ->clientCertificate ->serviceCertificate-> authentication ,在右边设置:CertificateValidationMode :PeerTrust.
9. 在左边面板上选 Client->Endpoints->EchoServicePort ,在右边设置:
Address: http://<hostname>:port/WSSampleSei/EchoService 此处的 hostname 和 port 指向 WebSphere Application Server 端的EchoService。BehaviorConfiguration: Client-Cert-Behavior在 Identity 选项卡中,设置 DNS 为 Bob。
最后保存设置,退出 svcconfigeditor。
测试过程
在 windows 机器上运行 WCF 客户端程序,在命令行下执行 WSWindowClient.exe –e,WCF 客户端将会向 JAX-WS Service 发送一条消息 “HELLO”。如图 17 所示。
图 17. WCF Client 访问 JAX-WS Service 测试过程
在 WebSphere 应用服务器端检查 SystemOut.log ,可以发现 service 端收到消息并返回“JAX-WS==>>HELLO”。当然你也可以通过 -m 选项输入自己的字符串作为消息。通过 –h 可以查看更多选项。
至此,我们验证了 WCF Client 与 JAX-WS Service 之间的交互。如果读者已配置了 WCF Service 和 JAX-WS Client ,则可验证 WCF Service 与 JAX-WS Client 的交互。
结束语
随着 Web Services 的应用越来越广泛,各个对 Web Services 提供支持的应用服务器也越来越重视其互操作性。本文通过实例逐步介绍了如何在 WAS V7.0 和 .Net WCF V3.0 中正确配置 WS-Secure Conversation 安全策略集及其绑定,来实现 .Net WCF client 和 JAX-WS service之间的安全会话。 WAS 和 WCF 互操作的关键是:首先要理解使用的 MEPs,其次是正确配置 Web Service 的策略集和 WCF 绑定。希望本文能够对您有所帮助。
参考资料
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 本文示例代码 | WS_SC.zip | 41 KB | HTTP |
|---|
作者简介  | |  | 库俊国:来自于IBM 中国软件开发中心的 WebSphere Application Infrastructure 团队,从事于 WebSphere Application Server 产品的开发和系统测试工作。对 EJB,Web Services,SOA 等技术有丰富的经验。 |
 | |  | 刘静来自于 IBM 中国软件开发中心的 WebSphere 团队,热衷于其所从事的 WebSphere Application Server 及 WebSphere Extended Deployment 产品的开发和系统测试工作。 |
对本文的评价
|