【发布时间】: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