X509 WS-Security在WebSphere中使用spring-ws,XWS拦截器

时间:2011-12-06 14:20:26

标签: spring-security websphere spring-ws x509

我在WebSphere v7中使用基于X509证书的WS-Security很难。

这是一个小背景: 我们在应用程序中使用spring-ws,并且允许UsernameToken配置文件安全性或X509安全性。这两个是使用Xws安全拦截器实现的,它使用Xws安全框架:

http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/XWS-SecurityIntro4.html

我们在客户端和客户端实施安全性。服务器端,都使用XWSS拦截器。有两个问题:

  1. 从WebSphere返回的“http://www.w3.org/2001/10/xml-exc-c14n#”或任何CanonicalizationMethod的javax.xml.crypto类与XWSS拦截器不兼容。我们在服务器端的消息日志中看到了这个错误:
  2. 12/5/11 17:26:41:098 EST 00000023 XwsSecurityIn W org.springframework.ws.soap.security.AbstractWsSecurityInterceptor handleValidationException无法验证请求:com.sun.xml.wss.XWSSecurityException:javax.xml。 crypto.MarshalException:java.security.NoSuchAlgorithmException:为TransformService配置的类:com.ibm.xml.crypto.dsig.dom.transform.ExcC14nTransformer而不是TransformService;嵌套异常是com.sun.xml.wss.XWSSecurityException:com.sun.xml.wss.XWSSecurityException:javax.xml.crypto.MarshalException:java.security.NoSuchAlgorithmException:为TransformService配置的类:com.ibm.xml.crypto。 dsig.dom.transform.ExcC14nTransformer不是TransformService

    我认为这里最好的事情是覆盖哪个实现用于解密这些类型。我们在我们的war文件中包含了xmldsig-1.0.jar(它在classloader设置为parent-last的情况下部署)。有人知道覆盖这个的方法吗?我尝试在运行时环境中的java.security中指定“org.jcp.xml.dsig.internal.dom.XMLDSigRI”,但这不起作用。我们在应用程序中包含了xmldsig-1.0.jar。

    这似乎是IBM的JRE& S之间的兼容性问题。太阳的JRE。 XWSS拦截器是由Sun编写的,因此他们可能认为某些事情是理所当然的。

    1. 我们在客户端尝试插入标记请求所需的标头元素时出现NullPointerException。我们正在使用xerces来实现DOM,但这似乎与SOAPFactory一致。我尝试将属性“javax.xml.soap.SOAPFactory”设置为“com.sun.xml.messaging.saaj.soap.ver1_1.SOAPFactory1_1Impl”,但这似乎没有解决问题。这是堆栈跟踪:

      [12/3/11 13:39:52:560 EST] 00000027 XwsSecurityIn E org.springframework.ws.soap.security.AbstractWsSecurityInterceptor handleSecurementException无法保护响应:java.lang.NullPointerException;嵌套异常是com.sun.xml.wss.XWSSecurityException:java.lang.NullPointerException                                  org.springframework.ws.soap.security.xwss.XwsSecuritySecurementException:java.lang.NullPointerException;嵌套异常是com.sun.xml.wss.XWSSecurityException:java.lang.NullPointerException

      ...

      引起:com.sun.xml.wss.XWSSecurityException:java.lang.NullPointerException                 at com.sun.xml.wss.impl.misc.XWSSProcessor2_0Impl.secureOutboundMessage(XWSSProcessor2_0Impl.java:98)                 在org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor.secureMessage(XwsSecurityInterceptor.java:135)                 ......还有86个 引起:java.lang.NullPointerException                 at com.sun.xml.wss.core.Timestamp.getAsSoapElement(Timestamp.java:265)                 在com.sun.xml.wss.core.SecurityHeader.insertHeaderBlock(SecurityHeader.java:90)                 at com.sun.xml.wss.impl.filter.TimestampFilter.process(TimestampFilter.java:149)                 在com.sun.xml.wss.impl.HarnessUtil.processWSSPolicy(HarnessUtil.java:87)                 at com.sun.xml.wss.impl.HarnessUtil.processDeep(HarnessUtil.java:237)                 at com.sun.xml.wss.impl.SecurityAnnotator.processMessagePolicy(SecurityAnnotator.java:162)                 at com.sun.xml.wss.impl.SecurityAnnotator.secureMessage(SecurityAnnotator.java:137)                 at com.sun.xml.wss.impl.misc.XWSSProcessor2_0Impl.secureOutboundMessage(XWSSProcessor2_0Impl.java:96)                 ... 87更多

    2. 我已尝试设置我的策略配置以禁用时间戳,但随后我在另一个元素上获得NPE。我不相信配置是罪魁祸首,但无论如何它仍然存在:

      <?xml version="1.0" encoding="UTF-8"?>
      <SecurityConfiguration xmlns="http://java.sun.com/xml/ns/xwss/config" dumpMessages="true">
          <Sign includeTimestamp="false">
              <X509Token certificateAlias="1"/>
          </Sign>
      </SecurityConfiguration>
      

      我在JBoss&amp; amp; Jetty,两者都按预期工作。任何帮助将不胜感激......

1 个答案:

答案 0 :(得分:1)

经过大量研究,我发现XWS安全拦截器与IBM的JRE不兼容。我能够使用UsernameToken配置文件安全性,但它不适用于基于证书的安全性。我决定使用WSS4J拦截器重新编写它。

有关详细信息,请参阅第7.2章:

http://static.springsource.org/spring-ws/site/reference/pdf/spring-ws-reference.pdf