JAX-WS使用WS-Security和WS-Addressing来使用Web服务

我正在尝试使用JAX-WS(Metro)开发独立的Java Web服务客户端,该客户端使用带有用户名令牌身份validation的WS-Security(密码摘要,随机数和时间戳)和时间戳validation以及SSL上的WS-Addressing。

我必须使用的WSDL没有定义任何安全策略信息。 当WSDL不包含此信息时,我无法确切地知道如何添加此标头信息(正确的方法)。 我发现使用Metro的大多数示例都围绕着使用Netbeans从WSDL自动生成,这对我没有任何帮助。 我没有太多的清晰度或方向,已经研究过WSIT,XWSS等。 JBoss WS Metro看起来很有希望,但也有。

任何人都有这方面的经验或有关如何完成此任务的建议? 即使把我指向正确的方向也会有所帮助。 除了必须基于Java之外,我不限于特定技术。

我最终确定了这个问题,但我还是朝着另一个方向努力。 我的解决方案是使用CXF 2.1及其JAX-WS实现,将CXF的强大function与我已有的现有Spring基础架构相结合。 起初我很怀疑是因为CXF需要大量的jar子,但最终它提供了最好和最简单的解决方案。

调整了CXF网站上的示例以进行客户端配置 ,我在spring中使用了自定义CXF JAXWS命名空间,并使用Out Interceptor进行用户名令牌身份validation(密码摘要,随机数和时间戳)和时间戳validation。 实现此function的唯一另一步是创建我自己的密码回调处理程序,该处理程序针对每个出站SOAP请求执行。

对于SSL配置,我再次通过管道转向CXF及其SSL支持 ,虽然我永远不能使用特定的http:管道名称使用SSL,但我必须使用不建议用于生产环境的通用程序。

下面是我的配置文件的示例。

Spring配置文件

                                         .*_WITH_3DES_.* .*_EXPORT_.* .*_EXPORT1024_.*.*_WITH_DES_.*.*_WITH_NULL_.*.*_DH_anon_.*     

Java客户端密码处理程序

 import java.io.IOException; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; import org.apache.log4j.Logger; import org.apache.ws.security.WSPasswordCallback; /** * 

* Provides a callback handler for use processing outbound/inbound SOAP messages. * ClientPasswordHandler sets the password used in the WS-Security UsernameToken * SOAP header. * *

* * Created: Apr 1, 2009 * @author Jared Knipp * */ public final class ClientPasswordHandler implements CallbackHandler { protected static Logger log = Logger.getLogger(ClientPasswordHandler.class); private static final PropertyManager PROPS = PropertyManager.getInstance(); private static String PASSWORD = PROPS.getPassword(); private static boolean IS_PASSWORD_CLEAR = PROPS.getIsClearPassword(); /** * Client password handler call back. This method is used to provide * additional outbound (or could be inbound also) message processing. * * Here the method sets the password used in the UsernameToken SOAP security header * element in the SOAP header of the outbound message. For our purposes the clear * text password is SHA1 hashed first before it is hashed again along with the nonce and * current timestamp in the security header. */ public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { if(log.isDebugEnabled()) { log.debug("Setting password for UsernameToken"); } WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; // Check to see if the password is already Hashed via SHA1, if not then hash it first if(IS_PASSWORD_CLEAR) { synchronized(this) { PASSWORD = PasswordDigestUtil.doPasswordDigest(PASSWORD); IS_PASSWORD_CLEAR = false; PROPS.setIsClearPassword(IS_PASSWORD_CLEAR); PROPS.setPassword(PASSWORD); PROPS.saveProperties(); } } pc.setPassword(PASSWORD); } }

如果信息不在WSDL中,您确定它在WSDL描述的服务中吗? WSDL旨在提供描述服务所需的所有信息,包括使用该服务所需的安全策略。

WSDL来自哪个平台? WSDL可能不是完整的描述吗? 例如,它可能是一个WSDL,它在另一个提供安全信息的WSDL中包含 d。

这里有一篇文章解释如何使用WS-Security在CXF中配置客户端和服务器: 使用Spring和CXF的JAX-WS Web服务