我为需要WS Security标头的Web服务编写了一个客户端(Java)。我使用cxf从WSDL生成我的源代码。当我在Tomcat上运行我的客户端时,它工作正常,但是,当我将它移动到Websphere时,我从服务中得到一个错误,说签名无效。我比较了生成的肥皂信封和两者之间匹配的所有标签,并且键值相同。唯一的区别是WAS已经为soapenc,xsi和xsd添加了名称空间。然后将这些前缀添加到规范化方法的IncludedNamespaces。从我所读过的内容中,可以得到签名的混合。我无法判断Websphere是否正在添加这些内容,或者它是否可能是正在拾取的类的不同版本。无论哪种方式,webservice都不会接受这些名称空间。这些可以删除吗?
WebSphere名称空间包含
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
Websphere规范化标签
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenc xsd xsi" />
</ds:Transform>
</ds:Transforms>
Tomcat名称空间包含
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
Tomcat规范化标签
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse soap" />
</ds:Transform>
</ds:Transforms>
这是我的WSS4jOutInterceptor Spring Config(删除了一些数据)
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"
id="outbound-security">
<constructor-arg>
<map>
<entry key="action" value="Timestamp Signature" />
<entry key="user" value=--REMOVED-- />
<entry key="signaturePropFile" value=--REMOVED-- />
<entry key="encryptionPropFile" value=--REMOVED-- />
<entry key="encryptionUser" value=--REMOVED--/>
<entry key="useSingleCertificate" value="true"/>
<entry key="signatureKeyIdentifier" value="DirectReference" />
<entry key="passwordCallbackClass" value=--REMOVED-- />
<entry key="signatureParts"
value="{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body" />
<entry key="signatureAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<entry key="sigCanonicalization" value="http://www.w3.org/2001/10/xml-exc-c14n#" />
<entry key="signatureDigestAlgorithm" value="http://www.w3.org/2001/04/xmlenc#sha256" />
</map>
</constructor-arg>
</bean>
编辑:这看起来是由运行时中的某些存档引起的。有谁知道什么包在jre和websphere 8运行时构建soap信封?这可能是差异存在的地方。非常感谢任何帮助!
答案 0 :(得分:1)
这个实际结果与不正确的命名空间或规范化方法无关。默认情况下,Websphere正在进行此调用&#34; BSP_compliant&#34;它为键添加了一些值。
这些行解决了这个问题。
Map<String, Object> ctx = ((BindingProvider)port).getRequestContext();
ctx.put(WSHandlerConstants.IS_BSP_COMPLIANT, "false");