`

不使用客户端证书的 WS-Security

    博客分类:
  • SOA
阅读更多

许多 WS-Security 配置要求客户端和服务器都使用 public/private 密钥对,使用 X.509 证书保证公共密钥的身份。这是使用 WS-Security 进行消息签名或加密中最广泛使用的技术,而且它有一些优势。特别地,客户端证书对请求提供了较严格的客户端身份验证和较严格的签名保证。但是它也有缺点,包括不对称加密的性能开销和每个客户端获取和维护证书的繁琐管理。

WS-SecureConversation 性能 ” 介绍 WS-SecureConversation — 虽然仍然使用客户端证书 — 是如何使用对称加密来减少客户端和服务器之间持续交换消息的性能开销。在本文中,您将会了解您可以如何更一步地打破在普通的 WS-Security 和 WS-SecureConversation 交换方面都需要客户端证书的现状。

不需要客户端证书的加密和签名

使用不对称加密和 public/private 密钥对进行消息的签名和加密是很简单的(至少概念上很简单)。正如在 “Axis2 WS-Security 签名和加密 ” 中所介绍的,您可以使用您的私钥对消息进行签名,并使用接收者的公钥对消息进行加密。任何得到您的公钥(一般以 X.509 证书的形式封装在多层认证中)的人都可以验证您使用私钥生成的签名,但是只有对应私钥的拥有者才能够解密使用公钥加密的消息。

如果客户端没有 public/private 密钥对,您就无法使用完整的不对称加密技术。另外一种方法是对称加密,但是使用对称加密时,您必须拥有只有参与消息交换各方才知道的密钥。您可以如何创建这样一个保密密钥呢?

WS-Security 所使用的技术是要使客户端生成一个保密密钥值,然后再使用不对称加密和服务器公钥对它进行加密,并将它嵌入到一个 <xenc:EncryptedKey> 令牌的请求消息中。客户端可以使用这个保密密钥(或者更安全的做法是使用由保密密钥生成的单独密钥)来对请求消息进行加密和/或签名,而服务器也可以对响应消息做相同的操作。服务器不需要将保密密钥发送回客户端,因为客户端已经拥有了这个保密密钥。

 

WS-SecurityPolicy 配置

使用客户端生成密钥的对称加密的 WS-Policy/WS-SecurityPolicy 配置是很简单的。清单 1 显示的是本文所使用的版本。这个策略使用客户端生成的保密密钥来规定发送到两个方向的消息体加密方式。


清单 1. 用于加密所有消息体的 WS-Policy

				
<wsp:Policy wsu:Id="SymmEncr"
    xmlns:wsu="http://.../oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
    xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:SymmetricBinding>
        <wsp:Policy>
          <sp:ProtectionToken>
            <wsp:Policy>
              <sp:X509Token sp:IncludeToken=".../IncludeToken/Never">
                <wsp:Policy>
                  <sp:RequireDerivedKeys/>
                  <sp:RequireThumbprintReference/>
                  <sp:WssX509V3Token10/>
                </wsp:Policy>
              </sp:X509Token>
            </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:Wss11>
        <wsp:Policy>
          <sp:MustSupportRefKeyIdentifier/>
          <sp:MustSupportRefThumbprint/>
          <sp:MustSupportRefEncryptedKey/>
        </wsp:Policy>
      </sp:Wss11>
      <sp:EncryptedParts>
        <sp:Body/>
      </sp:EncryptedParts>
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

 

清单 1 策略中的 <sp:SymmetricBinding> 断言是配置使用带有保密密钥的对称加密的代码。所嵌入的 <sp:X509Token> 断言表示有一个 X.509 证书将用于保护保密密钥的传输(即,加密所传输的保密密钥),而这是使用指纹引用(本质上是一个散列值)识别的证书。客户端生成的保密密钥是隐式使用带有 <sp:X509Token> 保护令牌的 <sp:SymmetricBinding> 断言。其他策略断言则规定了加密算法的细节和必要的特性,而最终 <sp:EncryptedParts> 断言表示将要使用保密密钥进行加密的 SOAP Body

正如您在之前的文章中看到的,安全性处理的运行时参数(如密钥保存和密码)必须采用与实现无关的方式进行定义。在这里,这些参数是很简单的:客户端需要访问包含服务器证书的可信存储,而服务器端则需要访问包含证书中与公钥相匹配的私有密钥的密钥存储。请阅读这个 系列文章 了解参数在各个协议之间是如何传递的。

 

不使用客户端证书的 WS-SecureConversation

在使用 WS-SecureConversation 时,您可以使用相同的技术在没有客户端证书的情况下处理客户端和 Security Token Service (STS) 之间的消息交换。(阅读 “WS-Trust 和 WS-SecureConversation ” 和 “WS-SecureConversation 性能 ” 了解 WS-SecureConversation 的细节。)要使用这种方法,您基本上需要将 清单 1 的策略替换为 <sp:BootstrapPolicy> ,以实现安全会话。清单 2 显示了这是如何工作的,它用粗体显示的 <sp:SymmetricBinding> 替换 “WS-SecureConversation 性能 ” 中使用的 <sp:AsymmetricBinding>


清单 2. WS-SecureConversation 中不使用客户端证书的 WS-Policy

				
 <wsp:Policy wsu:Id="SecureConv"
  xmlns:wsu=".../oasis-200401-wss-wssecurity-utility-1.0.xsd"
  xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
  xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
 <wsp:ExactlyOne>
  <wsp:All>
   <sp:SymmetricBinding>
    <wsp:Policy>
     <sp:ProtectionToken>
      <wsp:Policy>
       <sp:SecureConversationToken
         sp:IncludeToken=".../IncludeToken/AlwaysToRecipient">
        <wsp:Policy>
         <sp:BootstrapPolicy>
          <wsp:Policy>
           <sp:SymmetricBinding>
            <wsp:Policy>
             <sp:ProtectionToken>
              <wsp:Policy>
               <sp:X509Token sp:IncludeToken=".../IncludeToken/Never">
                <wsp:Policy>
                 <sp:RequireDerivedKeys/>
                 <sp:RequireThumbprintReference/>
                 <sp:WssX509V3Token10/>
                </wsp:Policy>
               </sp:X509Token>
              </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:Wss11>
            <wsp:Policy>
             <sp:MustSupportRefKeyIdentifier/>
             <sp:MustSupportRefThumbprint/>
             <sp:MustSupportRefEncryptedKey/>
            </wsp:Policy>
           </sp:Wss11>
           <sp:EncryptedParts>
            <sp:Body/>
           </sp:EncryptedParts>
          </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:EncryptedParts>
    <sp:Body/>
   </sp:EncryptedParts>
  </wsp:All>
 </wsp:ExactlyOne>
</wsp:Policy>

 

除了使用客户端生成的使用 STS 进行消息交换的密钥,通过去除 <wsap:UsingAddressing> 断言, 清单 2 中的策略也与 “WS-SecureConversation 性能 ” 中所使用的不同。

理论上,这个策略可以处理任何的 WS-Security 和 WS-SecureConversation 实现。实践中,当我在三个主流开源 Java Web Service 工具尝试这个配置时遇到了一些问题。CXF 是唯一能够正常运行所编写的策略的工具。Axis2 完全不能运行,它在处理 STS 响应消息时会出现客户端异常错误。当我将辅助程序策略修改回不对称加密方式时,Axis2 能够运行,但是它在所有消息上使用 WS-Addressing。Metro 也会出错;在我重新添加 <wsap:UsingAddressing> 时,它能够处理客户端为 STS 消息传递的对称加密所生成的密钥。

 

性能比较

性能比较使用与之前文章相同的测试代码,即地震数据查询服务。这个服务使用了几年里全世界所发生的超过 93,000 次地震的数据库。发向服务的请求指定了一个时间范围和地理坐标范围,而这个服务将返回所指定范围的所有地震数据。请阅读 “WS-Security 的大开销 ” 了解更多关于这个测试应用和示例请求/响应消息对的详细信息。

在之前的文章中,性能测试使用了两组请求序列。第一组使用了 1,000 个请求,其中查询参数被调整为只匹配整个地震数据库的一小部分(1,000 个请求只返回 816 个匹配的地震)。第二组使用了 100 个请求,其中查询参数被调整为匹配更大范围的数据库(100 个请求只返回 176,745 个匹配的地震)。这两个请求序列侧重于 Web Services 协议的不同性能特征。第一个显示这些协议处理包含少量数据的请求的速度有多快,而第二个强调处理数据容量的速度。每一个请求序列都会以不同的安全性配置多次运行,而结果只保存每一种配置的最短时间。而这一次,我们只测试两个安全性配置:

  • 使用 SymmetricBinding 加密所有的请求/响应消息体的 WS-Security (direct
  • 加密所有请求/响应消息体的 WS-SecureConversation(securconv

securconv 配置本质上与 “WS-SecureConversation 性能 ” 中所使用的配置是相同的,唯一的区别是它在 Metro 和 CXF 的客户端和 STS 之间的消息交换中使用了 SymmetricBinding 。因为所测试的 SymmetricBinding STS 策略不能在 Axis2 中运行,用于计时测试的 Axis2 配置与前一篇文章所使用的是相同的。在策略中使用 SymmetricBinding 的变化更多是出于演示的目标,而不会对性能带来重要影响,所以这个区别不会影响到结果。

这些测试是在运行 Mandriva 2009.1 32-bit Linux® 的笔记本电脑上的,它使用了 Turion X2 ZM-85 处理器,有 3GB 的 RAM,安装了 Sun (Oracle) Java 1.6.0_10 32-bit JVM。(注意,它与前面文章的性能测试所使用的系统不一样。)服务器代码运行在 Tomcat 6.0.20 上,它的配置使用 1024MB 的堆,其中客户端代码使用 512MB 的堆。所测试的 Web Services 工具版本如下:

  • Axis2 1.5.1 和 Rampart 1.5
  • Metro 2.0
  • CXF 2.1.8

如果您想要在您自己的主机和 JVM 上进行这些测试,您可以从这里 下载 代码。

性能测试结果

图 1 显示了在小响应测试中所测得的时间。正如 “WS-SecureConversation 性能 ” 所介绍的,在 WS-SecureConversation 计时中 Metro 比 CXF 稍微快一些(大约快 10%)。Metro 甚至比直接使用对称加密实现 WS-Security 还要快一些,大约快 30%。(在本文的两个图表中,较短的数据条表示更快一些的时间)。


图 1. 使用小响应的测试时间
使用小响应的测试时间

Axis2 的测试结果没有包含在 图 1 中,因为测试过程中出现了一个问题。Axis2 一开始的运行速度是可接受的,然后随着循环次数的增加,速度明显变慢。使用 Axis2 运行这个测试的总时间最后超过 Metro 的 40 倍。这种类型的变慢通常表示出现了问题,如由代码所存储值的线性查找,这里错误出现在 Axis2 对于对称加密的安全性处理中(可能是在处理客户端生成的密钥时,因为每一个请求都会生成一个新的保密密钥)。

图 2 显示了大响应测试所测得的时间。这里 Metro 又一次是运行最快的,但是 CXF 的速度很接近 — 两者的区别只有 10%。Axis2 比其他两种工具速度慢很多,这和之前文章中所介绍的 WS-Security 和 WS-SecureConversation 测试是一样的。


图 2. 使用大响应的测试时间
使用大响应的测试时间

这些结果(除了 Axis2)是与您根据正在进行的安全性处理得到的预期是一样的。通过这两种安全性配置,客户端和服务之间的消息交换使用了对称加密。这两者最大的不同是 WS-Security 对称加密配置使用了客户端为每一个请求/响应消息对生成的一个新的保密密钥。这个保密密钥需要使用服务器的公钥进行不对称加密,然后它会作为请求消息的一 部分发送,这样 WS-SecureConversation 就可以在许多消息对中重用一个保密密钥。这意味着 WS-Security 配置为每个请求带来严重的过载,这主要显示在 图 1 的时间中。

这些工具并不支持使用 WS-Security 对称加密来 加密一条消息,而是同时还要求使用签名才能完成。这使得我们很难作直接的性能比较,但是您可以通过将这些图表与 “WS-SecureConversation 性能 ” 中的图表进行比较来了解它们之间的区别。前一篇文章显示 WS-SecureConversation 对称加密显然比 WS-Security 不对称加密具有更好的性能,特别是在加密消息时。这些结果表明使用客户端生成的密钥进行 WS-Security 对称加密几乎和 WS-SecureConversation 一样快,特别是对于较大的消息。

 

结束语

您已经从本文中了解了对称加密是如何在不需要客户端证书的情况下使用客户端生成的保密密钥来保证消息交换的安全。当消息相对较大时,这个方法在实现消息交换时有很好的性能 — 几乎与 WS-SecureConversation 一样好。如果只有少量的消息在客户端和服务器之间交换,客户端生成的保密密钥可以实现 WS-SecureConversation 保密密钥更好的性能(因为 WS-SecureConversation 要求在客户端和 STS 之间使用额外的消息交换)。

客户端生成的保密密钥也可用于消息签名。虽然本文没有介绍,但是保密密钥的使用方法本质上与 “WS-SecureConversation 性能 ” 中讨论的 WS-SecureConversation 签名例子是一样的。使用保密密钥进行签名本身比使用私有密钥进行签名的真实性保证较弱一些,但是它对于保证消息在传输中不会被篡改还是很有用的。

本系列的上几篇文章讨论了在 Web Services 中使用的几种形式的 WS-Security 和 WS-SecureConversation 安全性技术,包括三种主流 Java Web Services 工具的性能比较。我将在将来的文章中介绍具体的 WS-Security 特性,但是现在是时候对安全性性能进行总结了。本系列的下一篇文章将总结这三种主流 Java Web Services 工具的性能和互操作性问题,同时提供在这些工具中使用 Web Services 安全性的最佳使用方法的指南。如果您想要在您的组织中使用安全的 Web Services,您一定不希望错过这篇文章。

 

下载

描述 名字 大小 下载方法
本文的示例代码 j-jws17.zip 5.29MB HTTP

 

原文:http://www.ibm.com/developerworks/cn/java/j-jws17/

分享到:
评论

相关推荐

    ws-security jar

    使用"ws-security jar"时,开发者可以配置Web服务客户端和服务器端的策略,设置签名和加密算法,指定认证方式,以及处理证书和密钥。这个库可能还包括了处理WS-Security头信息的解析和验证,以及生成带有安全信息的...

    ws-security三个jar包

    ISNetworksProvider.jar可能是某个特定厂商提供的WS-Security实现或者一个特定的安全提供者,可能包含了对WS-Security规范的某些特定功能的支持,例如证书管理或特定加密算法的实现。 tsik.jar文件名暗示了它可能是...

    xfire1.2.6 ws-security示例

    你可以使用SOAP UI这样的工具来模拟不同的客户端行为,观察服务端的响应,确保WS-Security策略按预期工作。同时,要密切关注任何潜在的安全漏洞,如未正确处理的异常、不安全的默认配置等。 总之,xfire1.2.6的WS-...

    ws-security java-mail

    例如,`ws-security` 可以通过X.509证书进行公钥基础设施(PKI)的认证,也可以使用UsernameToken或 Kerberos Token进行用户身份验证。 在Xfire中实现`ws-security`,意味着开发者正在为基于Xfire的Web服务添加安全...

    cxf+ws-security-JAR

    综上所述,"cxf+ws-security-JAR"是针对Web服务安全调用的解决方案,通过Apache CXF和WS-Security标准,为Web服务提供了强大的安全保障,确保了敏感数据的传输安全和用户身份的有效验证。这个JAR包很可能包含了一些...

    CXF(WS_Security)证书加密

    在CXF中,我们可以配置服务端和客户端证书,实现双向认证,即客户端验证服务器身份,服务器也验证客户端身份。 **配置CXF和WS-Security** 配置CXF以支持WS-Security通常涉及以下几个步骤: 1. **生成证书**:首先...

    CXF WS-Security WSS4J 例子

    CXF(CXF: Composite Application ...在实际应用中,根据业务需求选择合适的WS-Security策略,如使用数字签名确保消息完整性,使用加密保护敏感数据,以及通过各种令牌进行身份验证,可以有效提升Web服务的安全性。

    winform WS-Security签名

    3. **WS-Security元素**:常见的WS-Security元素包括`UsernameToken`(用于身份验证)、`BinarySecurityToken`(用于携带X.509证书)、`Timestamp`(用于确保消息的新鲜性)以及`Signature`和`Encryption`元素(用于...

    axis2+rampart实现ws-security

    【标题】:"axis2+rampart实现ws-security" 在WS-Security(Web Services Security)标准中,axis2和rampart是两个关键组件,用于在Web服务中实现安全功能。Axis2是Apache的一个开放源码Web服务引擎,它提供了一个...

    xfire spring security

    WS-Security可与WSDL、SOAP、X.509证书等技术结合使用。 四、Spring Security与Xfire/CXF整合 1. 配置Spring Security:首先,我们需要在Spring Security配置文件中定义安全规则,包括用户角色、权限等。这可以通过...

    CXF WSSCEURITRY 身份认证demo

    2. **WS-Security配置**:在配置文件中,会配置WS-Security策略,比如定义用户名令牌、X.509证书或SAML令牌的使用。这通常通过添加`&lt;wss4jOutboundSecurity&gt;`或`&lt;wss4jInboundSecurity&gt;`元素来完成。 3. **安全令牌...

    Cxf客户端及服务器端,实现客户端和服务器端的权限验证

    在CXF中,可以使用WS-Security配置来实现。例如,可以使用X.509证书进行客户端和服务器端的身份验证,或者使用UsernameToken来传递用户名和密码。此外,还可以使用加密和签名策略来保护消息内容。 为了实现这些功能...

    adfs-ws-trust-client:ADFS WS-Trust客户端

    使用这个ADFS WS-Trust客户端,开发者可以在Java应用中轻松地与ADFS服务进行交互,进行身份验证和获取访问令牌。这在需要跨域身份验证或者需要利用ADFS的单点登录(SSO)功能的应用中非常有用。例如,一个企业内部的...

    Web Services Enhancements 3.0 Hands On Lab - Security

    1. **WS-Security**: WSE3.0引入了WS-Security标准,该标准提供了身份验证、消息完整性以及机密性的保障。通过数字签名和加密机制,可以防止消息在传输过程中被篡改或窃听。同时,它支持多种安全令牌,如X.509证书和...

    使用xfire框架搭建webService的一个demo

    在xfire中实现WS-Security,你需要在服务端配置安全策略,如使用用户名令牌、X.509证书等。客户端则需要在发送请求时附带相应的安全信息。这通常涉及设置SOAP Header中的`wsse:Security`元素,并添加适当的`wsu:...

    WebService协议

    例如,它使用X.509证书进行服务器和客户端的身份验证,使用XML加密(Encrypted XML)对敏感数据进行加密,以防止数据在传输过程中被窃取。WS-Security还支持基于用户名/口令、 Kerberos 和X.509的认证机制,增强了...

    WSS4J-1.5.12

    **WSS4J-1.5.12:Apache的WS-Security实现详解** WSS4J(Web Services Security for Java)是Apache软件基金会开发的一个关键项目,它为Java开发者提供了一个强大的工具集,用于实现WS-Security(Web Services ...

    Ws.js:Node.js的Ws- *实现

    开发人员可以通过阅读Ws-js-A-Ws-implementation-for-Node-js.pdf文档来深入理解Ws.js的使用方法,包括安装、配置、创建服务和客户端示例,以及处理错误和异常等。 总的来说,Ws.js为Node.js开发者提供了在Web服务...

    WebService之XFire和Jax实现身份验证

    例如,可以使用XFire的WS-Security支持,结合UsernameToken或X509证书来进行用户身份验证。UsernameToken方式通常涉及到用户名和密码的传递,而X509证书则基于公钥基础设施(PKI),使用数字证书进行身份验证。为了...

    WebService:Axis客户端调用需要身份验证的CXF服务

    3. **WS-Security配置**:如果CXF服务使用了WS-Security,如UsernameToken或X.509 Token,那么在Axis客户端端也需要相应配置。这可能涉及到创建和添加WSS4JInInterceptor和WSS4JOutInterceptor,以处理安全令牌。 4...

Global site tag (gtag.js) - Google Analytics