`
cenwenchu
  • 浏览: 165361 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SSL + WS-Security = Web Service安全保障

阅读更多

SSL &WS-Security--Web Service安全保障<o:p></o:p>

       今天早晨看了一下blog的留言,发现有位朋友给我留了言,提到了他正在研究SCA,同时也有些困惑,当在异构分布式环境的情况下,不论是否使用SCA规范来实现,都采用Web Service来完成面向服务的服务调用,觉得SCA没有什么优势可言。其实这是一个误解,SCA框架规范并不是一个具体的业务场景解决实施规范,它是一种框架结构性规范,它的精华部分主要在于:一.将抽象和封装由对象提升到了业务组件模块 .框架的可扩展性(也就是因为没有实现的约束,才会能够易于扩展)。当然这两点所带来的好处那就是在这么一个精炼的框架核心规范下,不断融入了外界的各种好的技术和理念,就好比现在的Web2.0最重要的一点特质,规范的只是接口(用于统一交互的管理),开放的是接口下的任何贡献,主动参与和主动的集成将会使得框架越来越有活力,Spring就是很好的例子。而SCASpring的差异我也早在前面的文章中说过,SCA和其他的规范一样,并不是一个横空出世的规范,是积累在过去的失败中沉积的产物。最后打了个比方,SCA规范好比一本菜谱,至于采用什么锅子,用哪里产的材料都是由厨师自己掌握,这也是架构师和程序员需要共同努力将这个规范实践的原动力,正确的做事和做正确的事是成败的两个关键。言归正传,继续这次的主题。

在前面的服务框架工作中,对于Web Service的支持成为了这段时间的重点工作,从开始的压力测试,Java客户端的兼容性测试到.net,php客户端的兼容性测试,WS-Security的集成,服务框架对于Web Service的支持在需求中逐渐增强。AEP第一期基本完成准备上线,第二期的需求也已经在酝酿中,ASF的第二期功能需求也逐渐的被提出来了,有一点看上去优先级比较高,因此我就开始动手先做,那就是SSL。一开始的时候对于SSL需求有些误解,以为是要做Web 服务器端的SSL,其实我们需要做的是硬件的SSL,只不过“首架”的意思是需要对SSL模式下的客户端调用作准备(的确,客户端在SSL不论是硬件还是软件模式下都需要作一定的工作)。后续将讲述一下我在做Web 服务器端SSL平台集成的工作和SA专家交流了解的硬件SSL的架构策略。

What is SSL<o:p></o:p>

       虽然以前也对SSL有所闻,也常看到IE突然蹦出一个安全提示框,但是对于SSL的具体原理以及结构没有仔细看过。既然要用了,还是那个原则,先把原理搞清楚,然后再去实践。

       SSL(Secure Socket Layer)是一种通信交互协议,由Netscape公司在1994年制定,主要目的就是确保在web 服务器和浏览器之间数据传输安全。SSL协议层是在TCP/IP层和应用层之间。当前TLS(Transport Layer Security)正在逐渐替代SSL(最新版本v3)

       SSL协议分成以下几部分:

<v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path=" m@4@5 l@4@11@9@11@9@5 xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0 "></v:f><v:f eqn="sum @0 1 0 "></v:f><v:f eqn="sum 0 0 @1 "></v:f><v:f eqn="prod @2 1 2 "></v:f><v:f eqn="prod @3 21600 pixelWidth "></v:f><v:f eqn="prod @3 21600 pixelHeight "></v:f><v:f eqn="sum @0 0 1 "></v:f><v:f eqn="prod @6 1 2 "></v:f><v:f eqn="prod @7 21600 pixelWidth "></v:f><v:f eqn="sum @8 21600 0 "></v:f><v:f eqn="prod @7 21600 pixelHeight "></v:f><v:f eqn="sum @10 21600 0 "></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape coordsize="21600,21600" id="_x0000_i1025" type="#_x0000_t75" o:ole="" style="WIDTH: 333pt; HEIGHT: 112.5pt"><v:imagedata src="SSL&amp;amp;WS-Security--Web%20Service安全保障.files/image001.emz" o:title=""></v:imagedata></v:shape>

       Record ProtocalSSL的基础层,SSL所有的上层操作都是基于这个层次,这层主要负责消息内容的分段,压缩,加密和数字摘要等操作。

       Handshake Protocal故名思义就是握手协议,也是在正式应用数据传输前双方交换加密设置以及认证的流程规范协议。

       Change Cipher Spec Protocol是基于record协议层通知远端服务器修改record协议层中安全设置的协议。

       Alert Protocol是基于record协议发送警告到远端服务器的协议。

<o:p> </o:p>

SSL的具体流程图:

<v:shape coordsize="21600,21600" id="_x0000_i1026" type="#_x0000_t75" style="WIDTH: 342.75pt; HEIGHT: 404.25pt"><v:imagedata src="SSL&amp;amp;WS-Security--Web%20Service安全保障.files/image003.emz" o:title=""></v:imagedata></v:shape>

<o:p> </o:p>

       SSL的流程也体现了对于对称性密钥和非对称性密钥的使用,由于对称性密钥加密比非对称性密钥加密要快1000倍,那么对称性密钥被用来做对内容的加密,而非对称性密钥用来做传递对称性密钥的加密手段。

       服务端所需要具备的是一个拥有服务端的标示,公钥私钥对的证书。在握手的流程中,服务端将带有公钥的证书抽取出来发送给客户端,客户端就首先可以判断证书颁发者是否属于本机受信的CA,如果不是,就会类似于IE跳出提示,如果通过了这部分CA认证,双方就可以通过非对称性加密算法来交换客户端生成的临时对称密码,进行安全加密信息交互。

<o:p> </o:p>

软件SSL的实践<o:p></o:p>

       因为当前所有的单元测试都是通过我提供的ASF模板类,所以启动的Web Service都是服务框架中Jetty发布的Web Service,很轻量级,没有以往测试Web应用的复杂,不需要单独去启动一个Web Container。前期对于WS-Security的集成已经使得单元测试可以支持带WS-SecurityWeb Service的测试。

       抱着试一试的心理,直接用服务框架发布了SSLWeb Service,客户端调用了一下,没有成功,但是错误还不能定位是客户端还是服务端的问题,因此首先去外部配置了Tomcat来建立了一个SSL服务端。

<o:p> </o:p>

Tomcat SSL服务端的配置:(只需要修改一个文件conf/server.xml

    <Connector port="8443" maxHttpHeaderSize="8192"<o:p></o:p>

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<o:p></o:p>

               enableLookups="false" disableUploadTimeout="true"<o:p></o:p>

               acceptCount="100" scheme="https" secure="true"<o:p></o:p>

               clientAuth="false" sslProtocol="TLS" keystoreFile="D:/work/asf/webservice/src/conf.test/keys/alisoft.jks"<o:p></o:p>

               keystorePass="alisoft" keystoreType="jks" truststoreFile="D:/work/asf/webservice/src/conf.test/keys/alisoft.jks"<o:p></o:p>

               truststorePass="alisoft" truststoreType="jks"/><o:p></o:p>

<o:p> </o:p>

clientAuth没有必要配置成为true,不需要重复反向再认证。如果这个值设为false。其他几个值就是生成的服务端证书库位置及密码。这里所要注意的就是要求keystore密码和私钥密码一样,因为只有一个配置密码的地方,这在生成公钥密钥对时两者密码写成一致。这样就OK了,直接访问8443端口就能作为https来访问服务了。

<o:p> </o:p>

采用XFire客户端来做单元测试,代码如下:<o:p></o:p>

public static void SSLSecurityTest()<o:p></o:p>

         {<o:p></o:p>

                   Service serviceModel = new ObjectServiceFactory().create(IAccountService.class);<o:p></o:p>

                   //https的客户端代码需要增加的<o:p></o:p>

                   System.setProperty ( "java.protocol.handler.pkgs" , "com.sun.net.ssl.internal.www.protocol" );<o:p></o:p>

                   System.setProperty ( "javax.net.ssl.keyStore" , "D:/work/asf/webservice/src/conf.test/keys/myisvdemo.jks" ); <o:p></o:p>

                   System.setProperty ( "javax.net.ssl.keyStorePassword" , "myisvdemo" );<o:p></o:p>

                   System.setProperty ( "javax.net.ssl.trustStore" , "D:/work/asf/webservice/src/conf.test/keys/myisvdemo.jks" ); <o:p></o:p>

                   System.setProperty ( "javax.net.ssl.trustStorePassword" , "myisvdemo" );<o:p></o:p>

                   System.setProperty ("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");<o:p></o:p>

                   Security.addProvider ( new com.sun.net.ssl.internal.ssl.Provider()); <o:p></o:p>

                   <o:p></o:p>

                   <o:p></o:p>

                   String serviceUrl = "http://localhost:8080/axis2/services/AccountService";<o:p></o:p>

                   String serviceHttpsUrl = "https://localhost:8443/xfire/services/AccountService";<o:p></o:p>

                   String serviceHttpsUrl2 = "https://localhost:8443/axis2/services/AccountService";<o:p></o:p>

                   <o:p></o:p>

                   try<o:p></o:p>

                   {<o:p></o:p>

                            IAccountService service = (IAccountService)serviceFactory.create(serviceModel,serviceHttpsUrl2);<o:p></o:p>

                            <o:p></o:p>

//WS-Security所需要的配置<o:p></o:p>

                            Client client = ((XFireProxy)Proxy.getInvocationHandler(service)).getClient();<o:p></o:p>

                            client.addOutHandler(new DOMOutHandler());<o:p></o:p>

                            Properties properties = new Properties();<o:p></o:p>

                            properties.setProperty(WSHandlerConstants.ENABLE_SIGNATURE_CONFIRMATION, "false");<o:p></o:p>

                            properties.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.SIGNATURE);<o:p></o:p>

                            //properties.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP);<o:p></o:p>

                            properties.setProperty(WSHandlerConstants.SIG_PROP_FILE, "keys/client.properties");<o:p></o:p>

                            //properties.setProperty(WSHandlerConstants.USER, "myisvdemo");<o:p></o:p>

                            properties.setProperty(WSHandlerConstants.USER, "wenchu");<o:p></o:p>

                            properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, ClientUtPasswordHander.class.getName());<o:p></o:p>

                            //properties.setProperty(WSHandlerConstants.SIG_KEY_ID, "IssuerSerial");//"DirectReference","IssuerSerial","SKIKeyIdentifier"<o:p></o:p>

                            properties.setProperty(WSHandlerConstants.SIG_KEY_ID, "SKIKeyIdentifier");<o:p></o:p>

                            client.addOutHandler(new WSS4JOutHandler(properties));<o:p></o:p>

<o:p> </o:p>

                            AccountBean[] result = service.getUserAccountList("te", "ta");<o:p></o:p>

                            System.out.println(result.length);           <o:p></o:p>

                   }<o:p></o:p>

                   catch(Exception ex){ex.printStackTrace();}<o:p></o:p>

         }<o:p></o:p>

<o:p> </o:p>

       这样保证了客户端的配置已经没有问题了,因此就主要将ASF框架中的SSL集成进去。由于ASF中集成的是Jetty,因此只需要在Jetty动态建立Mapping Server的时候,Serverconnector为以SslSocketConnector类型来构造,这样就可以响应https的部分了,同时也可以在其它端口发布成为不需要SSL的服务。这里细节就略去了,改造不是很复杂,只需要对Jetty较为了解即可。不过这里还是要赞一下Jetty,真是轻量级的好东西啊。集成以后再次作单元测试,OK,测试通过。<o:p></o:p>

<o:p> </o:p>

.Net的客户端测试<o:p></o:p>

       最后就需要对.netSSL的测试,由于.net客户端已经在上次配置了policy作为WS-Security的配置,按照常理来说应该不需要再配置证书之类的东西了,就尝试着做了一下,在建立Web Reference的时候会有提示说证书授权的认证不符合要访问的地址的身份,这个可以忽略。然后接下去测试了一下,就总是提示无法建立TLS/SSL的交互通道,查了一下,只需要加入下面一句话即可:<o:p></o:p>

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };<o:p></o:p>

它的作用就是接受所有的证书,也就是在我们SSL中的流程中,检查证书CA是否受信这部分省略,就好比我们访问一些非受信证书的网站跳出的提示框我们点击确认一样。<o:p></o:p>

到此为止,应用服务器的SSL配置和测试就基本结束了。后面要谈到的就是硬件SSL的结构和设计。<o:p></o:p>

硬件SSL结构设计<o:p></o:p>

       首先为什么要使用SSL来加密呢,干脆用WS-Security就好了,而且WS-Security有着很多SSL所无法做到的特性(不基于传输层,保障非点对点的安全传输,部分加密等等)。但是在前面的压力测试中明显可以看到还没有用到加密,仅仅是签名服务器的CPU消耗就成倍的增长,可见对于性能的影响。同时上面提到的应用服务器SSL,其实也是类似于WS-Security,消耗比较大。因此就提出了硬件SSL的设计。

       这里主要提了两种,第二种也是现在SA比较推荐的。

<o:p> </o:p>

一.              为应用服务器增加独立的SSL加速卡,例如roadcom CryptoNetXM卡,SSL加速卡的作用在于能够将应用服务器处理SSL的工作独立完成,让应用服务器专心处理应用请求,使得应用服务器性能不受影响。

<o:p> </o:p>

<v:shape coordsize="21600,21600" id="_x0000_i1028" type="#_x0000_t75" o:ole="" style="WIDTH: 284.25pt; HEIGHT: 305.25pt"><v:imagedata src="SSL&amp;amp;WS-Security--Web%20Service安全保障.files/image005.emz" o:title=""></v:imagedata></v:shape>

SSL加速卡部署图<o:p></o:p>

<o:p> </o:p>

       由于许多服务器使用的是不同的加密数据,因此管理这样一个Web服务器组会花费比较大并且复杂。同时传统的负载均衡阵列中每一个处理加密服务器要求有一个SSL加速卡和数字证书,而证书是被CA签署过的一个电子认证标识,在加密通信方面提供了一致性的验证,这样对于CA的电子认证标识管理也是很复杂的一件事,因此产生了第二种设计模式。

<o:p> </o:p>

二.              SSL基础结构与BIG-IP结合

BIG-IP是一个运行有BIG-IP负载均衡软件的服务器,它通过SSL加速卡实现了SSLoff-loading,同时还可以实现应用层和IP层的负载均衡。通过SSL终结,前端的BIG-IP负责SSL的集中处理以及同时将处理后的请求负载均衡到各个应用服务器上,这样既降低了SSL证书管理成本,也减少了Web服务器组的管理复杂性。

<v:shape coordsize="21600,21600" id="_x0000_i1027" type="#_x0000_t75" o:ole="" style="WIDTH: 295.5pt; HEIGHT: 330pt"><v:imagedata src="SSL&amp;amp;WS-Security--Web%20Service安全保障.files/image007.emz" o:title=""></v:imagedata></v:shape>

<o:p> </o:p>

<o:p> </o:p>

分享到:
评论

相关推荐

    基于XFire实施WS-Security

    此外,WS-Security家族还包括了WS-SecureConversation、WS-Federation、WS-Authorization、WS-Policy、WS-Trust和WS-Privacy等一系列子规范,这些规范共同构建了一个完整的Web Service安全框架,以满足不同场景下的...

    通向架构师的道路(第十三天)Axis2 Web Service安全初步.docx

    为解决这个问题, Axis2 Web Service提供了多种安全机制,包括使用SSL协议、WS-Security规范、数字签名和数字证书等。其中,WS-Security规范描述了如何向SOAP消息附加签名和加密报头,并提供了一套帮助Web服务开发者...

    java-ws-clients.rar_SOAP Web_Web Service SOAP_axis

    8. **安全性**:SOAP支持多种安全模型,包括基本认证、SSL/TLS加密、WS-Security等。客户端需要配置相应的安全参数来与安全的Web服务进行通信。 9. **性能优化**:通过缓存代理、连接池和消息压缩等技术,可以提高...

    web service安全机制探讨

    首先,网络安全性是Web服务安全的基础,主要通过如SSL(Secure Socket Layer)这样的安全传输层协议来提供。SSL确保了数据在网络中传输时的机密性和完整性,防止中间人攻击和数据篡改。SSL通过建立加密的通道来保护...

    WSIT指南-jax-ws指南

    - **安全性配置**:使用WS-Security时,可以在`web.xml`或Java代码中配置相应的安全策略。 #### 四、总结 通过NetBeans结合JAX-WS 2.0开发Web服务是一种高效的方法。不仅可以快速构建功能完善的Web服务,还可以...

    CXF实现SSL安全验证

    本文将详细介绍如何使用 CXF 实现 SSL 安全验证,并在此基础上构建 HTTPS 的 Web Service。 ### 步骤一:生成密钥库 (Keystore) 首先,我们需要创建一个密钥库(Keystore),这是一个存储私钥和公钥证书的地方。在...

    一种简单的web service服务安全策略

    “工具”可能指的是用于创建和管理Web Service的软件工具,如Apache CXF、axis2等,这些工具提供了内置的安全功能,如WS-Security,帮助开发者轻松地集成安全机制。 【压缩包子文件的文件名称列表】:“ws_test_...

    XML Web Service开发

    XML Web Service的安全性是关键问题,常见的安全措施包括SSL/TLS加密、WS-Security(Web Services Security)提供消息级安全,以及身份验证和授权机制。 七、Web Service的集成 Web Service常被用于系统集成,例如...

    4个Web Service架构项目源码.rar

    源码中可能包含了SSL/TLS、WS-Security等安全机制的实现,这对于理解和实施安全的Web Service至关重要。 通过研究这些项目源码,你将能深入理解Web Service的核心概念,掌握如何设计、实现、测试和部署Web Service...

    CXF Web Service 安全认证出错?求大牛解决

    当遇到"CXF Web Service安全认证出错"的问题时,通常涉及的身份验证、授权、加密等方面。以下是一些可能的原因和解决方案: 1. **身份验证错误**: - **基本认证**:如果使用HTTP的基本认证,确保提供的用户名和...

    构建软件数字安全带系列课程(6):ASP.NET Web Service安全介绍

    - **WS-Security**:一种标准,提供了消息级安全,包括签名、加密和身份验证。 - **Transport层安全**:HTTPS结合SSL/TLS提供通道级别的安全保护,防止数据在传输过程中被截取。 - **Message Queuing (MSMQ)**:...

    ORACLE 培训资料:ORACLE SOA 架构Web Services的安全

    该平台通过支持上述提到的标准,如WS-Security、WS-Policy等,为企业提供了强大的安全框架。更重要的是,这些组件的设计遵循了行业标准,使得它们能够与其他供应商提供的符合标准的产品“热插拔”,即无缝集成,从而...

    jax-ws实现webservice调用

    同时,可以通过SSL/TLS、WS-Security等机制增强Web服务的安全性。 ### 7. 性能优化 为了提高性能,可以启用HTTP连接池、缓存WSDL、使用MTOM(Message Transmission Optimization Mechanism)进行二进制数据传输等...

    XFire Java Web Service 客户端

    此外,XFire还支持安全特性,如基本认证、SSL加密,以及WS-Security标准,确保服务调用的安全性。 五、WebServiceClient文件 在提供的"WebServiceClient"压缩包中,可能包含了XFire客户端使用的示例代码、配置文件...

    Web+Service开发详解,完整的开发手册

    1. SOAP安全:使用WS-Security规范,添加数字签名和加密来保护消息。 2. OAuth和JWT:用于授权和身份验证,确保只有授权的客户端可以访问服务。 3. HTTPS:使用SSL/TLS提供传输层安全,防止数据被窃听。 六、性能...

    Web_Service开发指南

    - **WS-Security**:提供了一套标准,用于对SOAP消息进行加密和签名,保护数据安全。 - **HTTPS**:通过SSL/TLS协议,为Web Service通信提供端到端的加密,防止中间人攻击。 - **身份验证和授权**:通过证书、...

    Web Service 那点事儿(3)—— SOAP 及其安全控制 - ImportNew1

    这可以通过SOAP Header中的安全令牌来实现,如WS-Security标准中的UsernameToken或X.509证书。 2. 数据加密:为了保护数据不被中间人攻击,可以在传输过程中对SOAP Body进行加密,例如使用SSL/TLS协议提供端到端的...

Global site tag (gtag.js) - Google Analytics