【问题标题】:What is proper way to add encryption/decryption in spring-ws (wss4j)?在spring-ws(wss4j)中添加加密/解密的正确方法是什么?
【发布时间】:2011-07-15 09:21:21
【问题描述】:

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

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

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

并抛出

WebServiceTransportException:未找到 [404] 异常。

所以有人可以解释我需要做什么才能实现时间戳、使用 x509 签名和加密,再次使用 x509?

服务器应用上下文的一部分:

<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>

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

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

调试 [org.springframework.ws.server.MessageTracing.recei ved] - 收到请求 [SaajSoapMessage {http://www.w3.org/2001/04/xmlenc#}EncryptedData] 调试 [org.springframework.ws.server.endpoint.mapping.Pay loadRootAnnotationMethodEndpointMapping] - 查找 [{http://www.w3.org/2001/04/xmlenc#}EncryptedData] 的端点 调试 [org.springframework.ws.soap.server.SoapMessageDisp atcher] - 端点映射 [org.springframework.ws.server.endpoint.mapping.Pay loadRootAnnotationMethodEndpointMapping@30a14083] 没有请求映射 ... 未找到 [SaajSoapMessage {http://www.w3.org/2001/04/xmlenc#}EncryptedData] 的端点映射 org.springframework.ws.client.WebServiceTransportE 异常:未找到 [404] ...

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

【问题讨论】:

  • 我解决了这个问题,嗯,有点。问题是我使用了@PayloadRoot 注释,但我的payloadRoot 从来不是我的应用程序可以映射到端点的任何东西......它只是EncryptedData。当我将 ann 更改为 @SoapAction,并将 WebServiceMessageCallback() 接口添加到客户端的 marshalSendAndReceive() 时,Web 服务认为他没有 EncryptedData 有效负载的映射,因此他寻找与 SoapActionAnnotationMethodEndpointMapping 的映射,并找到了一个。比,而且只有比,当服务器找到请求的映射时,他解密了 SOAP 主体..并发现 PayloadRoot 在那里:)
  • 在服务器应用上下文中,你在哪里指定解密和签名的密钥别名?

标签: java web-services spring encryption spring-ws


【解决方案1】:

由于您的 cmets 很有帮助,但有点不完整,我拍了一张照片,回答得更详细一点。

spring教程中,endpoint方法用@PayloadRoot注解:@PayloadRoot(localPart = "orderInput", namespace = "http://samples")

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

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

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

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

最后但并非最不重要的一点:如果您使用带有安全肥皂消息的 spring 客户端,spring 不会自动发送肥皂动作。您的服务器将无法使用适当的操作映射肥皂消息。为了解决这个问题,你应该使用 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);
        }

    }
}

【讨论】:

【解决方案2】:

发生这种情况是因为您没有定义 securementEncryptionParts 属性。它导致加密整个身体并导致此错误

【讨论】:

    【解决方案3】:

    在触发@Endpoint 之前是否有解密请求?问题是客户端无法添加soapaction。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多