WS安全性问题(2)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
 建立安全的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
记录一次迁移 wss WebSocket 的事故   今天是2018年04月21日。   过去的这一个多月里,我的工(开)作(发)任务转战回了游戏。短短的一个月里,催着输出两款h5游戏,再加上对接、联调,想想真是够辛(ku)苦(bi)的。本人负责后端,也就是服务端这块的游戏主流程输出。去年下半年,在前任大佬的带领下,做过一两款棋牌类的手游,虽然目前的运营状况不太乐观。不过好在,过去学的那点皮毛也还没丢光,所以这次写h5后端总体还算顺畅。至于怎么... 阅读详情

相关推荐

实战指南:利用Nginx反向代理为MQTT服务配置统一域名访问入口

本文详细介绍了如何利用Nginx反向代理为MQTT服务配置统一域名访问入口,涵盖TCP、WebSocket(WS)和加密WebSocket(WSS)协议的配置方法。通过实战案例和关键参数解析,帮助开发者实现多协议智能转发,提升物联网项目的专业性和易用性。

weixin_30617797的博客 474

ws-test-page:WebSocket测试页

ws-test-page 从访问页面

Windows Sockets 2库文件:WS2_32.DLL解析

Windows Sockets 2 API是微软推出的用于网络通信编程的接口,它是继Windows Sockets 1.1版本之后的重大更新。2.0版本提供了更广泛的网络协议支持,更加丰富的功能以及对异步通信和多线程环境的优化。随着互联网的发展和应用程序对网络依赖的加深,Windows Sockets 2 API成为构建高性能网络应用的基石。其诞生背景不仅涉及了网络编程的需求变化,还与微软战略层面上的技术转型密切相关,以满足日益增长的互联网服务和应用开发的需要。

weixin_42181686的博客 1577

使用WSE实现Web Service安全----我的第一篇

WSE(Web Services Enhancements)是微软为了使开发者通过.NET创建出更强大,更好用的Web Services而推出功能增强插件。现在最新的版本是WSE2.0(SP2).本文描述了如何使用WSE2.0中的安全功能增强部分来实现安全Web Services。WSE的安全功能增强实现的是WS-Security标准,此标准是WebService自己的安全协议,由IBM, BE

nealbzdn的专栏 1万+

在IBM Business Process Manager Standard中启用WS-Security和传输层安全性

IBM Business Process Manager Standard V8.0.1(IBM BPM)提供了Web服务集成组件,该组件使IBM BPM服务能够调用外部Web服务。 集成组件提供了以下支持:发现Web服务,生成与WSDL相对应的IBM BPM数据类型以及与远程服务交换SOAP消息。 在许多情况下,Web服务调用需要安全地进行。 通常,这是通过使用传输层安全性(TLS)或安...

cuxiong8996的博客 563

使用WebSocket时遇到的问题

问题一:连接失败 这个时候要注意 wss 和 ws 的区别 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。 WSWebSocket )是不安全的 ,容易被窃听,因为任何人只要知道你的ip和端口,任何人都可以去连接通讯。 WSS(Web Socket Secure)是WebSocket的加密版本。 所以线上建议使用WSS 本地测试这样写 var ws = new WebSocket('ws://localhost:8080'); 线上使用域名的情况下这样写 var ws = new

weixin_42475367的博客 4816

阿翔编程学-Web Service 服务安全性

 服务安全性数字证书Ø         相当于身份证件,数字证书是在IE中做为一种身份标识的。Ø         由于Internet网电子商务系统技术使在网上购物的顾客能够极其方便轻松地获得商家和企业的信息,但同时也增加了对某些敏感或有价值的数据被滥用的风险. 为了保证互联网上电子交易及支付的安全性,保密性等,防范交易及支付过程中的欺诈行为,必须在网上建立一种信任机制。这就要求参

曹翔 1340

WSO2/WSF系列框架之设计

wso2/wsf是wso2推出的基于wsf_c的系列web service框架,其关键是提供了对ws-security的全套支持,比如sign、encrytion、timestamp; 目前能够支持的语言包括:Php、Ruby、Perl、C、C++、Java;其中Php我们已经用该框架进行了接入,具体可见http://blog.csdn.net/sfdev/archive/2008/03/29/2

老唐 的专栏 3807

BizTalk 2004/2006面试题!

BizTalk 2004/2006面试题! BPEL4WS: Comparing of BizTalk 2004 and BPEL4WS Which points is the BTS Orchestration different from BPEL4WS in? Which objects in the BTS have different names from BPEL4WS...

diliupeng7839的博客 195

SAML概要

概述安全性断言标记语言(Secure Assertion Markup Language,简称SAML)把S2ML和AuthML规范结合在一起,是OASIS发布的一个复杂规范。顾名思义,SAML是一种标记安全断言的XML扩展,它提供了一种封装验证、授权等安全信息的形式,已经被用来解决SSO(单点登陆)和Web服务安全等重要问题。SAML的版本最初的SAML是由S2ML和AuthML两种规范结合形成

5056

vs2008编译连接出现的一个问题

今天,在编译连接QR解码程序时,总是提示有以下错误: 正在编译... bitstream.cpp codedata.cpp container.cpp ecidecoder.cpp h:\qr码程序\qrdecode(自己建)\qrdecode\qrdecode\ecidecoder.cpp(168) : warning C4996: '_snprintf': This functio

5582

Web服务安全性WS-Security)

Web服务安全性WS-Security)作者:Bob Atkinson,MicrosoftGiovanni Della-Libera,MicrosoftSatoshi Hada,IBMMaryann Hondo,IBMPhillip Hallam-Baker,VeriSignJohannes Klein,MicrosoftBrian LaMacchia,MicrosoftPaul Leach

1336

Web 服务安全性WS-Security 1.0)

本文档的情况 WS-Security 和相关规范只按现状提供,作为回顾和评价。IBM 和 Microsoft 以及 VeriSign 都希望在不久的将来能得到您的投稿和建议。IBM、Microsoft 和 Versign 不以任何方式作出关于规范的保证或陈述。

yuwenruli的专栏 2878

Axis2 WS-Security 基础

安全性对于众多企业服务来说都是一个重要需求。并且,尝试实现自己的安全性也颇具风险,因为任何微小的疏忽都会导致严重的安全漏洞。这些特征引起了 人们对安全处理标准化的兴趣,许多专家为标准作出贡献并避免出现任何个人的疏漏。基于 SOAP 的 Web 服务可以使用广泛支持的 WS-Security 和相关标准来满足它们的安全需求,允许针对每种服务相应地配置安全性。 Apache Axis2 通过...

lylhelin的专栏 287

jax-ws安全验证_(WS-)安全性的高成本

WS-Security在已建立的用于加密和XML加密和签名的行业标准的基础上,为Web服务应用程序提供了一套全面的安全功能。 您可以使用WS-Policy和WS-SecurityPolicy指定要用于特定应用程序的功能,从而允许服务的客户端自动配置自己以访问服务。 跨多个平台和Web服务框架对这些标准的广泛支持,互操作性很好(并且随着时间的推移越来越好)。 尽管有这些好处,WS-Secur...

cuxiong8996的博客 452

axis2 jax-ws_Axis2 WS-Security签名和加密

Web服务交换业务数据时,安全性至关重要。 如果数据被第三方拦截或欺诈性数据被接受为有效数据,则可能导致负面的财务或法律后果。 始终可以为Web服务设计和实现应用程序自己的安全处理(就像任何形式的数据交换一样),但这是一种冒险的方法,因为即使是细微而模糊的监督也可能导致严重的漏洞。 与更简单的数据交换形式相比,SOAP的主要优点之一是它允许模块化扩展。 自从SOAP最初发布以来,安全性一直是...

cuxiong8996的博客 401
上一篇: window cmd命令行中对于空格是敏感的
下一篇: WS安全性(3)
autoair
博客等级 码龄21年 4粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值