Wss4j是apache開發的,標準實現WS-Security(WebService安全)的開源項目,它提供了用戶名令牌環驗證(UsernameToken)和傳遞消息時保證信息的完整性和真實性等一些WebService安全保障。
二、環境準備
開發環境準備
搭建webservice環境
將axis2.war包拷貝到tomcat安裝目錄下的webapps目錄下。
啓動Tomcat(Tomcat5.5\bin\startup.bat),打開瀏覽器輸入並訪問:http://127.0.0.1:8080/axis2 來查看是否axis2已經正常工作。
三、用KEYTOOL生成一對JKS文件
先我們用keytool生成一對JKS文件,
service.jks和client.jks。
service.jks存放了service的私鑰和client的公鑰。
client.jks存放了client的私鑰和service的公鑰。
生成時需要設置密碼,在此,我們使用apache作爲生成的service.jks的私鑰和公鑰keystore的密碼,
client.jks的私鑰和公鑰keystore的密碼也同樣設置爲apache.
(注如果不會用keytool請查看相關資料,你可以修改apache提供sample的文件來提供。)
四、建立web應用
編寫服務器端代碼
首先簡單介紹Wss4j實現WS-Security功能,很簡單就是客戶端發送一個字符串,服務器端得到該字符串,同時把字符串在發送給客戶端,首先自己建立一個web應用工程。
在src下建一個包com.test.wss4j.rempart.demo.services 在這裏寫一個類SimpleService作爲服務器端
該類的內容是:
package com.test.wss4j.demo;
public class SimpleService
{
public String echo(String arg)
{
return arg;
}
}
這個類的作用就是接收客戶端的字符串,並且把該字符串返回給客戶端。
這裏還有個類,該類是實現UsernameToken和傳送信息的安全性和完整性的核心,該類被配置在axis2.xml和service.xml中,從而能得到用戶配置的axis2.xml中的信息,和服務器端配置的service.xml的信息。每當客戶端發送請求時,它都要首先通過該類獲得訪問服務端的權限和獲得發送數據所需要的加密密碼,然後把數據加密發送給服務器端,如果沒有權限則不能把數據發送到服務器端。每當服務器端想要把數據傳送到客戶端時,也要經過此類獲得發送數據所需要的加密密碼,然後把數據加密返回給客戶端,客戶端通過解密獲得明文信息。
它的內容如下:
package com.test.wss4j.demo;
import org.apache.ws.security.WSPasswordCallback;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.IOException;
public class PWCBHandler implements CallbackHandler
{
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException
{
for (int i = 0; i < callbacks.length; i++)
{
WSPasswordCallback pwcb = (WSPasswordCallback)callbacks[i];
String id = pwcb.getIdentifer();
if("client".equals(id))
{
pwcb.setPassword("apache");
}
else if("service".equals(id))
{
pwcb.setPassword("apache");
}
else
{
throw new UnsupportedCallbackException(callbacks[i], "對不起,您不是授權用戶,不能訪問該WEB服務!");
}
}
}
}
編寫服務器端的描述文件services.xml
然後寫一個解析該服務器類services.xml文件。該文件的內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<service name="wsc">
<operation name="echo">
<messageReceiver
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</operation>
<parameter name="ServiceClass" locked="false">
com.neusoft.wss4j.rempart.demo.services.SimpleService
</parameter>
<module ref="rampart" />
<parameter name="InflowSecurity">
<action>
<items>Timestamp Signature</items>
<signaturePropFile>
keys/service.properties
</signaturePropFile>
</action>
</parameter>
<parameter name="OutflowSecurity">
<action>
<items>Timestamp Signature</items>
<user>service</user>
<passwordCallbackClass>
com.neusoft.wss4j.demo.PWCBHandler
</passwordCallbackClass>
<signaturePropFile>
keys/service.properties
</signaturePropFile>
<signatureKeyIdentifier>
DirectReference
</signatureKeyIdentifier>
</action>
</parameter>
</service>
服務器wsc中有幾個方法就需要配置幾個<operation></operation>
echo爲wsc服務器類中的方法。wsc爲服務的名字也就是後邊的打包服務器端wsc.aar的名字。着重看下紅色和粉色字體部分,紅色這部分是客戶端傳來信息用數字簽名來解密客戶端傳過來的加密信息本例通過keys文件夾下的service.properties這個文件找到service.jks對信息進行解密,粉色部分是服務器端把輸出向客戶端的信息加密用的,本例通過keys文件夾下的service.properties這個文件找到service.jks對信息加密的。
service.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=apache
org.apache.ws.security.crypto.merlin.file=keys/service.jks