首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

建立保险的AXIS服务(上)

2013-08-04 
建立安全的AXIS服务(上)在前面的文章中,我们实现了最简单的AXIS服务。现在我们一起来讨论一下Web服务的安全

建立安全的AXIS服务(上)

在前面的文章中,我们实现了最简单的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="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界面,在
???jbuilder2005中运行我们上次写的客户端程序?TestClient.java。OK!你会在Applet界面看
???见客户端与服务器端互发的XML内容,注意这里是明文!
???
二、使用axis的Handler进行访问控制(对安全要求不高时推荐)
???axis为Web服务的访问控制提供了相关的配置描述符,并且提供了一个访问控制的简单??Handler。默认情况下,你只要在配置描述符中添加用户,然后在Web服务器的部署描述符中自动允许的角色即可。

1、在axis的配置文件users.lst(位于WEB-INF目录下)中添加一个用户,如"ronghao1111",表示
???用户名为ronghao,密码为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="ronghao"/>????//注意,这里是新加的部分!
????<parameter?name="className"?value="HelloWorld"/>
???</service>


??在这个部署描述符中,指定HelloWorld服务只能被ronghao访问
???
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("ronghao");//??用户名。
???????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

?

?

热点排行