这是我使用 CXF 和 Web 服务的第一个项目,使用 Tomcat 作为 servlet 容器,也是我在 StackOverflow 中的第一个问题,所以请耐心等待我....;-)
我正在使用:
- Tomcat 9(独立并与Eclipse集成)。
- CXF (3.2.0)
- JDK 1.8
- 视窗 7
问题:WS-SecurityPolicy 未启用/在服务器端不起作用。
WS-SecurityPolicy 是在 Web 服务的 wsdl 文件中实现的,并且该策略似乎工作正常,因为在客户端中 SOAP 输出消息正文已签名。
我卡住的问题是在服务器端,没有应用任何策略作为响应。
我遇到的第一个问题是 SOAP 标头"必须理解=1",服务器无法识别安全标头并抛出异常。
我的怀疑是 Web 服务没有应用策略,然后为了避免标头异常,我放置了一个不执行任何操作的处理程序。
现在服务器响应 SOAP 消息,但以明确的形式(未签名,没有二进制安全Tolen 和其他东西),我的怀疑是真的,策略不起作用。
我认为问题是 CXF 文件配置错误...
Web 服务的 cxf bean 配置在 Tomcat 启动期间加载。
INFO: Creating Service {http://ole/wsTransaccion}WsTransaccionService from WSDL: 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的正确位置,我认为一定在类路径中,然后我把它放在一个名为资源的包中,密钥库一起。
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在同一个地方。
任何建议将不胜感激。 非常感谢!!.
问题出在这里:
Tomcat 控制台:">
警告:在类加载器中找不到资源类路径:./resources/policyBinding.xml。
尽管 policyBinding.xml 在类路径中由于 Web 服务接口中的以下注释而未正确加载:
@Policy(uri = "./resources policyBinding.xml",placement=Policy.Placement.DEFAULT)
感谢Alfredo(WS-Security Policy节点未在带有Spring和自定义上下文文件的Apache CXF中生成) ) 我想出了正确的语法:@Policy(uri = "classpath:
policyBinding.xml",placement=Policy.Placement.DEFAULT)