gpt4 book ai didi

java - 在 spring-ws (wss4j) 中添加加密/解密的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:15:03 26 4
gpt4 key购买 nike

我已经部署了 2 个 Web 应用程序,一个代表 Web 服务,另一个代表 ws 客户端。当使用 SIGNING 和 TIMESTAMP-ing 时,一切正常,客户端标记消息(但我认为他没有覆盖默认的 300s ttl),用他的 x509 证书签署消息,并将其发送到 ws。另一方面,他接收消息并能够根据他的 keystore 中的客户信任证书验证时间戳和证书/签名。

当我将加密操作添加到我的配置时出现问题。客户端似乎能够加密消息,但 ws 似乎对解密消息不感兴趣。他只是看到

没有端点映射
[SaajSoapMessage {http://www.w3.org/2001/04/xmlenc#}EncryptedData] 

and throws

WebServiceTransportException: Not Found [404] exception.

SO can someone explain what I need to do in order to achieve timestamping,signing with x509 and encryption, again with x509?

part of server app-context:

<bean id="wss4jSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor"> 
<!-- valiadation -->
<property name="validationActions" value="Timestamp Signature Encrypt"/>
<property name="enableSignatureConfirmation" value="true"/>
<property name="validationSignatureCrypto">
<ref bean="keystore"/>
</property>
<property name="validationDecryptionCrypto">
<ref bean="keystore"/>
</property>
<property name="validationCallbackHandler">
<bean class="org.springframework.ws.soap.security.wss4j.callback.KeyStoreCallbackHandler">
<property name="privateKeyPassword" value="password"/>
</bean>
</property>
<!-- timestamp options -->
<property name="timestampStrict" value="true"/>
<property name="timeToLive" value="30"/>
<property name="timestampPrecisionInMilliseconds" value="true"/>
<!-- signing and encryption -->
<property name="securementActions" value="Timestamp Signature Encrypt"/>
<property name="securementUsername" value="wsserver"/>
<property name="securementPassword" value="password"/>
<property name="securementSignatureKeyIdentifier" value="DirectReference"/>

<property name="securementSignatureCrypto">
<ref bean="keystore"/>
</property>
<property name="securementEncryptionUser" value="wsclient"/>
<property name="securementEncryptionCrypto">
<ref bean="keystore"/>
</property>
</bean>
<!-- keystore -->
<bean id="keystore" class="org.springframework.ws.soap.security.wss4j.support.CryptoFactoryBean">
<property name="keyStorePassword" value="password"/>
<property name="keyStoreLocation" value="WEB-INF/MyTruststore.jks"/>
</bean>
<!-- interceptors -->
<sws:interceptors>
<ref bean="wss4jSecurityInterceptor"/>
<bean id="validatingInterceptor"
class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
<property name="schema" value="/WEB-INF/person.xsd"/>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="true"/>
</bean>
<bean id ="loggingInterceptor" class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor">
</bean>
</sws:interceptors>

客户端基本上使用相同的配置,除了他使用服务器公钥进行加密,并使用他的私钥进行解密。

keystore 没问题,我想,因为签名工作正常...当我添加加密操作时,一切都崩溃了,服务器日志的一部分说:

DEBUG [org.springframework.ws.server.MessageTracing.recei ved] - Received request [SaajSoapMessage {http://www.w3.org/2001/04/xmlenc#}EncryptedData]DEBUG [org.springframework.ws.server.endpoint.mapping.Pay loadRootAnnotationMethodEndpointMapping] - Looking up endpoint for [{http://www.w3.org/2001/04/xmlenc#}EncryptedData]DEBUG [org.springframework.ws.soap.server.SoapMessageDisp atcher] - Endpoint mapping [org.springframework.ws.server.endpoint.mapping.Pay loadRootAnnotationMethodEndpointMapping@30a14083] has no mapping for request...No endpoint mapping found for [SaajSoapMessage {http://www.w3.org/2001/04/xmlenc#}EncryptedData]org.springframework.ws.client.WebServiceTransportE xception: Not Found [404]...

我想我必须以某种方式指示 ws 在它开始为消息寻找端点之前解密 SOAP 主体,但我不知道如何。有什么建议吗?

最佳答案

由于您的评论很有帮助但有点不完整,所以我尝试用更多的细节来回答。

在spring教程中,端点方法是用@PayloadRoot注解的:@PayloadRoot(localPart = "orderInput", namespace = "http://samples")

当 soap 消息未加密时,这可以正常工作。 PayloadRootAnnotationMethodEndpointMapping 能够将 soap 消息映射到相应的方法。

当 soap 消息被加密时,PayloadRootAnnotationMethodEndpointMapping 无法映射 soap 消息,因为安全拦截器还没有时间解密它。解决方案是将@PayloadRoot 替换为@SoapAction。

当接收到 soap 消息时,spring-ws 首先调用 PayloadRootAnnotationMethodEndpointMapping,然后调用 SoapActionAnnotationMethodEndpointMapping。您可以同时使用两者以与非 spring 客户端(例如 axis 或 .net)完全兼容:

@PayloadRoot(localPart = "orderInput", namespace = "http://samples")
@SoapAction("http://samples/order")

最后但同样重要的是:如果您使用带有安全 soap 消息的 spring 客户端,则 spring 不会自动发送 soap 操作。您的服务器将无法使用适当的操作映射 soap 消息。为了解决这个问题,您应该使用 WebServiceMessageCallback:

ClientMessageCallBack callBack = new ClientMessageCallBack(
"http://samples/order");
Object output = wsTemplate.marshalSendAndReceive(inputObject, callBack);

ClientMessageCallBack 类在哪里

public final class ClientMessageCallBack 
implements WebServiceMessageCallback {

/**the soapAction to be appended to the soap message.*/
private String soapAction;

/**constructor.
* @param action the soapAction to be set.*/
public ClientMessageCallBack(final String action) {
this.soapAction = action;
}

@Override
public void doWithMessage(final WebServiceMessage message)
throws IOException, TransformerException {

if (message instanceof SoapMessage) {
SoapMessage soapMessage = (SoapMessage) message;
soapMessage.setSoapAction(soapAction);
}

}
}

关于java - 在 spring-ws (wss4j) 中添加加密/解密的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6705009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com