作者:Anbarasu Krishnaswamy
大多数用户是最先考虑安全性的。随着越来越多的用户使用Web services,他们发现需要去了解怎样保护Web services,以及应当使用哪种认证机制。为了保持Web services的开放性以及支持多客户类型,必需了解如何处理Web services的安全性。
这篇文章关注WebLogic上的Web services的安全。 我将解释在WebLogic上是如何保护Web services,如何进行认证工作,以及该如何在各种不同的程序语言中发展客户端认证WebLogic的Web services。
WebLogic的Web Service组件
位于WebLogic Server的Web services是使用例如EJBs和JMS这样的标准
J2EE组件来实现的,并且作为标准J2EE企业应用打包。WebLogic的Web services使用简单对象
存储协议(SOAP) 1.1作为消息格式以及使用HTTP 1.1作为连接协议。
Web services runtime 组件是一组servlets,并且相关联的基础结构必须创建一个Web service。runtime的一个元素是一组用来处理来自客户端的SOAP请求的servlets。这些servlets被包含在WebLogic Server分布中。runtime的另一个元素是一个Ant任务,它用来生成和装配WebLogic web service的所有组件。
WebLogic的Web services作为标准的J2EE企业应用打包,它由下列具体组件组成:
一个Web应用系统,该应用至少要包括一个servlet,它用来从客户端发送并接收SOAP消息。它自动包括并作为Web services开发过程的一部分。
一个无状态会话EJB,它实现一个RPC-style(远程程序调用(RPC)类型)Web service或是实现了一个消息类型(message-style)的Web service的JMS监听器(例如消息驱动bean)。
在RPC-style Web service中,无状态会话EJBs可能要做所有Web service的工作,或者它们可能会将工作分配给其他的EJBs。Web service实现器决定使用哪些EJBs。在message-style Web service中,一个J2EE对象(典型的为一个消息驱动bean)从JMS的destination处得到消息并且处理它们。
WebLogic的Web services作为企业档案文件打包(.ear),它包括Web应用程序的Web档案文件(.war) 以及EJB档案文件(.jar)。
保护 WebLogic的Web services
由于WebLogic的Web services作为标准的J2EE企业应用打包,通过保护一些或所有下列组成Web service的标准J2EE组件,使得访问一个Web service可能是安全的:
SOAP servlets
以一个RPC-style Web service为基础的无状态会话EJB
基本HTTP认证或SSL(Secure Sockets Layer,安全套接字层)可以用来鉴别试图访问WebLogic的Web service的客户端。因为前面讲的组件是标准的J2EE组件,它们可以使用标准J2EE安全程序来保护。
保护MESSAGE-STYLE WEB SERVICES
message-style Web service可以通过保护在客户端和
服务器端之间处理SOAP消息的SOAP servlet来保障其安全。当通过手工的或通过使用wsgen Ant任务装载Web service时,你可以参考Web应用程序的web.xml文件中的SOAP servlets。这些servlets处理在WebLogic Server和客户端应用程序之间传送的SOAP消息。它们总是被部署在WebLogic Server上,并且被其他所有部署在WebLogic上的Web services所共享。
图1 HTTP1.1 询问响应确认
一个Web service所参照的特定的SOAP servlet依赖于它的类型(RPC-style 或 message-style)。下面列出了每个SOAP servlet 的描述:
weblogic.soap.server.servlet.DestinationSendAdapter : 在message-style Web service中处理SOAP消息,它从客户端应用程序接收数据并发送它到JMS的destination。
weblogic.soap.server.servlet.QueueReceiveAdapter : 在message-style Web service中处理SOAP消息,它从一个JMS队列发送数据到客户端应用程序。
weblogic.soap.server.servlet.TopicReceiveAdapter : 在message-style Web service中处理SOAP消息,它从一个JMS主题发送数据到客户端应用程序。
weblogic.soap.server.servlet.StatelessBeanAdapter : 在RPC-style Web service和客户端应用程序之间处理SOAP消息。
例如,在一个message-style的Web service中客户端应用程序发送数据到一个JMS的destination,处理SOAP消息的SOAP servlet是weblogic.soap.server.servlet.-DestinationSendAdapter。wsgen Ant任务把在Listing 1中所列出的元素添加到该Web应用程序的web.xml部署描述符中。
为了限制访问DestinationSendAdapter 的SOAP servlet,你首先要定义一个角色(role),其映射到安全领域中定制的一个或多个规则,然后通过在Web应用程序的web.xml部署描述符中添加下列url-pattern元素到web-resources-collection元素中,来将安全约束应用于这个SOAP servlet上。
/sendMsg保护一个RPC-STYLE的WEB SERVICE
你可以通过限制访问用于实现Web service 或SOAP servlet的无状态会话EJB来限制访问RPC-style的Web service。
Listings 2 和 3显示了如何建立web.xml 和 weblogic.xml文件来保护SOAP servlets。确定WSDL文件仍然可以由客户端访问。确保避免使用通配符定制;而使用保护SOAP servlet适配器的明确路径。这两个列表提供了一个如何保护客户经理的Web service例子。正如你所看见的,role被定义在web.xml中并且它和在这个领域里的组相关联。
WEB SERVICES客户端
为了了解Web Services客户端的安全如何处理,必需要了解SOAP和HTTP认证是如何工作的。
SOAP认证
Web Service使用SOAP协议,高端消息协议实现了一些基础的传送机制。Web services安全仍然是一个新兴的领域,围绕着SOAP规范有一些扩展用来支持安全特征。目前,为了认证,SOAP使用下层传输协议基础结构。因此WebLogic Server SOAP 间接的使用HTTP 1.1 认证。
HTTP 认证
对于用户认证方法使用HTTP是相当简单的。由于HTTP是一个无状态协议,就是说一旦请求完成,服务器不用记住关于请求的信息,因此每次请求时浏览器需要重新发送用户名和密码。
第一次访问认证资源,服务器将返回一个401状态("Unauthorized")并且包括一个WWW-认证响应的头部,它将指出域名和使用的是哪种认证方案。然后浏览器应该让用户输入用户名和密码。然后再次请求同样的资源,这次包括一个认证头部它包含方案名称("Basic")和输入的用户名和密码。
服务器检查用户名和密码,如果正确,返回页面。如果这个用户的密码不正确,或这个用户无权访问,服务器像前面那样返回一个401状态。然后浏览器可以让用户重新输入用户名和密码。
假定用户名和密码是正确的,下一步用户可能请求一个受保护的资源。这种情况,服务器将响应一个401状态,并且浏览器可以再发送一次带有用户和密码详细资料的请求。这样将会很慢,所以浏览器在后面的请求上只发送认证头部。关于HTTP认证地更详细地情况请参看W3C HTTP Working Group RFC 2617 (www.w3c.org/Protocols/Specs.html )。
客户端类型
尽管前面的部分集中在浏览器客户端,但对于任何类型的客户端协议都是适用的。任何需要访问受保护的Web services 的客户端都需要了解该HTTP认证协议,以及为了通过该认证而都需要去实现它。这一部分将讲述在不同类型的客户端间如何如何传送认证信息。
MS Visual Basic客户端
Microsoft公司为传输层提供一个HTTPConnector接口。它使用两个属性,AuthUser 和 AuthPassword来传递信用。 列表4是使用Visual Basic 和 MS SOAP Toolkit 2.0来调用一个安全的WebLogic Web service的例子。
AuthUser 和 AuthPassword不要和ProxyUser 和 ProxyPassword混淆。它们都是用来为
代理服务器提供信用的,如果这里使用代理服务的话。认证工作采用相同的方法,只是它返回的错误号是407而不是401。
Java 客户端
WebLogic Server提供Java客户端库来访问受保护的资源。用户名和信用使用"java.naming.security.principal" 和 "java.naming.security.cre- dentials"传递。列表5描述了Java客户端如何使用WebServiceProxy调用一个安全的 WebLogic Web。
JAX-RPC客户端
JAX-RPC (对于基于XML的远程程序调用的Java API) 是一个发布于2002年6月的新标准,它定义了调用Web services的API。WebLogic Server 7.0支持JAX-RPC。JAX-RPC接口"Stub" 和 "Call" 都支持"javax.xml.rpc.secutity.auth.username" 和"javax.xml.rpc.securi -ty.auth.password" 属性,通过它们可以传送认证信息。你也可以使用静态内容Stub. USERNAME_PROPERTY 和 Stub.PASSWORD_PROPERTY在一个服务调用前设置安全信息(参看Listing 6)。当使用
port()来获取端口时用户名和密码也可以被传送过来。
MS C++ 客户端
同样的,你可以使用由软件供应商提供API来编写C/C++客户端。MS SOAP 工具集在Windows平台上可用于编写C++客户端。用户名和密码使用连接器属性传递。下面是一个设置用户名和密码的例子。
Connector->Property["AuthUser"] = "";
Connector->Property["AuthPassword"] = "";
结论
这篇文章讨论了WebLogic的Web services的认证以及保护Web services组件。正如Web services对于使用不同技术的、不同的环境来说是自然的选择,它必需了解如何访问受保护的、使用不同类型的客户端的Web services。
Listing 1
sender
weblogic.soap.server.servlet.DestinationSendAdapter
topic-resource-ref
senderDestination
connection-factory-resource-ref
senderFactory
...
sender
/sendMsg
Listing 2
Weather
/weatherturi/*
Admin
BASIC
Admin
Listing 3
Admin
system
Listing 4
Set Client = New SoapClient
Client.mssoapinit "", "", "Name in WSDL>"
Connect
Client.ConnectorProperty("AuthUser") =
Client.ConnectorProperty("AuthPassword") =
Client.
Listing 5
Properties h = new Properties();
h.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.soap.http.SoapInitialContextFactory");
h.put("java.naming.security.principal", "" );
h.put("java.naming.security.credentials", "" );
Context context = new InitialContext(h);
WebServiceProxy proxy = (WebServiceProxy)context.lookup();
SoapMethod method = proxy.getMethod("");
method.invoke(new Object[]{""});
Listing 6
._setProperty(Stub.USERNAME_PROPERTY, "");
._setProperty(Stub.PASSWORD_PROPERTY, "");