站长中国
设为首页 | 站长论坛

站长论坛 站长下载
您所在的位置: 站长中国 > 站长学院 > 网页设计 > 网页特效 > 正文

XFire中实现WS-Security
  2007年11月17日04:06:58  评论(0条) 字体:[ ]
相关热点: 实现 import public String ws_security 创建 wsOut.setProperty

XFire中实现WS-Security完整编
在1.1中已经支持ws-security了。XFire通过wss4j提供ws-security支持。
一、    前提条件:


前提条件要安装Unlimited Strength Jurisdiction Policy(可以在http://java.sun.com/j2se/1.5.0/download.jsp或http://java.sun.com/j2se/1.4.2/download.html下载)和Bouncy Castle(来自http://BouncyCastle.org)。否则会出现无效算法(algorithm)或Key大小(Key Size)
为了能支持WS-Security必须添加两个Handler:inhandlers、outhandlers。
以下必须添加到inHandlers
1、    org.codehaus.xfire.security.wss4j.WSS4JInHandler:执行WS-Security相关的函数;
2、    org.codehaus.xfire.util.dom.DOMInHandler:为WS-Security从StAX 转换成DOM格式。
注:DOMInHandler必须引入Xalan 2.7.0,XFire默认没有引入。
以下添加到outHandlers:
1、    org.codehaus.xfire.security.wss4j.WSS4JOutHandler:执行WS-Security相关的函数;
2、    org.codehaus.xfire.util.dom.DOMOutHandler:为WS-Security从StAX 转换成DOM格式。
二、    安装Unlimited Strength Jurisdiction Policy和Bouncy Castle
1、    安装Unlimited Strength Jurisdiction Policy:把local_policy.jar和US_export_policy.jar两个文件拷贝到:C:\j2re1.4.2\lib\security\下;(如果JRE安装在C:\j2re1.4.2)。
2、    安装Bouncy Castle:
(1)、把下载的bcprov-jdk14-119.jar文件拷贝到两个地方:
一个在你安装的JDK目录中,比如:C:\j2sdk1.4.0-rc\jre\lib\ext。另一个在你的JDK运行环境中,比如:C:\Program Files\Java\j2re1.4.0-rc\lib\ext;
(2)、还要在对两个java.security进行修改:
我的在 C:\j2sdk1.4.0-rc\jre\lib\security\java.security;C:\Program Files\Java\j2re1.4.0-rc\lib\security\java.security;
  在java.security中加入 security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider
三、    创建密钥:
1、    通过别名和密码创建私密钥到keystore:
keytool -genkey -alias ws_security -keypass keypassword -keystore privatestore.jks -storepass keyStorePassword -dname "cn=ws_security" -keyalg RSA
    采用RSA算法进行处理。
2、    证书:
keytool -selfcert -alias ws_security -keystore privatestore.jks -storepass keyStorePassword -keypass keypassword
3、    导出公钥到key.rsa:
keytool -export -alias ws_security -file key.rsa -keystore privatestore.jks -storepass keyStorePassword
4、    导入公钥到新的keystore中:
keytool -import -alias ws_security  -file key.rsa -keystore publicstore.jks -storepass keyStorePassword
5、    创建insecurity.properties:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=keyStorePassword
org.apache.ws.security.crypto.merlin.alias.password=keypassword
org.apache.ws.security.crypto.merlin.keystore.alias=ws_security
org.apache.ws.security.crypto.merlin.file=META-INF/xfire/publicstore.jks
6、    创建outsecurity.properties:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=keyStorePassword
org.apache.ws.security.crypto.merlin.alias.password=keypassword
org.apache.ws.security.crypto.merlin.keystore.alias=ws_security
org.apache.ws.security.crypto.merlin.file=META-INF/xfire/privatestore.jks
7、    把文件insecurity,outsecurity.properties,privatestore.jks和publicstore.jks复制到META-INF/xfire/下。
有关keytool的使用说明,请查看以下资料:
http://www.churchillobjects.com/c/11201e.html
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html
http://support.globalsign.net/en/objectsign/java.cfm
四、    实例:
1、    创建服务接口:
package example.services;
public interface BookService {
public String echo(String msg);
}
2、    创建服务实现类:
package example.services;
public class BookServiceImpl implements BookService {
        public String echo(String msg){
        return msg;
    }
}
3、    配制webservices.xml文件:
    <service>
        <name>BookService</name>
        <serviceClass>example.services.BookService</serviceClass>
        <implementationClass>
            example.services.BookServiceImpl
        </implementationClass>
        <style>wrapped</style>
        <use>literal</use>
        <scope>application</scope>
        <inHandlers>
            <handler
                handlerClass="org.codehaus.xfire.util.dom.DOMInHandler" />
            <bean
                class="org.codehaus.xfire.security.wss4j.WSS4JInHandler" xmlns="">
                <property name="properties">
                    <props>
                        <prop key="action">Signature</prop>
                        <prop key="signaturePropFile">
                            META-INF/xfire/insecurity.properties
                        </prop>
                        <prop key="decryptionPropFile">
                            META-INF/xfire/insecurity.properties
                        </prop>
                        <prop key="passwordCallbackClass">
                            example.ws_security.PasswordHandler
                        </prop>
                    </props>
                </property>
            </bean>
        </inHandlers>
    </service>
4、    创建:
package example.ws_security;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.callback.Callback;


import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
public class PasswordHandler implements CallbackHandler {
    private Map passwords = new HashMap();

    public PasswordHandler() {
        passwords.put("ws_security", "keypassword");
    }

    public void handle(Callback[] callbacks) throws IOException,
            UnsupportedCallbackException {
        System.out.println("Handling Password!");
        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        String id = pc.getIdentifer();
        System.out.println("id:"+id+" ,password:"+(String) passwords.get(id));
        pc.setPassword((String) passwords.get(id));
    }
}
5、    客户端实现:
package example.test;

import java.lang.reflect.Proxy;
import java.net.MalformedURLException;

import org.apache.ws.security.WSConstants;
import org.apache.ws.security.handler.WSHandlerConstants;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.security.wss4j.WSS4JOutHandler;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.codehaus.xfire.util.dom.DOMOutHandler;

import example.services.BookService;
import example.ws_security.PasswordHandler;

public class TTTest {
    private WSS4JOutHandler wsOut;
    private Service service;
    private BookService bookservice;
    private Client client;
    private static final String SERVICE_URL ="http://localhost:8080/TT/services/BookService";
    public TTTest()
    {
        //建议采用此种方式进行创建服务(带有服务名,此例为“BookService”)
        service=new ObjectServiceFactory().create(BookService.class,
                "BookService",
                null,
                null);
        try {
            bookservice=(BookService) new XFireProxyFactory().create(service, SERVICE_URL);
            client = ((XFireProxy) Proxy.getInvocationHandler(bookservice)).getClient();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
       
        wsOut = new WSS4JOutHandler();       
        wsOut.setProperty(WSHandlerConstants.SIG_PROP_FILE, "META-INF/xfire/outsecurity.properties");
        wsOut.setProperty(WSHandlerConstants.ENC_PROP_FILE, "META-INF/xfire/outsecurity.properties");
        wsOut.setProperty(WSHandlerConstants.USER, "ws_security");
        //wsOut.setProperty("password", "keypassword11");
        wsOut.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT);
        wsOut.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
        wsOut.setProperty(WSHandlerConstants.SIG_KEY_ID,"IssuerSerial");       
       
        client.addOutHandler(new DOMOutHandler());
        client.addOutHandler(wsOut);

        String actions =WSHandlerConstants.SIGNATURE; 
        //wsOut.setProperty(WSHandlerConstants.TTL_TIMESTAMP,"30");
        wsOut.setProperty(WSHandlerConstants.ACTION, actions);
        System.out.println(bookservice.echo("Client test msg"));
        client.close();
    }
    public static void main(String [] args)
    {
        new TTTest();
    }
}



收藏本文 打印 打印本文  推荐本文 告诉好友 投稿 投稿邮箱

站长排行

学院

新闻

专栏

盈利

[揭密网络黄链]中国留学生买凶专破日本
windows 2008中文版iis7+asp+php+Acces
贴吧发帖机使用教程(绝对原创)
超强弹出窗口代码,什么都挡不住
Windows Vista局域网网络连接设置
JSP语法(6)
FLASH视觉特效实例之地震效果
关于数据分页(转自www.codeproject.co
教你如何在Vista中设置麦克风
不用Photoshop 在线恶搞大头像
全国哀悼日网友自发QQ隐身上线 向死难
淘宝网卖家公然叫卖“艳照门”照片集
抗震救灾/鱼目混珠?
Google绿色专家质疑黑色背景网页节省资
阿里妈妈广告卖主全攻略
电影小说类相关关键字搜索量列表
爆笑 阿里就这样把亿告征服!
大脚:实战单页面优化关键词之——淘宝
国内各IT企业办公环境揭秘(多图)
心系灾区,点燃希望——手机QQ2008祈福
ECSHOP模板制作参考文档
悬挂阿里妈妈会否被百度惩罚
ECSHOP模板下载
阿里妈妈是否是中小站长的救世主?
最强网店ECShop发新版 众多酷炫功能给
土豆网,优酷网,爆米花等视频网站采集
DedeCms模板安装/制作概述
网上商店系统巅峰对决 ECShop vs ShopE
编程中国全站采集规则
http://www.mt86.com全站采集规则
性福联盟 一个不尊重站长的联盟
百度网络广告利润增长将会持续多久
大脚:日赚100元—揭露最新firefox欺骗
分享经验:个人网站如何月赚1万!
大脚:垃圾站超级赚钱法之二—突破“站
迅雷联盟、快车联盟收入对比
大脚:垃圾站超级赚钱法之——前言
Google Adsense的秘密 第二版
风险投资公司vc联系方式名录大全(一)
经理人必看的十个管理网站
站长学院  网页设计 建站教程 图形图象 网络编程

制定完整的网站
制定完整的网站
中国企业网站的
中国企业网站的

网站运营之怎么样来粘住你的用
网麒:网站建设创意
怎样提高网页快照更新
两种方法,教你如何通过微软正
英文网站优化细节
利用SSL加密增强FTP服务器的安
网页设计常用Javascript经典代

新闻线索

如果你有站长界人事变动、重组并购、变革技术出现,以及产品投诉等重要新闻线索,请告诉我们,我们会给予特别关注。
0631-3653338
站长中国编辑部
站长中国24小时新闻热线: 13156089008