- 浏览: 276313 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
Java_zhou:
...
Oracle自定义函数 -
wmj007:
SELECT USER_TAB_COLS.TABLE_NAME ...
Oracle 查询字段详细信息 -
avi9111:
怎么可以个人有一个MQ? 咁威的
使用c#操作IBM WebSphere MQ -
chouchouzzj:
8个小时。。。让我想起了世界时和北京时之间的差距,MQ存在时区 ...
使用c#操作IBM WebSphere MQ
建立安全的AXIS服务
在前面的文章中,我们实现了最简单的AXIS服务。现在我们一起来讨论一下Web服务的安全问题。
根据应用的对安全要求的级别不同,可以采用不同的方式来实现安全性,以下是目前最常用的一些实现方式(从低到高排列):
1、J2EEWeb应用默认的访问控制(数据是明文的);
2、使用axis的Handler进行访问控制(数据是明文的);
3、使用Servlet过滤器(Filter)进行访问控制(数据是明文的);
4、使用SSL/HTTPS协议来传输(加密的数据传输协议);
5、使用WS-Security规范对信息进行加密与身份认证(数据被加密传输)。
我们仅讨论第2、4、5种实现方式。在此之前我们先来了解一下AXIS自带的一个工具SOAPMonitor。
一、SOAPMonitor的使用
打开http://localhost:8080/axis/进入AXIS的主页面,你会看见:
SOAPMonitor-[disabledbydefaultforsecurityreasons],默认状态下其是不可用的,现在我们就来激活它。
1、到目录%TOMCAT_HOME%\webapps\axis下,你会找到SOAPMonitorApplet.java,在命令行中编译它:
javac-classpath%AXIS_HOME%\lib\axis.jarSOAPMonitorApplet.java
编译完之后你会看见目录下多了很多CLASS文件,它们的名字是SOAPMonitorApplet*.class
2、在目录%TOMCAT_HOME%\webapps\axis\WEB-INF下打开server-config.wsdd文件,将下面的两部分代码直
接加入其中相应的位置
第一部分:
<handlername="soapmonitor"type="java:org.apache.axis.handlers.SOAPMonitorHandler">
<parametername="wsdlURL"value="/axis/SOAPMonitorService-impl.wsdl"/>
<parametername="namespace"value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
<parametername="serviceName"value="SOAPMonitorService"/>
<parametername="portName"value="Demo"/>
</handler>
第二部分:
<servicename="SOAPMonitorService"provider="java:RPC">
<parametername="allowedMethods"value="publishMessage"/>
<parametername="className"value="org.apache.axis.monitor.SOAPMonitorService"/>
<parametername="scope"value="Application"/>
</service>
3、选择你要监控的服务
以上次的HelloWorld服务为例,在server-config.wsdd中你会找到这段代码
<servicename="HelloWorld"provider="java:RPC">
<parametername="allowedMethods"value="sayHello"/>
<parametername="className"value="HelloWorld"/>
</service>
在这段代码中加入以下的代码:
<requestFlow>
<handlertype="soapmonitor"/>
</requestFlow>
<responseFlow>
<handlertype="soapmonitor"/>
</responseFlow>
最后的样子是:
<servicename="HelloWorld"provider="java:RPC">
<requestFlow>
<handlertype="soapmonitor"/>
</requestFlow>
<responseFlow>
<handlertype="soapmonitor"/>
</responseFlow>
<parametername="allowedMethods"value="sayHello"/>
<parametername="className"value="HelloWorld"/>
</service>
这样HelloWorld服务就被监控了
4、启动Tomcat,打开http://localhost:8080/axis/SOAPMonitor,你就会看到Applet界面,在
jbuilder2005中运行我们上次写的客户端程序TestClient.java。OK!你会在Applet界面看
见客户端与服务器端互发的XML内容,注意这里是明文!
二、使用axis的Handler进行访问控制(对安全要求不高时推荐)
axis为Web服务的访问控制提供了相关的配置描述符,并且提供了一个访问控制的简单Handler。默认情况下,你只要在配置描述符中添加用户,然后在Web服务器的部署描述符中自动允许的角色即可。
1、在axis的配置文件users.lst(位于WEB-INF目录下)中添加一个用户,如"ronghao1111",表示
用户名为ronghao,密码为1111。
2、把例HelloWorld的Web服务重新部署(新加的部分已标出)
<servicename="HelloWorld"provider="java:RPC">
<requestFlow>
<handlertype="soapmonitor"/>
<handlertype="Authenticate"/>//新加的AXIS自带的Handler
</requestFlow>
<responseFlow>
<handlertype="soapmonitor"/>
</responseFlow>
<parametername="allowedMethods"value="sayHello"/>
<parametername="allowedRoles"value="ronghao"/>//注意,这里是新加的部分!
<parametername="className"value="HelloWorld"/>
</service>
在这个部署描述符中,指定HelloWorld服务只能被ronghao访问
3、修改客户端程序TestClient.java,增加访问用户名、密码(新加的部分已标出)
TestClient.java
importorg.apache.axis.client.Call;
importorg.apache.axis.client.Service;
importjavax.xml.rpc.ParameterMode;
publicclassTestClient
{
publicstaticvoidmain(String[]args)throwsException{
Stringendpoint="http://localhost:"+"8080"+"/axis/HelloWorld";
Serviceservice=newService();
Callcall=(Call)service.createCall();
call.getMessageContext().setUsername("ronghao");//用户名。
call.getMessageContext().setPassword("1111");//密码
call.setTargetEndpointAddress(newjava.net.URL(endpoint));
call.setOperationName("sayHello");
Stringres=(String)call.invoke(newObject[]{});
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-aliasServer-keystoreserver.keystore-keyalgRSA
输入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-aliasServer-filetest_axis.cer-storepasschangeit-keystoreserver.keystore
然后把RSA证书输入到一个新的信任库文件中。这个信任库被客户端使用,被用来验证服务器端的身份。
keytool-import-filetest_axis.cer-storepasschangeit-keystoreclient.truststore-aliasserverkey-noprompt
以上命令执行完成后,将获得一个名为client.truststore的信任库。
3)同理生成客户端的密匙库client.keystore和服务器端的信任库server.truststore.方便起见给出.bat文件
gen-cer-store.bat内容如下:
setSERVER_DN="CN=Server,OU=ec,O=ec,L=BEIJINGC,S=BEIJING,C=CN"
setCLIENT_DN="CN=Client,OU=ec,O=ec,L=BEIJING,S=BEIJING,C=CN"
setKS_PASS=-storepasschangeit
setKEYINFO=-keyalgRSA
keytool-genkey-aliasServer-dname%SERVER_DN%%KS_PASS%-keystoreserver.keystore%KEYINFO%-keypasschangeit
keytool-export-aliasServer-filetest_axis.cer%KS_PASS%-keystoreserver.keystore
keytool-import-filetest_axis.cer%KS_PASS%-keystoreclient.truststore-aliasserverkey-noprompt
keytool-genkey-aliasClient-dname%CLIENT_DN%%KS_PASS%-keystoreclient.keystore%KEYINFO%-keypasschangeit
keytool-export-aliasClient-filetest_axis.cer%KS_PASS%-keystoreclient.keystore
keytool-import-filetest_axis.cer%KS_PASS%-keystoreserver.truststore-aliasclientkey-noprompt
好的,现在我们就有了四个文件:server.keystore,server.truststore,client.keystore,client.truststore
2、更改Tomcat的配置文件(server.xml),增加以下部署描述符:(其实里面有,只是被注释掉了)
<Connectorport="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中修改如下部署代码。(还原了而已)
<servicename="HelloWorld"provider="java:RPC">
<requestFlow>
<handlertype="soapmonitor"/>
</requestFlow>
<responseFlow>
<handlertype="soapmonitor"/>
</responseFlow>
<parametername="allowedMethods"value="sayHello"/>
<parametername="className"value="HelloWorld"/>
</service>
4、修改客户端程序TestClient.java(修改的部分已标出)
publicclassTestClient
{
publicstaticvoidmain(String[]args)throwsException{
Stringendpoint="https://localhost:"+"8440"+"/axis/HelloWorld";//注意区别在这里!https!
Serviceservice=newService();
Callcall=(Call)service.createCall();
call.setTargetEndpointAddress(newjava.net.URL(endpoint));
call.setOperationName("sayHello");
Stringres=(String)call.invoke(newObject[]{});
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、TrustServicesIntegrationKit提供了一个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
publicclassWSHelper{
staticStringPROVIDER="ISNetworks";//JSSE安全提供者。
//添加JSSE安全提供者,你也可以使用其它安全提供者。只要支持DESede算法。这是程序里动态加载还可以在JDK中静态加载
static
{
java.security.Security.addProvider(newcom.isnetworks.provider.jce.ISNetworksProvider());
}
/**
*对XML文档进行数字签名。
*/
publicstaticvoidsign(Documentdoc,Stringkeystore,Stringstoretype,
Stringstorepass,Stringalias,Stringkeypass)throwsException{
FileInputStreamfileInputStream=newFileInputStream(keystore);
java.security.KeyStorekeyStore=java.security.KeyStore.getInstance(storetype);
keyStore.load(fileInputStream,storepass.toCharArray());
PrivateKeykey=(PrivateKey)keyStore.getKey(alias,keypass.toCharArray());
X509Certificatecert=(X509Certificate)keyStore.getCertificate(alias);
SigningKeysk=SigningKeyFactory.makeSigningKey(key);
KeyInfoki=newKeyInfo();
ki.setCertificate(cert);
WSSecuritywSSecurity=newWSSecurity();//ws-security.jar中包含的WSSecurity类
wSSecurity.sign(doc,sk,ki);//签名。
}
/**
*对XML文档进行身份验证。
*/
publicstaticbooleanverify(Documentdoc,Stringkeystore,Stringstoretype,
Stringstorepass)throwsException{
FileInputStreamfileInputStream=newFileInputStream(keystore);
java.security.KeyStorekeyStore=java.security.KeyStore.getInstance(storetype);
keyStore.load(fileInputStream,storepass.toCharArray());
TrustVerifierverifier=newX509TrustVerifier(keyStore);
WSSecuritywSSecurity=newWSSecurity();
MessageValidity[]resa=wSSecurity.verify(doc,verifier,null,null);
if(resa.length>0)
returnresa[0].isValid();
returnfalse;
}
/**
*对XML文档进行加密。必须有JSSE提供者才能加密。
*/
publicstaticvoidencrypt(Documentdoc,Stringkeystore,Stringstoretype,
Stringstorepass,Stringalias)throwsException{
try
{
FileInputStreamfileInputStream=newFileInputStream(keystore);
java.security.KeyStorekeyStore=java.security.KeyStore.getInstance(storetype);
keyStore.load(fileInputStream,storepass.toCharArray());
X509Certificatecert=(X509Certificate)keyStore.getCertificate(alias);
PublicKeypubk=cert.getPublicKey();
KeyGeneratorkeyGenerator=KeyGenerator.getInstance("DESede",PROVIDER);
keyGenerator.init(168,newSecureRandom());
SecretKeykey=keyGenerator.generateKey();
KeyInfoki=newKeyInfo();
ki.setCertificate(cert);
WSSecuritywSSecurity=newWSSecurity();
//加密。
wSSecurity.encrypt(doc,key,AlgorithmType.TRIPLEDES,pubk,AlgorithmType.RSA1_5,ki);
}
catch(Exceptione)
{
e.printStackTrace();
}
}
/**
*对文档进行解密。
*/
publicstaticvoiddecrypt(Documentdoc,Stringkeystore,Stringstoretype,
Stringstorepass,Stringalias,Stringkeypass)throwsException{
FileInputStreamfileInputStream=newFileInputStream(keystore);
java.security.KeyStorekeyStore=java.security.KeyStore.getInstance(storetype);
keyStore.load(fileInputStream,storepass.toCharArray());
PrivateKeyprvk2=(PrivateKey)keyStore.getKey(alias,keypass.toCharArray());
WSSecuritywSSecurity=newWSSecurity();
//解密。
wSSecurity.decrypt(doc,prvk2,null);
WsUtils.removeEncryptedKey(doc);//从WS-SecurityHeader中删除EncryptedKey元素
}
publicstaticvoidremoveWSSElements(Documentdoc)throwsException{
WsUtils.removeWSSElements(doc);//删除WSS相关的元素。
}
}
WSClientHandler.java
//继承自org.apache.axis.handlers.BasicHandler即AXIS内在的
publicclassWSClientHandlerextendsBasicHandler{
protectedStringkeyStoreFile;
protectedStringkeyStoreType="JKS";//默认
protectedStringkeyStorePassword;
protectedStringkeyAlias;
protectedStringkeyEntryPassword;
protectedStringtrustStoreFile;
protectedStringtrustStoreType="JKS";//默认
protectedStringtrustStorePassword;
protectedStringcertAlias;
publicvoidsetInitialization(StringkeyStoreFile,StringkeyStoreType,StringkeyStorePassword,
StringkeyAlias,StringkeyEntryPassword,StringtrustStoreFile,
StringtrustStoreType,StringtrustStorePassword,StringcertAlias){
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;
}
publicvoidsetInitialization(StringkeyStoreFile,StringkeyStorePassword,
StringkeyAlias,StringkeyEntryPassword,StringtrustStoreFile,
StringtrustStorePassword,StringcertAlias){
this.keyStoreFile=keyStoreFile;
this.keyStorePassword=keyStorePassword;
this.keyAlias=keyAlias;
this.keyEntryPassword=keyEntryPassword;
this.trustStoreFile=trustStoreFile;
this.trustStorePassword=trustStorePassword;
this.certAlias=certAlias;
}
publicvoidinvoke(MessageContextmessageContext)throwsAxisFault{//在这个方法里对XML文档进行处理
//donothingnow!
}
publicvoidonFault(MessageContextmsgContext){
System.out.println("处理错误,这里忽略!");
}
}
WSClientRequestHandler.java
publicclassWSClientRequestHandlerextendsWSClientHandler{
publicvoidinvoke(MessageContextmessageContext)throwsAxisFault{
try{
SOAPMessagesoapMessage=messageContext.getMessage();
Documentdoc=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(Exceptione){
System.err.println("在处理响应时发生以下错误:"+e);
e.printStackTrace();}
}
}
WSClientResponseHandler.java
publicclassWSClientResponseHandlerextendsWSClientHandler{
publicvoidinvoke(MessageContextmessageContext)throwsAxisFault{
try{
SOAPMessagesoapMessage=messageContext.getCurrentMessage();
Documentdoc=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(Exceptione){
e.printStackTrace();
System.err.println("在处理响应时发生以下错误:"+e);
}
}
}
WSServerHandler.java
publicclassWSServerHandlerextendsBasicHandler{
protectedStringkeyStoreFile;
protectedStringkeyStoreType="JKS";//默认
protectedStringkeyStorePassword;
protectedStringkeyAlias;
protectedStringkeyEntryPassword;
protectedStringtrustStoreFile;
protectedStringtrustStoreType="JKS";//默认
protectedStringtrustStorePassword;
protectedStringcertAlias;
publicvoidinvoke(MessageContextmessageContext)throwsAxisFault{
//donothingnow!
}
publicvoidonFault(MessageContextmsgContext){
System.out.println("处理错误,这里忽略!");
}
publicvoidinit(){//初始化,从配置文件server-config.wsdd中读取属性
keyStoreFile=(String)getOption("keyStoreFile");
if((keyStoreFile==null))
System.err.println("PleasekeyStoreFileconfiguredfortheHandler!");
trustStoreFile=(String)getOption("trustStoreFile");
if((trustStoreFile==null))
System.err.println("PleasetrustStoreFileconfiguredfortheHandler!");
keyStorePassword=(String)getOption("keyStorePassword");
if((keyStorePassword==null))
System.err.println("PleasekeyStorePasswordconfiguredfortheHandler!");
keyAlias=(String)getOption("keyAlias");
if((keyAlias==null))
System.err.println("PleasekeyAliasconfiguredfortheHandler!");
keyEntryPassword=(String)getOption("keyEntryPassword");
if((keyEntryPassword==null))
System.err.println("PleasekeyEntryPasswordconfiguredfortheHandler!");
trustStorePassword=(String)getOption("trustStorePassword");
if((trustStorePassword==null))
System.err.println("PleasetrustStorePasswordconfiguredfortheHandler!");
certAlias=(String)getOption("certAlias");
if((certAlias==null))
System.err.println("PleasecertAliasconfiguredfortheHandler!");
if((getOption("keyStoreType"))!=null)
keyStoreType=(String)getOption("keyStoreType");
if((getOption("trustStoreType"))!=null)
trustStoreType=(String)getOption("trustStoreType");
}
}
WSServerRequestHandler.java
publicclassWSServerRequestHandlerextendsWSServerHandler{
publicvoidinvoke(MessageContextmessageContext)throwsAxisFault{
try{
SOAPMessagemsg=messageContext.getCurrentMessage();
Documentdoc=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(Exceptione){
e.printStackTrace();
System.err.println("在处理响应时发生以下错误:"+e);
}
}
}
WSServerResponseHandler.java
publicclassWSServerResponseHandlerextendsWSServerHandler{
publicvoidinvoke(MessageContextmessageContext)throwsAxisFault{
try{
SOAPMessagesoapMessage=messageContext.getMessage();
System.out.println("返回的原始消息:");
soapMessage.writeTo(System.out);
Documentdoc=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(Exceptione){
System.err.println("在处理响应时发生以下错误:"+e);
e.printStackTrace();
}
}
}
6、应用
为方便使用,把上述文件打包为ws-axis.jar,放入%TOMCAT_HOME%\webapps\axis\WEB-INF\lib
1)把HelloWorld重新部署一次,在server-config.wsdd中修改如下部署代码。
<servicename="HelloWorld"provider="java:RPC">
<parametername="allowedMethods"value="*"/>
<parametername="className"value="HelloWorld"/>
<requestFlow>
<handlertype="soapmonitor"/>
<handlertype="java:com.ronghao.WSAxis.WSServerRequestHandler">
<parametername="keyStoreFile"value="f:\server.keystore"/>
<parametername="trustStoreFile"value="f:\server.truststore"/>
<parametername="keyStorePassword"value="changeit"/>
<parametername="keyAlias"value="Server"/>
<parametername="keyEntryPassword"value="changeit"/>
<parametername="trustStorePassword"value="changeit"/>
<parametername="certAlias"value="clientkey"/>
</handler>
</requestFlow>
<responseFlow>
<handlertype="soapmonitor"/>
<handlertype="java:com.ronghao.WSAxis.WSServerResponseHandler">
<parametername="keyStoreFile"value="f:\server.keystore"/>
<parametername="trustStoreFile"value="f:\server.truststore"/>
<parametername="keyStorePassword"value="changeit"/>
<parametername="keyAlias"value="Server"/>
<parametername="keyEntryPassword"value="changeit"/>
<parametername="trustStorePassword"value="changeit"/>
<parametername="certAlias"value="clientkey"/>
</handler>
</responseFlow>
</service>
2)修改客户端程序TestClient.java(修改的部分已标出,记着导入ws-axis.jar)
importjavax.xml.namespace.QName;
importorg.apache.axis.client.Call;
importorg.apache.axis.client.Service;
importcom.ronghao.WSAxis.*;
publicclassWSSClient1
{
publicstaticvoidmain(String[]args)
{
try{
//服务端的url,需要根据情况更改。
StringendpointURL="http://localhost:8080/axis/services/HelloWorld";
Servicesvc=newService();
WSClientHandlerhandler=newWSClientRequestHandler();
//注意新加的HANDLER
handler.setInitialization("f:/client.keystore","changeit","Client","changeit",
"f:/client.truststore","changeit","serverkey");//初始化
WSClientHandlerhandlee=newWSClientResponseHandler();
//注意新加的HANDLER
handlee.setInitialization("f:/client.keystore","changeit","Client","changeit",
"f:/client.truststore","changeit","serverkey");//初始化
Callcall=(Call)svc.createCall();
call.setClientHandlers(handler,handlee);//添加Handler
call.setTargetEndpointAddress(newjava.net.URL(endpointURL));
call.setOperationName(newQName("sayHello"));
Stringresult=(String)call.invoke(newObject[]{});
System.out.println("theresult"+result);
}catch(Exceptione){
e.printStackTrace();
}
}
}
运行的时候http://localhost:8080/axis/SOAPMonitor中看到的请求的XML就已加密!
总结
这里对代码的解释是不够的,很多概念没有提到。建议你最好看tsik.jar和AXIS的API深入了解。另外对ws-axis.jar的加解密实现打算运用apache的wss4j,相关网址http://ws.apache.org/ws-fx/wss4j/。不过这个东西也应该够用了暂时。所有的源文件在附件中附件:soapTest.zip(279K)
选自:http://bound.blogdriver.com/bound/1120157.html
相关推荐
8. **安全特性**: Axis2支持多种安全机制,如WS-Security、WS-SecureConversation和WS-Trust,确保Web服务的安全通信。 9. **消息处理**: Axis2包含一个强大的消息引擎,能够处理复杂的SOAP消息结构,包括处理头...
这使得开发者能够快速地建立基于Web服务的应用。 2. **客户端支持**:Axis不仅提供服务端的实现,还包括客户端调用Web服务的能力。它能够生成客户端的代理类,使得调用远程服务就像调用本地方法一样简单。 3. **...
4. **AXIS第四课:AXIS高级应用,建立安全的AXIS服务** 安全性是Web服务不可或缺的一部分。在这一课,我们将探讨如何在Axis中实现安全性,包括使用HTTPS协议、WS-Security规范(如数字签名和加密)来保护数据传输的...
这个框架是建立在 Axis1 的基础上,但设计更加模块化和可扩展。Axis2-1.4 版本是该框架的一个稳定版本,提供了许多改进和新特性。 1. **模块化设计**:Axis2 的模块化设计使得它可以根据需求来选择和配置不同的功能...
2. **模块化架构**:Axis2采用模块化设计,允许开发者按需选择和组合功能,比如安全、事务处理和性能优化模块。 3. **Message Receiver**:Axis2支持多种消息接收器,如HTTP、JMS或本地调用,这使得它能与不同的...
5. **强大的WS-*支持**:Axis2对诸如WS-Security、WS-ReliableMessaging等WS-*标准有良好的支持,确保了Web服务的安全性和可靠性。 6. **丰富的API和工具**:提供了丰富的Java API以及命令行工具,方便开发者进行...
3. **安全性**:提供了一套完整的安全机制,包括身份验证、授权、加密和数字签名等,确保了Web服务的安全性。 4. **易于使用**:Axis2提供了一个直观的API,简化了Web服务的开发过程。 5. **SOAP与REST支持**:不仅...
为了实现这个实例,开发者首先需要在Myeclipse中创建一个新的AXIS2 Web服务项目,然后导入`webbook.sql`并执行来建立数据库环境。接着,编写服务器端代码,定义服务接口和实现,确保它们能够正确连接到数据库并执行...
#### 四、AXIS高级应用,建立安全的AXIS服务 **知识点概述:** 本节探讨如何构建安全的Axis Web服务,包括身份验证、加密等措施。 **知识点详述:** 1. **安全需求分析** - 确定安全需求,如用户身份验证、数据...
注意,由于是HTTPS,所以在调用前可能需要建立SSL连接,处理身份验证等安全操作。 5. **处理异常**:在调用过程中,可能会遇到SSL相关的异常,如`CertificateException`, `KeyManagementException`, `...
"Axis安讯士摄像头rtsp视频流数据获取程序" 是一个专用于与Axis品牌安讯士摄像头进行交互的软件程序,主要功能是获取并处理来自摄像头的实时传输协议(RTSP)视频流数据。Axis安讯士是知名的专业网络摄像头制造商,...
从理论到实践,从基础到高级,全面覆盖了Axis2的使用和开发流程,帮助学员建立扎实的WebService开发基础。 ### 结语 通过本文的综述,我们深入了解了Axis2作为WebService引擎的强大功能和应用场景,以及如何通过...
综上所述,建立Web服务是一个涉及接口设计、实现、发布、测试、安全和维护等多个环节的过程。选择合适的技术栈、遵循最佳实践并注重安全性,将有助于构建高效、可靠的Web服务,实现跨系统的数据交换和业务协同。
2. **客户端代码**:客户端代码通常包含一个或多个调用服务的方法,使用Axis2的Stub或ServiceClient类来建立与服务的连接并发送请求。它可能还包括了处理响应和异常的部分。 3. **依赖包axis2**:这个可能是一个...
本文介绍了使用Axis2开发Web服务的基本流程,从获取和部署Axis2到建立自定义Web服务的过程。通过对SOAP请求的解析和响应的生成,我们可以实现对特定数据的处理。此外,通过直接操作系统目录级的方式,可以更加灵活地...
总结,Apache Axis为Web服务的开发提供了强大的支持,从简单的服务创建到复杂的安全配置,都提供了一套完整的解决方案。通过熟练掌握Axis的使用,开发者可以轻松构建起跨平台的分布式应用程序,实现系统的无缝连接。
通过这个“Axis2大讲堂”,你可以逐步建立起对Web服务开发和Axis2框架的深入理解,从而提高你的开发技能和项目实施能力。无论是初学者还是有经验的开发者,都能从中受益匪浅,提升自己的专业素养。
4. **连接 Axis2 和 WebSphere MQ**:编写或配置 Axis2 应用程序,使其能够通过JMS API与WebSphere MQ建立连接,发送和接收消息。 5. **测试和调试**:通过发送SOAP请求到Axis2服务,验证消息是否正确地通过...