- 浏览: 261872 次
- 性别:
- 来自: 多伦多
文章分类
- 全部博客 (127)
- Java 基础 (46)
- Java EE (3)
- Clouds (1)
- Spring 编程 (7)
- Spring Batch 编程 (1)
- Quartz 编程 (9)
- Seam 编程 (4)
- Hibernate 编程 (1)
- JSF 编程 (3)
- jQuery 编程 (3)
- Interview Question 汇总 (3)
- 日常应用 (3)
- Maven 编程 (2)
- WebService 编程 (10)
- Scala 编程 (5)
- Coherence 编程 (8)
- OO 编程 (1)
- Java 线程 (6)
- DB 编程 (2)
- WebService 安全 (4)
- Oracle Fusion 编程 (2)
- JavsScript/Ajax 编程 (1)
最新评论
-
chainal:
赞,说的很好
Scala 有趣的Trait -
wuliupo:
RRRR-MM-DD HH24:MI:SS
如何让Oracle SQL Developer显示的包含在日期字段中的时间 -
pengain:
...
使用Spring Roo ,感受ROR式的开发 -
zeng1990:
def getPersonInfo() = {
(&quo ...
Java 的继位人? - Scala简介 -
zeng1990:
我使用的是2.9.2版本的!
Java 的继位人? - Scala简介
http://hanyexiaoxiao.iteye.com/blog/479010
在前面的文章中,我们实现了最简单的AXIS服务。现在我们一起来讨论一下Web服务的安全问题。
根据应用的对安全要求的级别不同,可以采用不同的方式来实现安全性,以下是目前最常用的一些实现方式(从低到高排列):
1、J2EE
Web应用默认的访问控制(数据是明文的);
2、使用axis的Handler进行访问控制(数据是明文的);
3、使用Servlet过滤器(Filter)进行访问控制(数据是明文的);
4、使用SSL/HTTPS协议来传输(加密的数据传输协议);
5、使用WS-Security规范对信息进行加密与身份认证(数据被加密传输)。
我们仅讨论第2、4、5种实现方式。在此之前我们先来了解一下AXIS自带的一个工具SOAPMonitor。
一、SOAPMonitor的使用
打开http://localhost:8080/axis/进入AXIS的主页面,你会看见:
SOAPMonitor-[disabled by
default for security reasons]
,默认状态下其是不可用的,现在我们就来激活它。
1、到目录%TOMCAT_HOME%\webapps\axis下,你会找到SOAPMonitorApplet.java,在命令行中编译它:
javac -classpath %AXIS_HOME%\lib\axis.jar
SOAPMonitorApplet.java
编译完之后你会看见目录下多了很多CLASS文件,它们的名字是SOAPMonitorApplet*.class
2、在目录%TOMCAT_HOME%\webapps\axis\WEB-INF下打开server-config.wsdd文件,将下面的两部分代码直
接加入其中相应的位置
第一部分:
<handler name="soapmonitor"
type="java:org.apache.axis.handlers.SOAPMonitorHandler">
<parameter
name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/>
<parameter name="namespace" value=""
target="_blank">http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
<parameter name="serviceName" value="SOAPMonitorService"/>
<parameter name="portName" value="Demo"/>
</handler>
第二部分:
<service name="SOAPMonitorService"
provider="java:RPC">
<parameter name="allowedMethods"
value="publishMessage"/>
<parameter name="className"
value="org.apache.axis.monitor.SOAPMonitorService"/>
<parameter
name="scope" value="Application"/>
</service>
3、选择你要监控的服务
以上次的HelloWorld服务为例,在server-config.wsdd中你会找到这段代码
<service
name="HelloWorld" provider="java:RPC">
<parameter
name="allowedMethods" value="sayHello"/>
<parameter
name="className"
value="HelloWorld"/>
</service>
在这段代码中加入以下的代码:
<requestFlow>
<handler
type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler
type="soapmonitor"/>
</responseFlow>
最后的样子是:
<service
name="HelloWorld" provider="java:RPC">
<requestFlow>
<handler
type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter
name="allowedMethods" value="sayHello"/>
<parameter name="className"
value="HelloWorld"/>
</service>
这样HelloWorld服务就被监控了
4、启动Tomcat,打开http://localhost:8080/axis/SOAPMonitor,你就会看到Applet界面,在
eclipse中运行我们上次写的客户端程序
TestClient.java。OK!你会在Applet界面看
见客户端与服务器端互发的XML内容,注意这里是明文!
二、使用axis的Handler进行访问控制(对安全要求不高时推荐)
axis为Web服务的访问控制提供了相关的配置描述符,并且提供了一个访问控制的简单
Handler。默认情况下,你只要在配置描述符中添加用户,然后在Web服务器的部署描述符中自动允许的角色即可。
1、在axis的配置文件users.lst(位于WEB-INF目录下)中添加一个用户,如"annlee
1111",表示
用户名为annlee,密码为1111。
2、把例HelloWorld的Web服务重新部署(新加的部分已标出)
<service
name="HelloWorld" provider="java:RPC">
<requestFlow>
<handler type="soapmonitor"/>
<handler type="Authenticate"/>
//新加的AXIS自带的Handler
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter
name="allowedMethods" value="sayHello"/>
<parameter name="allowedRoles"
value="annlee"/> //注意,这里是新加的部分!
<parameter name="className"
value="HelloWorld"/>
</service>
在这个部署描述符中,指定HelloWorld服务只能被annlee访问
3、修改客户端程序
TestClient.java,增加访问用户名、密码(新加的部分已标出)
TestClient.java
import org.apache.axis.client.Call;
import
org.apache.axis.client.Service;
import
javax.xml.rpc.ParameterMode;
public class TestClient
{
public static void
main(String [] args) throws Exception {
String endpoint = "http://localhost:" +"8080"+ "/axis/HelloWorld";
Service service = new
Service();
Call call = (Call)
service.createCall();
call.getMessageContext().setUsername("annlee");//
用户名。
call.getMessageContext().setPassword("1111");//
密码
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName( "sayHello" );
String res
= (String) call.invoke( new Object[] {} );
System.out.println( res
);
}
}
执行TestClient,能够顺利访问Web服务;如果修改用户名或者密码,那么就不能访问 。同样,
你在http://localhost:8080/axis/SOAPMonitor中看到的请求和响应的XML是明文!
三、使用SSL/HTTPS协议来传输
Web服务也可以使用SSL作为传输协议。虽然JAX-RPC并没有强制规定是否使用SSL协议,但在tomcat
下可以使用HTTPS协议。
1、使用JDK自带的工具创建密匙库和信任库。
1)通过使用以下的命令来创建服务器端的密匙库:
keytool -genkey -alias
Server -keystore server.keystore -keyalg RSA
输入keystore密码:
changeit
您的名字与姓氏是什么?
[Unknown]: Server
您的组织单位名称是什么?
[Unknown]:
ec
您的组织名称是什么?
[Unknown]: ec
您所在的城市或区域名称是什么?
[Unknown]:
beijing
您所在的州或省份名称是什么?
[Unknown]: beijing
该单位的两字母国家代码是什么
[Unknown]:
CN
CN=Server, OU=ec, O=ec, L=beijing, ST=beijing, C=CN 正确吗?
[否]:
y
输入<Server>的主密码
(如果和 keystore
密码相同,按回车):
以上命令执行完成后,将获得一个名为server.keystore的密匙库。
2)生成客户端的信任库。首先输出RSA证书:
keytool
-export -alias Server -file test_axis.cer -storepass changeit -keystore
server.keystore
然后把RSA证书输入到一个新的信任库文件中。这个信任库被客户端使用,被用来验证服务器端的身份。
keytool
-import -file test_axis.cer -storepass changeit -keystore client.truststore
-alias serverkey -noprompt
以上命令执行完成后,将获得一个名为client.truststore的信任库。
3)同理生成客户端的密匙库client.keystore和服务器端的信任库server.truststore.方便起见给出.bat文件
gen-cer-store.bat内容如下:
set
SERVER_DN="CN=Server, OU=ec, O=ec, L=BEIJINGC, S=BEIJING, C=CN"
set
CLIENT_DN="CN=Client, OU=ec, O=ec, L=BEIJING, S=BEIJING, C=CN"
set
KS_PASS=-storepass changeit
set KEYINFO=-keyalg RSA
keytool -genkey -alias Server -dname %SERVER_DN%
%KS_PASS% -keystore server.keystore %KEYINFO% -keypass changeit
keytool
-export -alias Server -file test_axis.cer %KS_PASS% -keystore
server.keystore
keytool -import -file test_axis.cer %KS_PASS% -keystore
client.truststore -alias serverkey -noprompt
keytool -genkey -alias Client -dname %CLIENT_DN%
%KS_PASS% -keystore client.keystore %KEYINFO% -keypass changeit
keytool
-export -alias Client -file test_axis.cer %KS_PASS% -keystore
client.keystore
keytool -import -file test_axis.cer %KS_PASS% -keystore
server.truststore -alias clientkey
-noprompt
好的,现在我们就有了四个文件:server.keystore,server.truststore,client.keystore,client.truststore
2、更改Tomcat的配置文件(server.xml),增加以下部署描述符:(其实里面有,只是被注释掉了)
<Connector port="8440"
maxThreads="150"
minSpareThreads="25" maxSpareThreads="75"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="100" scheme="https"
secure="true"
clientAuth="true" keystoreFile="f:\server.keystore"
keystorePass="changeit"
truststoreFile="f:\server.truststore"
truststorePass="changeit"
sslProtocol="TLS" />
3、把HelloWorld重新部署一次,在server-config.wsdd中修改如下部署代码。(还原了而已)
<service
name="HelloWorld" provider="java:RPC">
<requestFlow>
<handler
type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter
name="allowedMethods" value="sayHello"/>
<parameter name="className"
value="HelloWorld"/>
</service>
4、修改客户端程序
TestClient.java(修改的部分已标出)
public class TestClient
{
public static void
main(String [] args) throws Exception {
String endpoint = "https://localhost:" +"8440"+
"/axis/HelloWorld";//注意区别在这里!https!
Service service = new
Service();
Call call = (Call)
service.createCall();
call.setTargetEndpointAddress( new
java.net.URL(endpoint) );
call.setOperationName( "sayHello" );
String res
= (String) call.invoke( new Object[] {} );
System.out.println( res );
}
}
5、最后使用命令来执行客户端程序
java -cp
%AXISCLASSPATH%
-Djavax.net.ssl.keyStore=client.keystore
-Djavax.net.ssl.keyStorePassword=changeit
-Djavax.net.ssl.trustStore=client.truststore
TestClient
四、使用WS-Security规范对信息进行加密与身份认证
我们打算用Handler结合WSSecurity实现Web服务安全(Handler的有关内容请参阅AXIS第三课)
设想流程:用WSClientRequestHandler.java位于客户端对客户端发出的XML文档进行加密
WSServerRequestHandler.java位于服务器端对客户端发出的加密后的XML文档进行解密
WSServerResponseHandler.java位于服务器端对服务器端返回的XML文档进行加密
WSClientResponseHandler.java位于客户端对服务器端返回的XML文档进行解密
1、使用ISNetworks安全提供者,ISNetworks实现了RSA加密、解密算法。
当然,你也可以使用其它的安全提供者,并且可以使用不同的加密算法。
ISNetworks相关包ISNetworksProvider.jar。拷贝到%TOMCAT_HOME%
\webapps\axis\WEB-INF\lib
2、Trust Services Integration
Kit提供了一个WS-Security实现。你可以从http://www.xmltrustcenter.org获得相关库文件,分别是ws-security.jar和tsik.jar。ws-security.jar中包含一个WSSecurity类,我们使用它来对XML进行数字签名和验证,加密与解密。同样拷贝到%TOMCAT_HOME%\webapps\axis\WEB-INF\lib
3、创建密匙库和信任库。(见上面,一模一样!)
4、框架结构
WSClientHandler.java
//基类,包含了一些公用方法
WSClientRequestHandler.java
//继承于WSClientHandler.java,调用WSHelper.java对客户端发出的XML文档进行加密
WSClientResponseHandler.java
//继承于WSClientHandler.java,调用WSHelper.java对服务器端返回的XML文档进行解密
WSServerHandler.java
//基类,包含了一些公用方法
WSServerRequestHandler.java
//继承于WSServerHandler.java,调用WSHelper.java对客户端发出的加密后的XML文档进行解密
WSServerResponseHandler.java//继承于WSServerHandler.java,调用WSHelper.java对服务器端返回的XML文档进行加密
WSHelper.java
//核心类,对SOAP消息签名、加密、解密、身份验证
MessageConverter.java
//帮助类,Document、SOAP消息互相转换
5、具体分析(在此强烈建议看一下tsik.jar的API)
WSHelper.java
public
class WSHelper {
static String
PROVIDER="ISNetworks";//JSSE安全提供者。
//添加JSSE安全提供者,你也可以使用其它安全提供者。只要支持DESede算法。这是程序里动态加载还可以在JDK中静态加载
static
{
java.security.Security.addProvider(new
com.isnetworks.provider.jce.ISNetworksProvider());
}
/**
*对XML文档进行数字签名。
*/
public static void sign(Document doc, String keystore, String
storetype,
String storepass, String alias,
String keypass) throws Exception {
FileInputStream fileInputStream
= new FileInputStream(keystore);
java.security.KeyStore keyStore =
java.security.KeyStore.getInstance(storetype);
keyStore.load(fileInputStream, storepass.toCharArray());
PrivateKey
key = (PrivateKey)keyStore.getKey(alias, keypass.toCharArray());
X509Certificate cert =
(X509Certificate)keyStore.getCertificate(alias);
SigningKey sk =
SigningKeyFactory.makeSigningKey(key);
KeyInfo ki = new
KeyInfo();
ki.setCertificate(cert);
WSSecurity
wSSecurity = new WSSecurity();//ws-security.jar中包含的WSSecurity类
wSSecurity.sign(doc, sk, ki);//签名。
}
/**
*对XML文档进行身份验证。
*/
public static boolean verify(Document
doc, String keystore, String storetype,
String storepass) throws Exception {
FileInputStream
fileInputStream = new FileInputStream(keystore);
java.security.KeyStore keyStore =
java.security.KeyStore.getInstance(storetype);
keyStore.load(fileInputStream, storepass.toCharArray());
TrustVerifier verifier = new X509TrustVerifier(keyStore);
WSSecurity wSSecurity = new WSSecurity();
MessageValidity[] resa =
wSSecurity.verify(doc, verifier, null,null);
if (resa.length >
0)
return resa[0].isValid();
return
false;
}
/**
*对XML文档进行加密。必须有JSSE提供者才能加密。
*/
public static
void encrypt(Document doc, String keystore, String
storetype,
String storepass, String alias)
throws Exception {
try
{
FileInputStream
fileInputStream = new FileInputStream(keystore);
java.security.KeyStore keyStore =
java.security.KeyStore.getInstance(storetype);
keyStore.load(fileInputStream, storepass.toCharArray());
X509Certificate cert =
(X509Certificate)keyStore.getCertificate(alias);
PublicKey pubk =
cert.getPublicKey();
KeyGenerator keyGenerator =
KeyGenerator.getInstance("DESede",PROVIDER);
keyGenerator.init(168,
new SecureRandom());
SecretKey key =
keyGenerator.generateKey();
KeyInfo ki = new
KeyInfo();
ki.setCertificate(cert);
WSSecurity
wSSecurity = new WSSecurity();
//加密。
wSSecurity.encrypt(doc, key, AlgorithmType.TRIPLEDES, pubk,
AlgorithmType.RSA1_5, ki);
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
*对文档进行解密。
*/
public static void decrypt(Document doc,
String keystore, String storetype,
String
storepass, String alias, String keypass) throws Exception {
FileInputStream fileInputStream = new FileInputStream(keystore);
java.security.KeyStore keyStore =
java.security.KeyStore.getInstance(storetype);
keyStore.load(fileInputStream, storepass.toCharArray());
PrivateKey
prvk2 = (PrivateKey)keyStore.getKey(alias, keypass.toCharArray());
WSSecurity wSSecurity = new
WSSecurity();
//解密。
wSSecurity.decrypt(doc, prvk2,
null);
WsUtils.removeEncryptedKey(doc);//从 WS-Security Header中删除
EncryptedKey 元素
}
public static void removeWSSElements(Document
doc) throws Exception {
WsUtils.removeWSSElements(doc);//
删除WSS相关的元素。
}
}
WSClientHandler.java
//继承自org.apache.axis.handlers.BasicHandler即AXIS内在的
public
class WSClientHandler extends BasicHandler{
protected String keyStoreFile
;
protected String keyStoreType ="JKS";//默认
protected String
keyStorePassword ;
protected String keyAlias ;
protected String
keyEntryPassword ;
protected String trustStoreFile ;
protected String
trustStoreType = "JKS";//默认
protected String trustStorePassword
;
protected String certAlias ;
public void setInitialization(String
keyStoreFile,String keyStoreType,String keyStorePassword,
String
keyAlias,String keyEntryPassword,String trustStoreFile,
String
trustStoreType,String trustStorePassword,String
certAlias){
this.keyStoreFile=keyStoreFile;
this.keyStoreType=keyStoreType;
this.keyStorePassword=keyStorePassword;
this.keyAlias=keyAlias;
this.keyEntryPassword=keyEntryPassword;
this.trustStoreFile=trustStoreFile;
this.trustStoreType=trustStoreType;
this.trustStorePassword=trustStorePassword;
this.certAlias=certAlias;
}
public
void setInitialization(String keyStoreFile,String keyStorePassword,
String keyAlias,String keyEntryPassword,String trustStoreFile,
String trustStorePassword,String
certAlias){
this.keyStoreFile=keyStoreFile;
this.keyStorePassword=keyStorePassword;
this.keyAlias=keyAlias;
this.keyEntryPassword=keyEntryPassword;
this.trustStoreFile=trustStoreFile;
this.trustStorePassword=trustStorePassword;
this.certAlias=certAlias;
}
public
void invoke(MessageContext messageContext) throws AxisFault
{//在这个方法里对XML文档进行处理
//do nothing now!
}
public void
onFault(MessageContext msgContext) {
System.out.println("处理错误,这里忽略!");
}
}
WSClientRequestHandler.java
public class
WSClientRequestHandler extends WSClientHandler{
public void
invoke(MessageContext messageContext) throws AxisFault {
try {
SOAPMessage soapMessage =
messageContext.getMessage();
Document doc =
MessageConverter.convertSoapMessageToDocument(soapMessage);
//soapMessage转换为Document
WSHelper.sign(doc, keyStoreFile,
keyStoreType,keyStorePassword, keyAlias, keyEntryPassword);
//数字签名
WSHelper.encrypt(doc, trustStoreFile, trustStoreType,
trustStorePassword, certAlias); //加密
soapMessage =
MessageConverter.convertDocumentToSOAPMessage(doc);
//处理后的Document再转换回soapMessage
messageContext.setMessage(soapMessage);
}
catch (Exception e){
System.err.println("在处理响应时发生以下错误: " + e);
e.printStackTrace(); }
}
}
WSClientResponseHandler.java
public class
WSClientResponseHandler extends WSClientHandler{
public void
invoke(MessageContext messageContext) throws AxisFault {
try {
SOAPMessage soapMessage =
messageContext.getCurrentMessage();
Document doc =
MessageConverter.convertSoapMessageToDocument(soapMessage);
WSHelper.decrypt(doc, keyStoreFile,
keyStoreType,
keyStorePassword, keyAlias,
keyEntryPassword);//解密
WSHelper.verify(doc, trustStoreFile,
trustStoreType, trustStorePassword);//验证
WSHelper.removeWSSElements(doc);
soapMessage =
MessageConverter.convertDocumentToSOAPMessage(doc);
messageContext.setMessage(soapMessage);
} catch (Exception e){
e.printStackTrace();
System.err.println("在处理响应时发生以下错误: " +
e);
}
}
}
WSServerHandler.java
public class
WSServerHandler extends BasicHandler{
protected String keyStoreFile
;
protected String keyStoreType ="JKS";//默认
protected String
keyStorePassword ;
protected String keyAlias ;
protected String
keyEntryPassword ;
protected String trustStoreFile ;
protected String
trustStoreType = "JKS";//默认
protected String trustStorePassword
;
protected String certAlias ;
public void invoke(MessageContext messageContext)
throws AxisFault {
//do nothing now!
}
public void
onFault(MessageContext msgContext) {
System.out.println("处理错误,这里忽略!");
}
public void init() { //初始化,从配置文件server-config.wsdd中读取属性
keyStoreFile =
(String)getOption("keyStoreFile");
if(( keyStoreFile== null) )
System.err.println("Please keyStoreFile configured for the
Handler!");
trustStoreFile = (String)getOption("trustStoreFile");
if((
trustStoreFile== null) )
System.err.println("Please trustStoreFile configured
for the Handler!");
keyStorePassword =
(String)getOption("keyStorePassword");
if(( keyStorePassword== null)
)
System.err.println("Please keyStorePassword configured for the
Handler!");
keyAlias = (String)getOption("keyAlias");
if(( keyAlias==
null) )
System.err.println("Please keyAlias configured for the
Handler!");
keyEntryPassword = (String)getOption("keyEntryPassword");
if((
keyEntryPassword== null) )
System.err.println("Please keyEntryPassword
configured for the Handler!");
trustStorePassword =
(String)getOption("trustStorePassword");
if(( trustStorePassword== null)
)
System.err.println("Please trustStorePassword configured for the
Handler!");
certAlias = (String)getOption("certAlias");
if
((certAlias==null))
System.err.println("Please certAlias configured for
the Handler!");
if ((getOption("keyStoreType")) != null)
keyStoreType
= (String)getOption("keyStoreType");
if ((getOption("trustStoreType")) !=
null)
trustStoreType =
(String)getOption("trustStoreType");
}
}
WSServerRequestHandler.java
public
class WSServerRequestHandler extends WSServerHandler{
public void
invoke(MessageContext messageContext) throws AxisFault {
try {
SOAPMessage msg = messageContext.getCurrentMessage();
Document doc =
MessageConverter.convertSoapMessageToDocument(msg);
System.out.println("接收的原始消息:");
msg.writeTo(System.out);
WSHelper.decrypt(doc, keyStoreFile, keyStoreType,
keyStorePassword, keyAlias, keyEntryPassword);//解密
WSHelper.verify(doc, trustStoreFile,
trustStoreType, trustStorePassword);//验证
WSHelper.removeWSSElements(doc);
msg =
MessageConverter.convertDocumentToSOAPMessage(doc);
System.out.println("怀原后的原始消息:");
msg.writeTo(System.out);
messageContext.setMessage(msg);
} catch (Exception e){
e.printStackTrace();
System.err.println("在处理响应时发生以下错误: " +
e);
}
}
}
WSServerResponseHandler.java
public class
WSServerResponseHandler extends WSServerHandler{
public void
invoke(MessageContext messageContext) throws AxisFault {
try {
SOAPMessage soapMessage =
messageContext.getMessage();
System.out.println("返回的原始消息:");
soapMessage.writeTo(System.out);
Document doc =
MessageConverter.convertSoapMessageToDocument(soapMessage);
WSHelper.sign(doc, keyStoreFile,
keyStoreType,
keyStorePassword, keyAlias,
keyEntryPassword);//数字签名
WSHelper.encrypt(doc, trustStoreFile,
trustStoreType,//加密
trustStorePassword, certAlias);
soapMessage =
MessageConverter.convertDocumentToSOAPMessage(doc);
System.out.println("返回的加密后的消息:");
soapMessage.writeTo(System.out);
messageContext.setMessage(soapMessage);
} catch (Exception e){
System.err.println("在处理响应时发生以下错误: " + e);
e.printStackTrace();
}
}
}
6、应用
为方便使用,把上述文件打包为ws-axis.jar,放入%TOMCAT_HOME%\webapps\axis\WEB-INF\lib
1)把HelloWorld重新部署一次,在server-config.wsdd中修改如下部署代码。
<service name="HelloWorld" provider="java:RPC">
<parameter
name="allowedMethods" value="*"/>
<parameter name="className"
value="HelloWorld"/>
<requestFlow>
<handler
type="soapmonitor"/>
<handler
type="java:com.annlee.WSAxis.WSServerRequestHandler">
<parameter name="keyStoreFile" value="f:\server.keystore"/>
<parameter name="trustStoreFile" value="f:\server.truststore"/>
<parameter name="keyStorePassword" value="changeit"/>
<parameter name="keyAlias" value="Server"/>
<parameter
name="keyEntryPassword" value="changeit"/>
<parameter
name="trustStorePassword" value="changeit"/>
<parameter
name="certAlias" value="clientkey"/>
</handler>
</requestFlow>
<responseFlow>
<handler
type="soapmonitor"/>
<handler
type="java:com.annlee.WSAxis.WSServerResponseHandler">
<parameter name="keyStoreFile" value="f:\server.keystore"/>
<parameter name="trustStoreFile" value="f:\server.truststore"/>
<parameter name="keyStorePassword" value="changeit"/>
<parameter name="keyAlias" value="Server"/>
<parameter
name="keyEntryPassword" value="changeit"/>
<parameter
name="trustStorePassword" value="changeit"/>
<parameter
name="certAlias" value="clientkey"/>
</handler>
</responseFlow>
</service>
2)修改客户端程序
TestClient.java(修改的部分已标出,记着导入ws-axis.jar)
import
javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import
org.apache.axis.client.Service;
import com.annlee.WSAxis.*;
public
class WSSClient1
{
public static void main(String [] args)
{
try
{
//服务端的url,需要根据情况更改。
String endpointURL = "http://localhost:8080/axis/services/HelloWorld";
Service svc = new
Service();
WSClientHandler handler=new
WSClientRequestHandler();
//注意新加的HANDLER
handler.setInitialization("f:/client.keystore","changeit","Client","changeit",
"f:/client.truststore","changeit","serverkey");//初始化
WSClientHandler
handlee=new WSClientResponseHandler();
//注意新加的HANDLER
handlee.setInitialization("f:/client.keystore","changeit","Client","changeit",
"f:/client.truststore","changeit","serverkey");//初始化
Call call
=(Call)svc.createCall();
call.setClientHandlers(handler,handlee);//添加Handler
call.setTargetEndpointAddress(new java.net.URL(endpointURL));
call.setOperationName(new QName("sayHello"));
String result = (String)
call.invoke( new Object [] {});
System.out.println("the
result"+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行的时候http://localhost:8080/axis/SOAPMonitor中看到的请求的XML就已加密!
总结
这里对代码的解释是不够的,很多概念没有提到。建议你最好看tsik.jar和AXIS的API深入了解。另外对ws-axis.jar的加解密实现打算运用apache的wss4j,相关网址http://ws.apache.org/ws-fx/wss4j/。不过这个东西也应该够用了暂时。
发表评论
-
AXIS第五课:AXIS高级应用,在AXIS服务间传递javabean及安全解决方案
2010-11-25 08:07 1102http://hanyexiaoxiao.iteye ... -
AXIS第三课:AXIS高级应用,使用Handler来增强web服务的功能
2010-11-25 08:06 1149http://hanyexiaoxiao.iteye ... -
AXIS第二课:工程应用中的AXIS发布方法
2010-11-25 08:05 1275http://hanyexiaoxiao.iteye ... -
AXIS第一课:最简单的AXIS发布webservice
2010-11-25 08:05 1677http://hanyexiaoxiao.iteye ... -
Axis2 WS-Security 基础
2010-11-25 08:04 3921(From: http://reeboo.iteye ... -
wss4j和axis2实现WS-Security
2010-11-25 08:02 1308一、wss4j简介 Wss4j是apache开 ... -
AXIS2中OMElement和Java对象之间的转换 分享
2010-11-25 08:01 1191转自 http://hanyexiaoxiao.itey ... -
Handler and Phase in Apache Axis2
2010-11-25 06:31 1619转自 http://www.packtpub.com ... -
设计与开发 JAX-WS 2.0 Web 服务
2010-11-25 06:29 1182转自 http://www.ibm.co ...
相关推荐
4. **AXIS第四课:AXIS高级应用,建立安全的AXIS服务** 安全性是Web服务不可或缺的一部分。在这一课,我们将探讨如何在Axis中实现安全性,包括使用HTTPS协议、WS-Security规范(如数字签名和加密)来保护数据传输的...
3. **模块化架构**:Axis2采用了模块化设计,允许开发者根据需要选择和组合不同的功能模块,实现轻量级或企业级的应用。 4. **高级功能**:包括MTOM(Message Transmission Optimization Mechanism)和SWA(Soap ...
3. **服务架构**:Axis2使用服务架构(Service Archiver,AAR)来打包Web服务。AAR文件是一种ZIP格式的归档,包含了服务相关的所有元数据、Java类和服务配置。在`services`目录下,你可以找到示例服务的AAR文件,...
4. **消息引擎**:Axis2的消息引擎负责处理SOAP消息,包括解析、序列化以及处理WS-I(Web Services Interoperability)规范中的各种消息模式。 5. **服务组件模型**:Axis2支持多种服务组件模型,如AAR(Axis ...
Axis2 常见异常总结 Axis2 是一个流行的WebService框架,它提供了许多功能强大且灵活的特性。...如果我们想使用 invokeRobust 调用服务方法,需要在服务方法中加入返回值使用 axis2 不当造成的异常。
2. **WSDL支持**:Axis能够从Java类自动生成WSDL文档,同时也能够从WSDL文档生成Java绑定代码,实现了WSDL第一类公民的地位。 3. **模块化设计**:Axis通过模块化的架构,可以方便地扩展其功能,如添加新的传输协议...
**第四部分:配置Tomcat** 1. **创建Axis配置文件**:进入Tomcat的conf/Catalina/localhost目录,创建一个名为axis.xml的新XML文件。在文件中添加以下内容: ```xml <!-- Axis 学习工程 --> <Context docBase="F:/...
- **简单易用**:Axis1.4提供了一个简单的命令行工具,可以快速地生成服务端点和客户端代理类,大大简化了Web服务的开发过程。 - **广泛的协议支持**:除了支持SOAP 1.1,Axis1.4还支持HTTP、HTTPS等多种传输协议...
7. **安全性**:Axis2集成了多种安全机制,如Transport Layer Security (TLS)、WS-Security、WS-SecureConversation等,确保Web服务的安全性。 8. **易于部署**:Axis2的部署模型非常直观,可以通过简单的XML配置...
4. **服务组件化**:Axis2引入了Web服务组件(Web Service Components, WSCs),如Service Skeletons和Service Archives,简化了服务开发和部署。 5. **更好的WSDL支持**:Axis2提供了更强大的WSDL处理能力,包括...
4. **samples** 目录:包含了各种示例应用,帮助开发者了解如何使用Axis创建和调用Web服务。 5. **README** 和 **INSTALL** 文件:提供安装和配置指南,以及关于如何开始使用Axis的说明。 6. **doc** 目录:包含API...
- 模块:Axis2支持模块化架构,允许添加自定义功能,如数据绑定、消息处理等。 - 缓存:了解如何使用Axis2的缓存机制,提高服务性能。 - MTOM/XOP:学习如何启用Message Transmission Optimization Mechanism ...
4. 可重用性:Axis 框架的设计原则是可重用性, Handlers 和服务可以在不同的环境中重用。 Axis 框架的工作流程: 1. 传输监听器监听传输协议,将消息传递到 Axis 框架。 2. Axis Engine 管理 Handlers 和 Message...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而Axis和Axis2是两种流行的Java SOAP(简单对象访问协议)框架,用于构建和消费Web服务。本文将深入探讨这两个API,以及它们在Web服务开发中的作用。 ...
在IT行业中,Axis2是Apache软件基金会开发的一个用于构建Web服务和Web服务客户端的框架,主要基于Java语言。本文将详细讲解如何使用Axis2来发布Web服务以及如何生成客户端代码来调用这些服务。 首先,让我们了解...
本文将详细介绍Axis2的API及其在Web服务开发中的应用,同时也会探讨Axis2的帮助文档如何协助开发者更好地理解和使用这个框架。 ### Axis2简介 Axis2是Apache Axis的第二代版本,它在第一代的基础上进行了许多改进和...
4. 调试和监控:AXIS提供了一些工具和日志记录功能,帮助开发者调试和监控Web服务的运行状态。 六、最佳实践 1. 版本控制:为每个服务分配唯一的命名空间,避免版本升级时的冲突。 2. 安全考虑:使用HTTPS和WS-...
在本文中,我们将深入探讨如何使用SpringBoot框架开发基于Axis的Web服务。SpringBoot以其便捷的启动和配置方式,已经成为Java开发中的首选框架之一。而 Axis 是一个流行的Apache项目,用于创建和部署Web服务,它提供...
4. **配置Spring Boot**:为了使Spring Boot能够处理Axis1.4生成的Web服务,你需要配置一个Servlet容器,如Tomcat,来托管这些服务。这通常涉及到在`src/main/resources/META-INF/spring.factories`文件中添加自定义...