Web服务也可以使用SSL作为传输协议。
总结:
使用Web应用模型中基本认证方法来配置Web服务的安全访问以及使用axis的Handler、Servlet的过滤器来进行访问控制,它们都是一些轻量级控制Web服务安全解决方案,因为都是把未加密的信息在网络上传播。使用了SSL作为传输协议后,信息在网络上是加密传输的,但对资源消耗多,并且对客户端要求严格(必须支持SSL),不能满足Web服务访问的便利性。
实例:
(1)
1、使用JDK自带的工具创建密匙库和信任库。(gen-cer-store.bat)。
将以下内容放于bat中,点击即可产生所有的库.如下:
set SERVER_DN="CN=JasonServer, OU=jasonS, O=jasonS, L=shenzhen, S=guangdong, C=CN"
set CLIENT_DN="CN=JasonClient, OU=jasonC, O=jasonC, L=shenzhen, S=guangdong, C=CN"
set KS_PASS=-storepass access
set KEYINFO=-keyalg RSA
echo 生成server.keystore。
keytool -genkey -dname %SERVER_DN% -alias jserver %KS_PASS% %KEYINFO% -keystore
server.keystore -keypass access -keysize 1024 -validity 3650
echo 从server.keystore导出数字证书。
keytool -export -file jason_axis.cer -alias jserver -keystore server.keystore %KS_PASS%
echo 将服务器的数字证书导入到客户端信任的truststore中
keytool -import -file jason_axis.cer -alias serverkey -keystore client.truststore %KS_PASS%
-noprompt
echo 生成client.keystore。
keytool -genkey -dname %CLIENT_DN% -alias jclient %KS_PASS% %KEYINFO% -keystore
client.keystore -keypass access -keysize 1024 -validity 3650
echo 从client.keystore导出数字证书。
keytool -export -file jason_axis.cer -alias jclient -keystore client.keystore %KS_PASS%
echo 将客户端的数字证书导出到服务器信任的truststore中。
keytool -import -file jason_axis.cer -alias clientkey -keystore server.truststore %KS_PASS%
-noprompt
成功创建后,会有产生以下四个文件,其中:
* client.keystore:客户端自身的身份信息;
* client.truststore:客户端所信任的身份信息,在此例中也就是包含了服务器的身份信息;
* server.keystore:服务器自身的身份信息;
* server.truststore:服务器所信任的身份信息(即客户端身份信息)。
(2)
更改Tomcat的配置文件(server.xml),增加以下部署描述符:
<Connector port="8888" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false"
disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true"
clientAuth="true"
keystoreFile="D:\tomcat_bbs\webapps\BBSCS_8_0_3\WEB-INF\wsKeyStores\server.keystore"
keystorePass="access" truststoreFile="D:\tomcat_bbs\webapps\BBSCS_8_0_3\WEB-
INF\wsKeyStores\server.truststore"
truststorePass="access"
sslProtocol="TLS" />
(3)
在server-config.wsdd中,不需要任何配置.只须是最初可以实现web service的配置就可以了.如下:
<service name="WSjLogin" provider="java:RPC">
<parameter name="allowedMethods" value="*" />
<parameter name="className" value="com.laoer.bbscs.webservice.WSjLogin" />
</service>
(4)
修改客户端代码:
原来的:
String endpoint="
http://127.0.0.1:8080/BBSCS_8_0_3/services/WSjLogin
";
现在的: http-->https 8080-->8888
String endpoint="
https://127.0.0.1:8888/BBSCS_8_0_3/services/WSjLogin
";
其它相同,如下:
Service service=new Service();
Call call=(Call)service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName("getMessage");
String bbscsPassword=(String)call.invoke(new Object[]{"shenzhenchufa"});
System.out.println(bbscsPassword);
(5)
设置运行客户端:
5.1
在Eclipse中,只须在'run..'中的VM argument中添加:
-cp %AXISCLASSPATH%
-Djavax.net.ssl.keyStore=D:\tomcat_bbs\webapps\BBSCS_8_0_3\WEB-
INF\wsKeyStores\client.keystore
-Djavax.net.ssl.keyStorePassword=access
-Djavax.net.ssl.trustStore=D:\tomcat_bbs\webapps\BBSCS_8_0_3\WEB-
INF\wsKeyStores\client.truststore
5.2
若在CMD中运行,则用:
java -cp %AXISCLASSPATH%
-Djavax.net.ssl.keyStore=D:\tomcat_bbs\webapps\BBSCS_8_0_3\WEB-
INF\wsKeyStores\client.keystore
-Djavax.net.ssl.keyStorePassword=access
-Djavax.net.ssl.trustStore=D:\tomcat_bbs\webapps\BBSCS_8_0_3\WEB-
INF\wsKeyStores\client.truststore
SSL_WSJLogin
执行即可.可以看到,其传输过程是加密的.与filter,hander不同.