我在WebSphere v7中使用基于X509证书的WS-Security很难。
这是一个小背景: 我们在应用程序中使用spring-ws,并且允许UsernameToken配置文件安全性或X509安全性。这两个是使用Xws安全拦截器实现的,它使用Xws安全框架:
我们在客户端和客户端实施安全性。服务器端,都使用XWSS拦截器。有两个问题:
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编写的,因此他们可能认为某些事情是理所当然的。
我们在客户端尝试插入标记请求所需的标头元素时出现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更多
我已尝试设置我的策略配置以禁用时间戳,但随后我在另一个元素上获得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,两者都按预期工作。任何帮助将不胜感激......
答案 0 :(得分:1)
经过大量研究,我发现XWS安全拦截器与IBM的JRE不兼容。我能够使用UsernameToken配置文件安全性,但它不适用于基于证书的安全性。我决定使用WSS4J拦截器重新编写它。
有关详细信息,请参阅第7.2章:
http://static.springsource.org/spring-ws/site/reference/pdf/spring-ws-reference.pdf