当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《JAX-WS使用WS-Security和WS-Addressing来使用Web服务》经验,为你挑选了1个好方法。

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

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

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



1> Jared Knipp..:

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

调整了来自CXF网站的示例以进行客户端配置,我在spring中使用了自定义CXF JAXWS命名空间,并使用Out Interceptor进行用户名令牌身份验证(密码摘要,随机数和时间戳)和时间戳验证.使这项工作唯一的另一步是创建我自己的密码回调处理程序,该处理程序为每个出站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); } }

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有