具有UsernameTokenSignature的CXF SOAP服务的正确配置是什么?

时间:2015-07-29 07:13:30

标签: java soap cxf ws-security wss4j

我尝试使用UsernameTokenSignature设置CXF服务和客户端。 Startingpoint是一个现有的,代码优先的服务。不幸的是,我发现的所有示例都使用了WS-Policy,正如我所理解的那样,CXF在代码优先方案中不支持。

我设法创建了一个客户端,它使用此配置发送消息,如我所期望的那样:

客户端:

<jaxws:client id="clientWithUsernameTokenSignature" serviceClass="mypackage.MyServiceInterface" address="http://localhost:8081/ws-security-secured-soap-service/services/Service_v1">
    <jaxws:outInterceptors>
        <ref bean="WSS4JOutInterceptor_UsernameTokenSignature" />
    </jaxws:outInterceptors>
</jaxws:client>

WSS4JOutInterceptor

 <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor" id="WSS4JOutInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature" />
            <entry key="user" value="Admin" />
            <entry key="passwordCallbackClass" value="mypackage.ClientCallbackHandler" />
        </map>
    </constructor-arg>
</bean>

但是,我无法正确设置服务来处理来自此客户端的邮件。我试过了:

服务

<jaxws:endpoint id="soapServ_v3" implementor="#myServiceFacade" address="/MyService_v1">
        <jaxws:inInterceptors>
            <ref bean="WSS4JInInterceptor_UsernameTokenSignature" />
        </jaxws:inInterceptors>
</jaxws:endpoint>

WSS4JInInterceptor

<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature" />
            <entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
        </map>
    </constructor-arg>
</bean>

执行此操作时,服务器不接受来自客户端的消息,并以安全错误响应。 调试我发现它失败的第一个地方是org.apache.wss4j.dom.validate.UsernameTokenValidator的verifyUnknownPassword。 这里allowUsernameTokenDerivedKeys设置为false。我认为我可以设置一些配置来实现这一点。

服务器上允许用户名令牌派生密钥的正确配置是什么?

即使我使用调试器将值更改为true,服务调用仍然失败。在这种情况下,拦截器会在checkActions处抛出异常:&#39;发现处理标题的错误&#39;。

所以我认为还有其他我需要配置的东西。 任何人都知道如何正确设置?

1 个答案:

答案 0 :(得分:1)

好的,我终于明白了。布尔属性&quot; allowUsernameTokenNoPassword&#39;需要设置为&#39; true&#39;以便服务器接受没有密码的UT。然后另外通过安全标头检查&#39; UsernameTokenNoPassword&#39;需要添加为行动。

工作配置如下所示:

<强> WSS4JInInterceptor:

<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature UsernameTokenNoPassword" />
            <entry key="allowUsernameTokenNoPassword" value="true" />
            <entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
        </map>
    </constructor-arg>
</bean>