【问题标题】:Can`t enable WS-SecurityPolice with CXF in Web Service无法在 Web 服务中使用 CXF 启用 WS-SecurityPolice
【发布时间】:2018-01-19 20:25:32
【问题描述】:


这是我第一个使用 CXF 和 Web 服务的项目,使用 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 文件的错误配置...
Web 服务的 cxf bean 配置在 Tomcat 启动期间加载。


信息:从 WSDL 创建服务 {http://ole/wsTransaccion}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://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

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


我认为问题可能出在文件 keystore.properties 的位置,尽管如果不存在则不会引发异常(如 java.io.FileNotFoundException)..
我看到的所有示例都是 Maven 的项目,但这不是一个 MAVEN 项目,所以我没有放置属性文件和密钥库的文件夹“资源”。
我不知道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 位于同一个位置

任何建议将不胜感激。 非常感谢!!!。

【问题讨论】:

    标签: web-services tomcat cxf ws-security


    【解决方案1】:

    问题出在这里:

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

    尽管由于 web 界面中的以下注释,类路径中的 policyBinding.xml 未正确加载服务:

    @Policy(uri = "./resources policyBinding.xml",placement=Policy.Placement.DEFAULT)

    感谢阿尔弗雷多 (WS-Security Policy node not being generated in Apache CXF with Spring and custom context file ) 我找到了正确的语法:
    @Policy(uri = "classpath:policyBinding.xml",placement=Policy.Placement.DEFAULT)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2016-04-01
      相关资源
      最近更新 更多