SoapFault MustUnderstand headers、CXF WSS4J 未提供加密 属性 文件
SoapFault MustUnderstand headers, CXF WSS4J No crypto property file supplied
我的 SOAP 服务器正在接收一条必须理解 headers 设置为 1 的 SOAP 消息。
为了理解 header 我正在使用 wss4j 拦截器。
我的 sign.properties 文件是:
org.apache.ws.security.crypto.provider=org.apache.wss4j.common.crypto.Merlin
org.apache.ws.security.crypto.merlin.truststore.type=jks
org.apache.ws.security.crypto.merlin.truststore.password=changeit
org.apache.ws.security.crypto.merlin.truststore.file=keystore/truststore.jks
我的端点xml:
<jaxws:inInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="Timestamp Signature"/>
<entry key="signaturePropFile" value="XXXXXX/WEB-INF/classes/etc/sign.properties"/>
<entry key="passwordCallbackClass" value="XX.XX.XX.XXXXXX.lifecycleapp.UTPasswordCallback"/>
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
但是我收到错误“org.apache。wss4j.common.ext.WSSecurityException:没有提供加密 属性 文件来验证签名”
我假设这很简单,就像没有正确寻址 signaturePropFile 但我已经尝试提供完整的文件路径,但返回了相同的结果。
如有任何帮助,我们将不胜感激。
首先启用 DEBUG/FINE 日志记录。它会准确地告诉您问题出在哪里……很可能是它无法加载您提供的路径。我建议改为尝试以下操作:
<entry key="signaturePropFile" value="classes/etc/sign.properties"/>
冷
这件事发生在我身上,因为我试图使用 HashMap
而不是 Properties
地图。
也就是代替下面的
Map<String, Object> outProps = new HashMap<>(7);
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP + " " + WSHandlerConstants.SIGNATURE);
outProps.put(WSHandlerConstants.USER, CLIENT_SSL_CERT_ALIAS);
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new ClientPasswordCallback(privateKeyPassword));
outProps.put(WSHandlerConstants.SIG_KEY_ID, "DirectReference");
outProps.put(WSHandlerConstants.SIGNATURE_PARTS, "{Element}{" + "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" + "}Timestamp");
Properties signingCryptProperties = new Properties();
// Reference: http://camel.465427.n5.nabble.com/Dynamically-set-WSS4J-interceptor-properties-td5551391.html
signingCryptProperties.put("org.apache.ws.security.crypto.provider", "org.apache.ws.security.components.crypto.Merlin");
signingCryptProperties.put("org.apache.ws.security.crypto.merlin.keystore.password", keystorePassword);
signingCryptProperties.put("org.apache.ws.security.crypto.merlin.keystore.file", "client.jks");
signingCryptProperties.put("org.apache.ws.security.crypto.merlin.keystore.type", "JKS");
outProps.put(SIG_PROP_REF_ID, signingCryptProperties);
outProps.put(WSHandlerConstants.SIG_PROP_REF_ID, SIG_PROP_REF_ID);
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
我曾尝试将 signingCryptProperties
设为 HashMap
像这样
Map<String, String> signingCryptProperties = new HashMap<String, String>()
这导致了 WSSecurityEngine: No crypto property file supplied to verify signature
WSSEcurityException
我的 SOAP 服务器正在接收一条必须理解 headers 设置为 1 的 SOAP 消息。
为了理解 header 我正在使用 wss4j 拦截器。
我的 sign.properties 文件是:
org.apache.ws.security.crypto.provider=org.apache.wss4j.common.crypto.Merlin
org.apache.ws.security.crypto.merlin.truststore.type=jks
org.apache.ws.security.crypto.merlin.truststore.password=changeit
org.apache.ws.security.crypto.merlin.truststore.file=keystore/truststore.jks
我的端点xml:
<jaxws:inInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="Timestamp Signature"/>
<entry key="signaturePropFile" value="XXXXXX/WEB-INF/classes/etc/sign.properties"/>
<entry key="passwordCallbackClass" value="XX.XX.XX.XXXXXX.lifecycleapp.UTPasswordCallback"/>
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
但是我收到错误“org.apache。wss4j.common.ext.WSSecurityException:没有提供加密 属性 文件来验证签名”
我假设这很简单,就像没有正确寻址 signaturePropFile 但我已经尝试提供完整的文件路径,但返回了相同的结果。
如有任何帮助,我们将不胜感激。
首先启用 DEBUG/FINE 日志记录。它会准确地告诉您问题出在哪里……很可能是它无法加载您提供的路径。我建议改为尝试以下操作:
<entry key="signaturePropFile" value="classes/etc/sign.properties"/>
冷
这件事发生在我身上,因为我试图使用 HashMap
而不是 Properties
地图。
也就是代替下面的
Map<String, Object> outProps = new HashMap<>(7);
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP + " " + WSHandlerConstants.SIGNATURE);
outProps.put(WSHandlerConstants.USER, CLIENT_SSL_CERT_ALIAS);
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new ClientPasswordCallback(privateKeyPassword));
outProps.put(WSHandlerConstants.SIG_KEY_ID, "DirectReference");
outProps.put(WSHandlerConstants.SIGNATURE_PARTS, "{Element}{" + "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" + "}Timestamp");
Properties signingCryptProperties = new Properties();
// Reference: http://camel.465427.n5.nabble.com/Dynamically-set-WSS4J-interceptor-properties-td5551391.html
signingCryptProperties.put("org.apache.ws.security.crypto.provider", "org.apache.ws.security.components.crypto.Merlin");
signingCryptProperties.put("org.apache.ws.security.crypto.merlin.keystore.password", keystorePassword);
signingCryptProperties.put("org.apache.ws.security.crypto.merlin.keystore.file", "client.jks");
signingCryptProperties.put("org.apache.ws.security.crypto.merlin.keystore.type", "JKS");
outProps.put(SIG_PROP_REF_ID, signingCryptProperties);
outProps.put(WSHandlerConstants.SIG_PROP_REF_ID, SIG_PROP_REF_ID);
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
我曾尝试将 signingCryptProperties
设为 HashMap
像这样
Map<String, String> signingCryptProperties = new HashMap<String, String>()
这导致了 WSSecurityEngine: No crypto property file supplied to verify signature
WSSEcurityException