无法在Web服务中使用CXF启用WS-SecurityPolice

时间:2018-01-19 20:25:33

标签: web-services tomcat cxf ws-security

这是我第一个使用CXF和Web Services的项目,使用Tomcat作为servlet容器,也是我在StackOverflow中的第一个问题,所以请耐心等待.... ;-)
我正在使用:

  • Tomcat 9(独立并与Eclipse集成)。
  • CXF(3.2.0)
  • JDK 1.8
  • Windows 7

**问题:** WS-SecurityPolicy未在服务器端启用/不工作。

WS-SecurityPolicy在Web服务的wsdl文件中实现,策略似乎工作正常,因为在客户端,SOAP输出消息体已签名。
我遇到的问题是在服务器端,没有任何策略应用于响应 我遇到的第一个问题是SOAP标头"必须理解= 1",服务器无法识别安全标头并引发异常。
我怀疑是Web服务没有应用策略,然后为了避免标题的例外我放了一个什么都不做的处理程序。
现在服务器响应SOAP消息但是以清晰的形式(未签名,没有BinarySecurityTolen和其他东西),我的怀疑是真的,策略不起作用。
我认为这个问题是对CXF文件的错误配置......
在Tomcat的启动过程中加载了Web服务的cxf bean配置。


    信息:从WSDL创建服务{{{​​3}}} WsTransaccionService:wsdl / wsTransaccion.wsdl
    ....
    ....
    信息:从ServletContext资源加载XML bean定义[/WEB-INF/cxf-wsTransaccion.xml]

cxf-wsTransaccion.xml文件包含:

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://ole/wsTransaccion http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws">

 <bean id="myPasswordCallback"
    class="implementacion.ServerKeystorePasswordCallback" />

<jaxws:endpoint xmlns:tns="http://ole/wsTransaccion" id="wsTransaccion"
    implementor="implementacion.WsTransaccionImpl"
    wsdlLocation="wsdl/wsTransaccion,wsdl" endpointName="tns:WsTransaccionPort"
    serviceName="tns:WsTransaccionService" address="/WsTransaccionPort">
    <jaxws:features>
        <bean class="org.apache.cxf.feature.LoggingFeature" />           
    </jaxws:features>       

    <jaxws:properties>
        <entry key="security.callback-handler">
            <ref bean="myPasswordCallback"/>
        </entry>            
        <entry key="security.encryption.properties" value="keystore.properties"/>
        <entry key="security.signature.properties" value="keystore.properties"/>
        <entry key="ws-security.encryption.username" value="useReqSigCert"/>
    </jaxws:properties> 

</jaxws:endpoint>


我认为问题coluld位于文件keystore.properties的位置,但是如果不存在则抛出没有异常(如java.io.FileNotFoundException)。
我看到的所有例子都是Maven的项目,但这不是一个MAVEN项目所以我没有文件夹&#34;资源&#34;其中放置了属性文件和密钥库 我不知道keystore.properties的正确位置,我认为必须在类路径中,然后我将它放在一个名为resources的包中,并将密钥库放在一起。

keystore.properties的内容:

>org.apache.wss4j.crypto.provider=org.apache.ws.security.components.crypto.Merlin
>org.apache.wss4j.crypto.merlin.keystore.file=server.p12
>org.apache.wss4j.crypto.merlin.keystore.type=PKCS12
>org.apache.wss4j.crypto.merlin.keystore.alias=server
>org.apache.wss4j.crypto.merlin.keystore.password=xxxxxx<br/>

其他可能性是org.apache.wss4j.crypto.merlin.keystore.file = server.p12也不在正确的位置,尽管它与keystore.properties在同一个地方

任何建议都将非常感谢。 非常感谢!!!。

1 个答案:

答案 0 :(得分:0)

问题出在这里:

Tomcat控制台:
&#34;警告:资源类路径:在类加载器中找不到./ resources / policyBinding.xml。&#34;

虽然policyBinding.xml在类路径中没有正确加载,因为在Web服务的界面中进行注释:

@Policy(uri =&#34; ./ resources policyBinding.xml&#34;,placement = Policy.Placement.DEFAULT)

感谢Alfredo(WS-Security Policy node not being generated in Apache CXF with Spring and custom context file 我想出了正确的语法:
@Policy(uri =&#34; classpath:policyBinding.xml&#34;,placement = Policy.Placement.DEFAULT)