Java Web Services:不使用客户端证书的WS-Security

许多 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。

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

时间: 2024-10-30 21:01:34

Java Web Services:不使用客户端证书的WS-Security的相关文章

java web 程序 可不可以在客户端运行键盘钩子 要 怎么做?

问题描述 java web 程序 可不可以在客户端运行键盘钩子 要 怎么做? 50C java web 程序 可不可以在客户端运行键盘钩子 要 怎么做? 解决方案 可以试一下ActiveX控件+DLL的方式 解决方案二: web程序本身进程来加载键盘hook DLL 解决方案三: 亲们 帮帮忙 最后一哆嗦了 解决方案四: 这个是个现成的程序你参考一下:http://download.csdn.net/detail/qwe852012/1720478 解决方案五: 在服务端是可以 我要的是在客户端

JAVA WEB SERVICES 网络服务的三个标准

services|web|标准|网络 第一个标准被称为网络服务的"商业过程处理语言"是一种可编程的语言.它可规定如何把网络服务组合起来,并完成特别的任务. 第二个标准是WS-Coordination程序语言,它描述的是在任务互动时单独的网络服务如何完成服务.例如,一个软件程序员可以把网络服务插入到某个任务序列,以完成特定任务. 第三个网络服务标准为WS-Transaction,它用来确保一组交易是否全部成功或是全部失败. JAVA天堂 网络服务是一种正在兴起的软件编写方式,其功能就是让

Java与.NET 的Web Services相互调用

services|web 一:简介 本文介绍了Java与.NET开发的Web Services相互调用的技术.本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web Services,第二部分介绍了如何用Java做客户端调用.NET开发的Web Services. 二:项目需要的工具 Windows2000 Server(IIS) Jbuilder9.0( 含有Tomcat , axis) JDK1.4+Java Web Services Develop VS.Net 20

vs.net中web services入门

services|web services 入门摘要:Microsoft Visual Studio .NET 和 XML Web services 提供了一个简单.灵活且基于标准的模型,开发人员无论使用何种平台.编程语言或对象模型均可以编写组合应用程序.本文将帮助您快速学习使用 Visual Studio .NET 创建并访问 XML Web services.本文包含一些指向英文站点的链接. 目录简介 用托管代码编写的 XML Web services 使用 Visual Studio 创建

Java Web服务进阶

随着最近 Sun Microsystems 的 Java Web Services Developers Pack(Java WSDP)版本 1.0 的发布,Java 开发人员现在可以拥有一个方便的.集所有功能于一身的下载包,用来帮助在 Java 平台上开发 Web 服务.Java WSDP 包含 Java XML Pack 中的所有用于 XML 的 Java API(Java APIs for XML(JAX)),还包含有 Apache Tomcat 服务器以及为开发与测试 Web 服务提供一

Java 与 .NET 的基于 WS-Security的Web Services集成实现(下)

services|web Java 与 .NET 的基于 WS-Security的Web Services集成实现(下) rottenapple 4. 打开Jbuilder9 ,新建一个java 类,命名为TestNetService.并将axis-wsse-1.0的jar包添加到Jbuilder的jdk中(Tools->configions jdks->class tab->add)代码如下: package MyWebServiceJavaClient; import java.ut

Java 与 .NET 的基于 WS-Security的Web Services集成实现(上)

services|web Java 与 .NET 的基于 WS-Security的Web Services集成实现 rottenapple 本文适用读者: Web Services开发人员 应具备的知识: 使用过VS.NET2003 +WSE开发过Web Services,会使用Jbuilder9开发简单的java应用程序. 一:内容简介 WS-Security描述通过消息完整性,消息机密性和单独消息认证提供保护质量的SOAP消息传递增强.适用于下列场合: 1. 客户必须能够确定消息来自哪个人并

使用Eclipse和Java SE 6创建独立Web Services应用程序,第2部分

使用Eclipse和Java SE 6创建独立Web Services应用程序,第2部分: Web服务客户端应用程序 开始之前 关于本系列 此系列教程演示如何使用 Java SE 6 创建可轻松地从命令行而不是从 Web 应 用程序服务器容器中运行的独立 Web 服务服务端和客户端应用程序.在简单的 Hello World 示例中,您将利用 Eclipse IDE.Java SE 6 和 Apache Ant 轻松 创建完全可以正常工作的 Web 服务服务端和客户端应用程序.您还将使用 TCP/

使用Eclipse和Java SE 6创建独立Web Services应用程序,第1部分

使用Eclipse和Java SE 6创建独立Web Services应用程序,第1部分: Web Services服务端应用程序 开始之前 关于本系列 此系列教程演示如何使用 Java SE 6 创建可轻松地从命令行而不是从 Web 应 用程序服务器容器中运行的独立 Web Services 服务端和客户端应用程序.使用 简单的 Hello World 示例,您将利用 Eclipse IDE.Java SE 6 和 Apache Ant 轻松创建完全可以正常工作的 Web Services 服