OMG,到底在尋找什么..................
          (構(gòu)造一個完美的J2EE系統(tǒng)所需要的完整知識體系)
          posts - 198,  comments - 37,  trackbacks - 0

          XFire中實現(xiàn)WS-Security完整編

          在1.1中已經(jīng)支持ws-security了。XFire通過wss4j提供ws-security支持。

          一、?前提條件:

          前提條件要安裝Unlimited Strength Jurisdiction Policy(可以在http://java.sun.com/j2se/1.5.0/download.jsphttp://java.sun.com/j2se/1.4.2/download.html下載)和Bouncy Castle(來自http://BouncyCastle.org)。否則會出現(xiàn)無效算法(algorithm)或Key大小(KeySize)

          為了能支持WS-Security必須添加兩個Handler:inhandlers、outhandlers。

          以下必須添加到inHandlers

          1、?org.codehaus.xfire.security.wss4j.WSS4JInHandler:執(zhí)行WS-Security相關(guān)的函數(shù);
          2、?org.codehaus.xfire.util.dom.DOMInHandler:為WS-Security從StAX轉(zhuǎn)換成DOM格式。

          注:DOMInHandler必須引入Xalan 2.7.0,XFire默認沒有引入(下載地址為:http://www.apache.org/dyn/closer.cgi/xml/xalan-j)。

          以下添加到outHandlers:

          1、?org.codehaus.xfire.security.wss4j.WSS4JOutHandler:執(zhí)行WS-Security相關(guān)的函數(shù);
          2、?org.codehaus.xfire.util.dom.DOMOutHandler:為WS-Security從StAX轉(zhuǎn)換成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運行環(huán)境中,比如: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
          三、?創(chuàng)建密鑰:
          1、?通過別名和密碼創(chuàng)建私密鑰到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、?導(dǎo)出公鑰到key.rsa:
          keytool -export -alias ws_security -file key.rsa -keystore privatestore.jks -storepass keyStorePassword
          4、?導(dǎo)入公鑰到新的keystore中:
          keytool -import -alias ws_security? -file key.rsa -keystore publicstore.jks -storepass keyStorePassword
          5、?創(chuàng)建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、?創(chuàng)建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復(fù)制到META-INF/xfire/下。

          有關(guān)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、?創(chuàng)建服務(wù)接口:
          package example.services;
          public interface BookService

          Unknown macro: { public String echo(String msg);}

          2、?創(chuàng)建服務(wù)實現(xiàn)類:

          ?package example.services; public class BookServiceImpl implements BookService

          Unknown macro: { ??public String echo(String msg){ ??return msg; ?}

          }

          3、?配制webservices.xml文件:
          ?<beans xmlns="http://xfire.codehaus.org/config/1.0">
          ?<service>
          ??<name>BookServiceSign</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>
          ?
          ?<service>
          ??<name>BookServiceUsernameToken</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">UsernameToken</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>
          ?
          ?<service>
          ??<name>BookServiceTimestamp</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">Timestamp</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>
          ?
          ?<service>
          ??<name>BookServiceEnc</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">Encrypt</prop>
          ??????<prop key="encryptPropFile">
          ???????META-INF/xfire/outsecurity.properties
          ??????</prop>
          ??????<prop key="decryptionPropFile">
          ???????META-INF/xfire/outsecurity.properties
          ??????</prop>
          ??????<prop key="passwordCallbackClass">
          ???????example.ws_security.PasswordHandler
          ??????</prop>
          ?????</props>
          ????</property>
          ???</bean>
          ???</inHandlers>
          ?</service>
          </beans>

          4、?創(chuàng)建:
          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()

          Unknown macro: {??passwords.put("ws_security", "keypassword");}

          ?public void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackException

          Unknown macro: {??System.out.println("Handling Password!"); ??WSPasswordCallback pc = (WSPasswordCallback) callbacks [0]; ??String id = pc.getIdentifer(); ??System.out.println("id}

          }
          5、?客戶端實現(xiàn):
          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;
          ??? public TTTest(){}
          ??? public void testClientEcr()
          ??

          Unknown macro: { ??? ?String serviceName="BookServiceEnc"; ??? ?String actions=WSHandlerConstants.ENCRYPT; ??? ?String SERVICE_URL ="http}

          catch (MalformedURLException e)?

          Unknown macro: {?e.printStackTrace(); ??}

          ??????? wsOut = new WSS4JOutHandler();???????
          ??????? wsOut.setProperty(WSHandlerConstants.SIG_PROP_FILE, "META-INF/xfire/insecurity.properties");
          ??????? wsOut.setProperty(WSHandlerConstants.ENC_PROP_FILE, "META-INF/xfire/insecurity.properties");
          ??????? wsOut.setProperty(WSHandlerConstants.USER, "ws_security");
          ??????? wsOut.setProperty("password", "keypassword");
          ??????? wsOut.setProperty(WSHandlerConstants.PASSWORD_TYPE,WSConstants.PW_TEXT);
          ??????? wsOut.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS,PasswordHandler.class.getName());
          ??????? wsOut.setProperty(WSHandlerConstants.SIG_KEY_ID,"IssuerSerial");?
          ??????? client.addOutHandler(new DOMOutHandler());
          ??????? client.addOutHandler(wsOut);
          ??????? //client.addInHandler(new DOMInHandler());
          ??????? //wsOut.setProperty(WSHandlerConstants.TTL_TIMESTAMP,"30");
          ??????? wsOut.setProperty(WSHandlerConstants.ACTION, actions);
          ??????? System.out.println(bookservice.echo("Client test msg"+actions));
          ??????? client.close();
          ??? }
          ??? public void testClient2(String serviceName,String actions)
          ??? {
          ??? ?String SERVICE_URL="http://localhost:8080/TT/services/"+serviceName;
          ??? ?//建議采用此種方式進行創(chuàng)建服務(wù)(帶有服務(wù)名,此例為"BookService")
          ??? ?service=new ObjectServiceFactory().create(BookService.class,serviceName,null,null);
          ??? ?try
          ??? ?{
          ???bookservice=(BookService) new XFireProxyFactory().create(service, SERVICE_URL);
          ???client = ((XFireProxy) Proxy.getInvocationHandler(bookservice)).getClient();
          ??}}
          ?} catch (MalformedURLException e)

          Unknown macro: { ???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", "keypassword");
          ??????? wsOut.setProperty(WSHandlerConstants.PASSWORD_TYPE,WSConstants.PW_TEXT);
          ??????? wsOut.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS,PasswordHandler.class.getName());
          ??????? wsOut.setProperty(WSHandlerConstants.SIG_KEY_ID,"IssuerSerial");
          ??????? client.addOutHandler(new DOMOutHandler());
          ??????? client.addOutHandler(wsOut);
          ??????? //client.addInHandler(new DOMInHandler());
          ??????? //wsOut.setProperty(WSHandlerConstants.TTL_TIMESTAMP,"30");
          ??????? wsOut.setProperty(WSHandlerConstants.ACTION, actions);
          ??????? System.out.println(bookservice.echo("Client test msg "+actions));
          ??????? client.close();
          ??? }
          ??? public static void main(String [] args)

          Unknown macro: {??? ?TTTest tt=new TTTest(); ??? ?tt.testClientEcr(); ??? ?tt.testClient2("BookServiceSign", WSHandlerConstants.SIGNATURE); ??? ?tt.testClient2("BookServiceUsernameToken", WSHandlerConstants.USERNAME_TOKEN); ??? ?tt.testClient2("BookServiceTimestamp", WSHandlerConstants.TIMESTAMP);}

          }

          posted on 2007-01-22 11:37 OMG 閱讀(1309) 評論(0)  編輯  收藏 所屬分類: Webservice

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          IT風(fēng)云人物

          文檔

          朋友

          相冊

          經(jīng)典網(wǎng)站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 稻城县| 全椒县| 溧阳市| 新乐市| 九江县| 嵊州市| 资中县| 辰溪县| 金坛市| 手游| 策勒县| 安阳市| 德安县| 绥宁县| 张掖市| 桑植县| 聂荣县| 淄博市| 资中县| 甘孜县| 岑巩县| 兴化市| 仁化县| 琼中| 朔州市| 历史| 峨边| 金沙县| 延津县| 象山县| 台湾省| 东乌| 大荔县| 石棉县| 渑池县| 亚东县| 河北区| 锡林郭勒盟| 南宫市| 宜阳县| 新宾|