【发布时间】:2012-01-14 03:23:25
【问题描述】:
我很难在 WebSphere v7 中使用基于 X509 证书的 WS-Security。
这里有一点背景: 我们在我们的应用程序中使用 spring-ws,并且我们允许 UsernameToken 配置文件安全性或 X509 安全性。两者是使用 Xws Security 拦截器实现的,它运行在 Xws Security Framework 之外:
我们在客户端和服务器端都使用 XWSS 拦截器来实现安全性。有两个问题:
- 从 WebSphere 返回的用于“http://www.w3.org/2001/10/xml-exc-c14n#”或任何 CanonicalizationMethod 的 javax.xml.crypto 类与 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
我认为最好的办法是覆盖用于解密这些类型的实现。我们确实将 xmldsig-1.0.jar 包含在我们的 war 文件中(在类加载器设置为 parent-last 的情况下进行部署)。有人知道覆盖它的方法吗?我尝试在我的运行时环境中的 java.security 中指定“org.jcp.xml.dsig.internal.dom.XMLDSigRI”,但这不起作用。我们将 xmldsig-1.0.jar 包含在我们的应用程序中。
这似乎是 IBM 的 JRE 和 Sun 的 JRE 之间的兼容性问题。 XWSS 拦截器是 Sun 编写的,因此他们可能认为某些事情是理所当然的。
-
我们在客户端尝试插入签署请求所需的标头元素时收到 NullPointerException。我们在 DOM 实现中使用 xerces,但这似乎与 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 在 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 在 com.sun.xml.wss.core.Timestamp.getAsSoapElement(Timestamp.java:265) 在 com.sun.xml.wss.core.SecurityHeader.insertHeaderBlock(SecurityHeader.java:90) 在 com.sun.xml.wss.impl.filter.TimestampFilter.process(TimestampFilter.java:149) 在 com.sun.xml.wss.impl.HarnessUtil.processWSSPolicy(HarnessUtil.java:87) 在 com.sun.xml.wss.impl.HarnessUtil.processDeep(HarnessUtil.java:237) 在 com.sun.xml.wss.impl.SecurityAnnotator.processMessagePolicy(SecurityAnnotator.java:162) 在 com.sun.xml.wss.impl.SecurityAnnotator.secureMessage(SecurityAnnotator.java:137) 在 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 和 Jetty 上对此进行了测试,并且都按预期工作。任何帮助将不胜感激...
【问题讨论】:
标签: spring-security websphere spring-ws x509