Java Web 服务: WS-SecureConversation 性能

看看 Web 服务栈 WS-SecureConversation 性能相比较有何不同

WS-SecureConversation 能让您保证正在进行的 Web 服务消息交换的安全,同时花费比普通 WS-Security 更少的处理开销。在本文中,您将学习如何配置 WS-SecureConversation 并将其用于三个主要的开源 Java™ Web 服务栈:Apache Axis2、Metro 和 Apache CXF。还将看到这三个栈的 WS-SecureConversation 性能上的对比。

Dennis Sosnoski, 架构咨询师和培训师, Sosnoski Software Solutions, Inc.

Dennis Sosnoski 是一名咨询师和培训师,专长是基于 Java 的 XML 和 Web 服务。他有 30 多年的专业软件开发经验,最近 10 年一直致力于服务器端 XML 和 Java 技术方面的工作。Dennis 是开源 JiBX XML Data Binding 框架及相关的 JiBX/WS Web 服务框架的首席开发人员,也是 Apache Axis2 Web 服务框架的提交者。他还是 JAX-WS 2.0 和 JAXB 2.0 规范的专家组成员之一。Java Web Services 系列的资料基于的是 Dennis 的培训课程。



2010 年 8 月 16 日

关于本系列

Web 服务构成了 Java 技术在企业计算应用中的关键部分。在 本系列 文章中,XML 和 Web 服务顾问 Dennis Sosnoski 介绍了对于使用 Web 服务的 Java 开发人员来说比较重要的主要框架和技术。通过跟随本系列的学习,您将了解到该领域的最新进展,并且知道如何使用它们来为您的编程项目提供帮助。

WS-Security 提供了必要的特性以保证商务 Web 服务的安全,但经常会付出沉重的性能代价。在 “WS-Trust 与 WS-SecureConversation” 中,您了解到如何在 WS-Security 和 WS-Trust 上构造 WS-SecureConversation 用对称加密来保证客户端和服务器端持续进行的消息交换的安全。本文中,您将学习如何配置 WS-SecureConversation,用于三个主要开源 Java Web 服务栈 — Apache Axis2、Metro 和 Apache CXF — 还将看到与 WS-Security 非对称加密相比,对性能的影响。

配置 WS-SecureConversation

上篇文章 所讨论的,WS-SecureConversation 消息交换中的客户端首先连接到 Security Token Service (STS) 终端来建立安全上下文,它包含一个共享密钥。然后该共享密钥用作加密及/或与目标服务的签名消息交换。安全上下文由 Security Context Token (SCT) 确认,由 STS 返回到客户端。SCT 由客户端包含在所有对服务的请求中,作为安全对话的一部分, 并被服务在所有响应中引用。

至于普通 WS-Security,安全配置在 WS-Policy 文档中定义。当使用 WS-SecureConversation 时:两个单独的安全配置出现在服务策略中,一个用 STS 用于消息交换,另一个用于目标服务。STS 安全配置嵌在安全对话令牌的策略定义中。

本文中不同的 WS-SecureConversation 性能测试有:

  • 仅签名
  • 仅加密
  • 签名和加密

所有情况下,都使用同样的 STS 安全配置,非对称密钥同时用于签名和加密客户端和 STS 之间数量相对较小的消息交换。清单 1 显示的是用于签名性能测试中已编辑的 WS-Policy 版本,策略应用到 STS 消息交换,以粗体显示( 查看 下载 部分获取本文例子的全部源代码):

清单 1. WS-Policy 用于签名性能测试
 <wsp:Policy wsu:Id="SecureConv" ...>
  <wsp:ExactlyOne>
   <wsp:All>
    <wsap:UsingAddressing xmlns:wsap="http://www.w3.org/2006/05/addressing/wsdl"/>
    <sp:SymmetricBinding>
     <wsp:Policy>
      <sp:ProtectionToken>
       <wsp:Policy>
        <sp:SecureConversationToken sp:IncludeToken=".../IncludeToken/AlwaysToRecipient">
         <wsp:Policy>
          <sp:RequireDerivedKeys/>
          <sp:BootstrapPolicy>
           <wsp:Policy>
            <sp:AsymmetricBinding>
             <wsp:Policy>
              <sp:InitiatorToken>
               <wsp:Policy>
                <sp:X509Token sp:IncludeToken=".../IncludeToken/AlwaysToRecipient">
                 <wsp:Policy>
                  <sp:RequireThumbprintReference/>
                 </wsp:Policy>
                </sp:X509Token>
               </wsp:Policy>
              </sp:InitiatorToken>
              <sp:RecipientToken>
               <wsp:Policy>
                <sp:X509Token sp:IncludeToken=".../IncludeToken/AlwaysToInitiator">
                 <wsp:Policy>
                  <sp:RequireThumbprintReference/>
                 </wsp:Policy>
                </sp:X509Token>
               </wsp:Policy>
              </sp:RecipientToken>
              <sp:AlgorithmSuite>
               <wsp:Policy>
                <sp:TripleDesRsa15/>
               </wsp:Policy>
              </sp:AlgorithmSuite>
              <sp:Layout>
               <wsp:Policy>
                <sp:Strict/>
               </wsp:Policy>
              </sp:Layout>
              <sp:IncludeTimestamp/>
              <sp:OnlySignEntireHeadersAndBody/>
             </wsp:Policy>
            </sp:AsymmetricBinding>
            <sp:SignedParts>
             <sp:Body/>
             <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/>
             ...
             <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing"/>
            </sp:SignedParts>
            <sp:EncryptedParts>
             <sp:Body/>
            </sp:EncryptedParts>
            <sp:Trust13>
             <wsp:Policy>
              <sp:MustSupportIssuedTokens/>
              <sp:RequireClientEntropy/>
              <sp:RequireServerEntropy/>
             </wsp:Policy>
            </sp:Trust13>
           </wsp:Policy>
          </sp:BootstrapPolicy>
         </wsp:Policy>
        </sp:SecureConversationToken>
       </wsp:Policy>
      </sp:ProtectionToken>
      <sp:AlgorithmSuite>
       <wsp:Policy>
        <sp:Basic128Rsa15/>
       </wsp:Policy>
      </sp:AlgorithmSuite>
      <sp:Layout>
       <wsp:Policy>
        <sp:Strict/>
       </wsp:Policy>
      </sp:Layout>
     </wsp:Policy>
    </sp:SymmetricBinding>
    <sp:SignedParts>
     <sp:Body/>
    </sp:SignedParts>
   </wsp:All>
  </wsp:ExactlyOne>
 </wsp:Policy>

至于 WS-Security,用于安全处理(例如密钥库和密码)的额外运行时参数必须以与实现相依赖的方式定义。使用 WS-SecureConversation 还需要 WS-Addressing(至少对于客户端和 STS 之间的对话),并确保 WS-Addressing 是另一与实现相依赖的特性。以下三节中,您将看到三个 Web 服务栈如何各自处理安全运行时参数和 WS-Addressing 使用。


Axis2 配置

WS-SecureConversation 的 Axis2 客户端配置与所有 WS-Security 用法基本相同。如果与 STS 的消息交换使用非对称加密,客户端必须在策略中包含 <ramp:RampartConfig> 元素以提供安全运行时参数。Rampart 配置信息在 STS 和服务自身之间共享。

清单 2 显示本文中性能测试中用到的 Rampart 客户端配置。这与此前文章中 WS-Security 非对称签名和加密的 Axis2 例子中的配置一致。

清单 2. 策略中的 Axis2/Rampart 客户端配置
<wsp:Policy ...>
  <wsp:ExactlyOne>
   <wsp:All>
    ...
    <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> 
      <ramp:user>clientkey</ramp:user>
      <ramp:encryptionUser>serverkey</ramp:encryptionUser>
      <ramp:passwordCallbackClass
        >com.sosnoski.ws.seismic.adb.PWCBHandler</ramp:passwordCallbackClass>
      
      <ramp:signatureCrypto>
        <ramp:crypto provider="org.apache.ws.security.components.crypto.Merlin">
          <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.type"
            >JKS</ramp:property>
          <ramp:property name="org.apache.ws.security.crypto.merlin.file"
            >client.keystore</ramp:property>
          <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.password"
            >nosecret</ramp:property>
        </ramp:crypto>
      </ramp:signatureCrypto>
      
      <ramp:encryptionCrypto>
        <ramp:crypto provider="org.apache.ws.security.components.crypto.Merlin">
          <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.type"
            >JKS</ramp:property>
          <ramp:property name="org.apache.ws.security.crypto.merlin.file"
            >client.keystore</ramp:property>
          <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.password"
            >nosecret</ramp:property>
        </ramp:crypto>
      </ramp:encryptionCrypto>
      
    </ramp:RampartConfig>

   </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

清单 3 显示的是用于配置 Rampart 和激活 WS-Addressing 的 Axis2 客户端代码。Rampart 配置使用此前 Axis2 例子中同样的代码,除了在粗体行中添加了通过启用 addressing 模块激活 WS-Addressing。

清单 3. Axis2 客户端代码
    Options options = client.getOptions();
    options.setProperty(RampartMessageData.KEY_RAMPART_POLICY, policy);
    client.engageModule("addressing");
    client.engageModule("rampart");

Axis2 服务器配置包含在服务档案 (AAR) 文件的 META-INF/services.xml 文件中。至于 Axis2 客户端,基本的 Rampart 配置与之前 WS-Security 非对称和加密的 Axis2 例子中一致。激活服务的 STS 还需要补充一些东西,如清单 4 中已编辑版本的粗体部分:

清单 4. Axis2 服务器 services.xml 添加项
<serviceGroup>
  <service name="seismic-signencr">
    ...
    <module ref="rampart"/>
    <module ref="rahas"/>
    <module ref="addressing"/>;

    <wsp:Policy xmlns:sp=".../ws-sx/ws-securitypolicy/200702"
        xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
        xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd"
        wsu:Id="SecureConv">
      <wsp:ExactlyOne>
        <wsp:All>
          <wsap:UsingAddressing
              xmlns:wsap="http://www.w3.org/2006/05/addressing/wsdl"/>
          <sp:SymmetricBinding>
            ...
          </sp:SymmetricBinding>
          ...

          <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy">
            <ramp:user>serverkey</ramp:user>
            <ramp:encryptionUser>clientkey</ramp:encryptionUser>
            <ramp:passwordCallbackClass
              >com.sosnoski.ws.seismic.adb.PWCBHandler</ramp:passwordCallbackClass>

            <ramp:signatureCrypto>
              ...
            </ramp:signatureCrypto>

            <ramp:encryptionCrypto>
              ...
            </ramp:encryptionCrypto>

          </ramp:RampartConfig>
        </wsp:All>
      </wsp:ExactlyOne>
    </wsp:Policy>

    <parameter name="sct-issuer-config">
      <sct-issuer-config>
        <cryptoProperties>
          <crypto provider="org.apache.ws.security.components.crypto.Merlin">
            <property name="org.apache.ws.security.crypto.merlin.keystore.type"
              >JKS</property>
            <property name="org.apache.ws.security.crypto.merlin.file"
              >server.keystore</property>
            <property name="org.apache.ws.security.crypto.merlin.keystore.password"
              >nosecret</property>
          </crypto>
        </cryptoProperties>
        <addRequestedAttachedRef/>
        <addRequestedUnattachedRef/>

            <!--
               Key computation mechanism
               1 - Use Request Entropy
               2 - Provide Entropy
               3 - Use Own Key
            -->
        <keyComputation>3</keyComputation>

            <!--
               proofKeyType element is valid only if the keyComputation is set to 3
               i.e. Use Own Key

               Valid values are: EncryptedKey & BinarySecret
            -->
        <proofKeyType>BinarySecret</proofKeyType>
      </sct-issuer-config>
    </parameter>

    <parameter name="token-canceler-config">
      <token-canceler-config/>
    </parameter>

  </service>
</serviceGroup>

清单 4 中的第一个添加项是一对 rahasaddressing 的模块引用。rahas 模块是对基本 Rampart 支持的配置添加项,用于激活服务的 STS。addressing 模块激活 WS-Addressing 支持,如 清单 3 客户端代码所示。

清单 4 中第二个添加项是 <parameter name="sct-issuer-config"> 元素和内容。这将配置 STS 以特殊方式发布 SCT。内容中的注释是直接从 Rampart 例中拿过来的;这似乎是这项配置的惟一文档。不幸的是,注释并不准确:在 Axis2 1.5.1/Rampart 1.5 实际测试中,改变 <keyComputation> 值不会影响 STS 操作,它始终会生成一个键并直接返回给客户端。这不符合所采用的策略,它需要客户端和服务器熵合起来生成共享密钥。


CXF 配置

配置 CXF 的 WS-SecureConversation 比 Axis2 方法更简单。在客户端,所要做的就是向客户端使用的 cxf.xml 文件添加安全运行时参数。同样方法可用于常规 WS-Security 的参数,只要用不同的参数名(都以后缀 .sct 结尾)。清单 5 显示的是本文测试中使用的 cxf.xml,SCT 参数粗体显示:

清单 5. CXF 客户端 cxf.xml
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:jaxws="http://cxf.apache.org/jaxws"
   xsi:schemaLocation="http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
   http://cxf.apache.org/jaxws 
   http://cxf.apache.org/schemas/jaxws.xsd">

  <jaxws:client name="{http://ws.sosnoski.com/seismic/wsdl}seismic" createdFromAPI="true">
    <jaxws:properties>
      <entry key="ws-security.signature.properties.sct"
          value="client-crypto.properties"/>
      <entry key="ws-security.signature.username.sct" value="clientkey"/>
      <entry key="ws-security.encryption.properties.sct"
          value="client-crypto.properties"/>
      <entry key="ws-security.encryption.username.sct" value="serverkey"/>
      <entry key="ws-security.callback-handler.sct"
          value="com.sosnoski.ws.seismic.cxf.ClientCallback"/>
    </jaxws:properties>
  </jaxws:client>

</beans>

CXF 中服务器端的配置也很简单,但需要改变定义 CXF 上下文配置的 web.xml 文件和给出单个服务定义的 cxf-servlet.xml 文件。web.xml 文件,如清单 6 所示,添加了一行引用 cxf-extension-addr.xml 配置。加入的引用中包含 CXF 配置的 WS-Addressing 支持,这是客户端和 STS 之间交换消息所需的(还用于客户端和实际服务的消息交换,使用的是 清单 1 策略)。

清单 6. CXF 服务器 web.xml
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
  <display-name>CXFLibrary</display-name>
  <description>CXF Seismic Service</description>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:META-INF/cxf/cxf.xml
      classpath:META-INF/cxf/cxf-extension-soap.xml
      classpath:META-INF/cxf/cxf-servlet.xml 
      classpath:META-INF/cxf/cxf-extension-policy.xml
      classpath:META-INF/cxf/cxf-extension-ws-security.xml
      classpath:META-INF/cxf/cxf-extension-http.xml
      classpath:META-INF/cxf/cxf-extension-addr.xml
     </param-value>
  </context-param>
  <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

清单 7 显示的是 cxf-servlet.xml 配置文件,其中一组 SCT 参数定义对应 清单 5 中客户端部分:

清单 7. CXF 服务器 cxf-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:soap="http://cxf.apache.org/bindings/soap"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
      http://cxf.apache.org/jaxws
      http://cxf.apache.org/schemas/jaxws.xsd">

  <jaxws:endpoint id="Processor"
      implementor="com.sosnoski.ws.seismic.cxf.CxfSeismicImpl"
      wsdlLocation="WEB-INF/wsdl/seismic.wsdl"
      address="/">

    <jaxws:properties>
      <entry key="ws-security.signature.properties.sct" 
          value="server-crypto.properties"/>
      <entry key="ws-security.signature.username.sct" value="serverkey"/>
      <entry key="ws-security.encryption.username.sct" value="useReqSigCert"/>
      <entry key="ws-security.callback-handler.sct"
          value="com.sosnoski.ws.seismic.cxf.ServerCallback"/>
    </jaxws:properties>

  </jaxws:endpoint>
</beans>

Metro 配置

Metro 与 Axis2 一样将自定义内容添加到安全策略来传递运行时参数。还是与 Axis2 一样,传递给 WS-SecureConversation 的参数与 WS-Security 的方式一样。与 Axis2 不同的是,Metro 不需要在服务器添加额外的 STS 配置,这使得 Metro 配置比 Axis2 简单得多。

清单 8 显示的是已编辑过的客户端 WSDL,其中 Metro 安全运行时参数以粗体显示:

清单 8. Metro 客户端 WSDL 及参数
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ...>
  <wsp:Policy xmlns:sp=".../ws-sx/ws-securitypolicy/200702"
      xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
      xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecureConv">
    <wsp:ExactlyOne>
      <wsp:All>
        <wsap:UsingAddressing xmlns:wsap="http://www.w3.org/2006/05/addressing/wsdl"/>
        <sp:SymmetricBinding>
          ...
        </sp:SymmetricBinding>
        ...
        <wssc:KeyStore alias="clientkey" keypass="clientpass" location="client.keystore"
            storepass="nosecret" xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy"
            wspp:visibility="private"
            xmlns:wssc="http://schemas.sun.com/2006/03/wss/client"/>
        <wssc:TrustStore location="client.keystore" peeralias="serverkey"
            storepass="nosecret" xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy"
            wspp:visibility="private"
            xmlns:wssc="http://schemas.sun.com/2006/03/wss/client"/>
      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>
  ...
  <wsdl:service name="SeismicMetro">
    <wsdl:port binding="wns:SeismicBinding" name="seismic">
      <soap:address location="http://localhost:8080/metro-seismic"/>
    </wsdl:port>
  </wsdl:service>

</wsdl:definitions>

清单 9 显示的是服务器端 WSDL,运行时参数也是粗体:

清单 9. Metro 服务器 WSDL 及参数
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ...>
  <wsp:Policy xmlns:sp=".../ws-sx/ws-securitypolicy/200702"
      xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
      xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecureConv">
    <wsp:ExactlyOne>
      <wsp:All>
        <wsap:UsingAddressing xmlns:wsap="http://www.w3.org/2006/05/addressing/wsdl"/>
        <sp:SymmetricBinding>
          ...
        </sp:SymmetricBinding>
        ...
        <wsss:KeyStore alias="serverkey"
            keypass="com.sosnoski.ws.seismic.metro.KeystoreAccess"
            location="server.keystore" storepass="nosecret"
            xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy" wspp:visibility="private"
            xmlns:wsss="http://schemas.sun.com/2006/03/wss/server"/>
        <wsss:TrustStore location="server.keystore" storepass="nosecret"
            xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy" wspp:visibility="private"
            xmlns:wsss="http://schemas.sun.com/2006/03/wss/server"/>
      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>
  ...
  <wsdl:service name="SeismicMetro">
    <wsdl:port binding="wns:SeismicBinding" name="seismic">
      <soap:address location="http://localhost:8080/metro-seismic"/>
    </wsdl:port>
  </wsdl:service>

</wsdl:definitions>

STS 配置其余部分直接从通用策略中取得。


检验性能

性能比较采用与之前文章一样的测试代码,地震数据检索服务。服务使用的是几年中发生的超过 93,000 次地震的数据库。服务请求指定时间范围和地理坐标范围,服务返回指定范围内的所有地震。见 “WS-Security 的大开销”,其中详细介绍测试应用程序和请求/响应消息示例。

如此前文章所述,有两组请求序列用于性能测试。第一组使用 1,000 次请求,查询参数设置为整个地震数据库的一小部分(1,000 次请求返回 816 次匹配的地震)。第二组使用 100 次请求,设置为匹配数据库的较大部分(100 次请求返回 176,745 次匹配地震)。这两个请求序列强调不同的网络服务堆栈的性能特点。第一个显示栈处理少量数据的请求有多快,第二个强调处理大量数据的速度。每个请求序列在不同安全配置下运行多次,结果取每种配置下的最好成绩。测试的安全配置如下:

  • 无安全(plain
  • WS-SecureConversation 对所有请求/响应消息主体签名(sign
  • WS-SecureConversation 对所有请求/响应消息主体加密(encr
  • WS-SecureConversation 对所有请求/响应消息主体加密签名并加密(signencr

测试是在 Mandriva 2009.1 64-bit Linux 系统,Athlon X2 5400+ 处理器和 4GB RAM 上运行,使用的是 Sun (Oracle) Java 1.6.0_18 32-bit JVM(对于给定的堆尺寸,它性能比 64-bit JVM 好得多)。服务器代码运行在 Tomcat 6.0.20 上,配置为使用 1024MB 的堆,客户端代码使用 512MB 堆。测试的 web 服务栈版本是:

  • Axis2 1.5.1 与 Rampart 1.5 发行版
  • Metro 2.0
  • CXF 2.1.8

如果您想在自己的硬件和 JVM 上测试,请查看 下载,获取代码。

性能结果

图 1 显示的是小响应测试系列的测出次数。与 前一组测试 中的表现一样,Metro 在无安全运行时处理这些小消息比 Axis2 和 CXF 快一点,并且这种优势延续到使用 WS-SecureConversation 的测试。总的来说,Metro 在这个小响应系列中比 CXF 快 25%,是 Axis2 的两倍。( 在本文图表中,更短的指示条更好,这表示更快。)

图 1. 小响应测出次数
小响应测出次数

图 2 显示的是小响应系列的测出次数。Metro 还是其中最快的,但不如小响应测试中明显。本例中,CXF 实际上在所有配置中与 Metro 一样,除了 WS-SecureConversation 用于仅签名时。Metro 和 CXF 在所有 WS-SecureConversation 中都比 Axis2 快(快超过 40% )。

图 2. 大响应测出次数
大响应测出次数

WS-SecureConversation 优势

WS-SecureConversation 的一个优势是使用对称加密比使用非对称加密更能取得性能收益。以下三张图片显示实际是如何达到的。对比每个栈使用 WS-Security 及私钥和证书(非对称加密),以及同样的栈使用 WS-SecureConversation 与密钥(对称加密)运行测试的次数。WS-Security 次数从 “CXF 性能比较” 中获取,在同样的硬件和几乎一样的 web 服务栈上运行。(只有 CXF 版本不一样。)由于 WS-Security 测试次数不包括仅加密配置(不支持使用证书),只比较签名与签名加密测试。

图 3 比较了 Axis 2 次数:

图 3. Axis2 性能对比
Axis2 性能对比

图 4 比较了 Metro 次数:

图 4. Metro 性能对比
Metro 性能对比

图 5 比较了 CXF 次数:

图 5. CXF 性能对比
CXF 性能对比

这三张图显示了类似的模式。在小响应中使用 WS-SecureConversation 对称加密的仅签名测试结果要快得多,但当返回大响应时,其优势丧失。在大响应中使用 WS-SecureConversation 对称加密的签名加密测试获得较大性能收益(甚至比仅签名结果更好),但在大响应中明显偏小。

这说明什么?签名消息总是包含预处理,将 XML 转换成标准格式。完成之后,XML 被翻译生成 hash 值。hash 值最终包含在实际签名中,生成的签名是非对称与对称仅有的不同之处。另一方面,加密消息,只对所有 XML 进行小修改。

这就解释了以上结果。当使用非对称加密对很多消息签名时,大多数处理时间花在签名上。如果对大消息签名,更多的时间花在规范化和消化步骤上。对称加密总是比非对称加密快(对大致相当的强度而言),但对签名和加密都有的情况,收益就平均了。


结束语

WS-SecureConversation 能提供大幅性能收益 — 小响应测试中超过双倍 — 对于持续进行的消息交换,与使用私钥证书对 WS-Security 非对称加密对比而言。当授权服务客户端时,收益会更大,这是因为授权步骤在 STS 中处理而不是在对服务的单个请求中处理。

为了能获取收益,WS-SecureConversation 需要正在持续的消息序列处于相对较短时间内。如果用于客户端一次性访问的服务,由于客户端和 STS 之间消息交换的原因,实际是增加了开销。

WS-SecureConversation 支持的交互性可能不如普通 WS-Security。我将在本系列的后续文章中详述。但在下个月的专栏中,我们将首先讨论使用对称加密及常规 WS-Security。


下载

描述名字大小
本文源代码j-jws16-src.zip4.87MB

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology, SOA and web services, Open source
ArticleID=508348
ArticleTitle=Java Web 服务: WS-SecureConversation 性能
publish-date=08162010