返回

使用 Apache CXF 为 SOAP 消息添加二进制签名令牌:解决常见问题

java

Apache CXF:向 SOAP 消息添加二进制签名令牌

问题

在使用 WSDL 生成的 SOAP 消息中添加二进制签名令牌 (BST) 时遇到困难?当将 WSHandlerConstants.SIG_KEY_ID 设置为 "DirectReference" 时,STAX 拦截器可能会导致生成空值的 XML。本文将深入探讨如何解决此问题,并提供详细的步骤指南。

解决方法

1. 导入依赖项

首先,确保已在项目中包含以下依赖项:

  • org.apache.cxf:cxf-rt-ws-security:3.2.4
  • org.apache.cxf:cxf-rt-frontend-jaxws:3.2.4
  • org.apache.cxf:cxf-rt-transports-http:3.2.4
  • org.apache.cxf:cxf-rt-transports-http-jetty:3.2.4

2. 创建 WSS4JOutInterceptor

创建 WSS4JOutInterceptor 实例,并设置以下属性:

  • WSHandlerConstants.ACTION"SIGNATURE " + WSHandlerConstants.TIMESTAMP"
  • WSHandlerConstants.USER:用于访问密钥库的用户
  • WSHandlerConstants.PW_CALLBACK_CLASS:密码回调处理程序的名称
  • WSHandlerConstants.SIG_PROP_FILE:包含密钥库属性的文件
  • WSHandlerConstants.SIG_KEY_ID"DirectReference"

3. 添加拦截器

WSS4JOutInterceptor 添加到客户端或服务端点。这将确保在发送 SOAP 消息之前对其进行签名。

4. 配置密钥库

确保密钥库已正确配置,并且包含用于签名的私钥和证书。使用以下属性配置密钥库:

  • org.apache.ws.security.crypto.provider:加密提供程序
  • org.apache.ws.security.crypto.merlin.keystore.type:密钥库类型
  • org.apache.ws.security.crypto.merlin.keystore.password:密钥库密码
  • org.apache.ws.security.crypto.merlin.keystore.alias:私钥别名
  • org.apache.ws.security.crypto.merlin.file:密钥库文件路径

其他提示

  • 确保密钥库中的证书有效且受信任。
  • 使用调试器检查变量值和异常消息。
  • 确保已在消息中指定要签名的部分。

常见问题解答

1. 如何检查消息是否已签名?

在发送消息后,检查消息体中是否有 Signature 元素。

2. 如何使用其他密钥库提供程序?

可以通过设置 org.apache.ws.security.crypto.provider 属性来使用不同的密钥库提供程序。

3. 为什么我收到 "密钥 ID 找不到" 错误?

确保密钥 ID 与密钥库中的别名匹配。

4. 如何处理时间戳?

WSHandlerConstants.TIMESTAMP 将自动添加时间戳到消息中。

5. 如何指定要签名的部分?

使用 WSHandlerConstants.SIGNATURE_PARTS 属性指定要签名的 SOAP 消息部分。