You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Apache Santuario在KeyInfo的SecurityTokenReference中添加X509Data?

在Apache Santuario中生成包含SecurityTokenReference的KeyInfo

我懂你的需求——默认的addKeyInfo(cert)快捷方法只会生成直接包含X509Data的KeyInfo,但业务要求把X509Data嵌套在SecurityTokenReference里。其实Apache Santuario完全支持手动构建自定义的KeyInfo结构,不用依赖默认方法,下面是具体实现步骤:

核心思路

放弃使用sig.addKeyInfo(cert),手动搭建KeyInfo的层级结构:

  • 先创建WS-Security命名空间下的SecurityTokenReference元素
  • 把生成好的X509Data元素嵌套进去
  • 最后将整个SecurityTokenReference放入KeyInfo,再关联到签名对象

完整代码示例

// 定义WS-Security的命名空间(根据业务要求调整前缀和URI)
String WSSE_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
String WSSE_PREFIX = "wsse";

// 1. 创建KeyInfo对象
KeyInfo keyInfo = new KeyInfo(doc);

// 2. 创建SecurityTokenReference元素(指定命名空间和前缀)
Element securityTokenRef = doc.createElementNS(WSSE_NS, WSSE_PREFIX + ":SecurityTokenReference");
// 可选:添加TokenType属性,匹配X509令牌规范
securityTokenRef.setAttributeNS(WSSE_NS, WSSE_PREFIX + ":TokenType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");

// 3. 创建X509Data并加载证书
X509Data x509Data = new X509Data(doc);
x509Data.addCertificate(cert);
// 将X509Data元素添加到SecurityTokenReference中
securityTokenRef.appendChild(x509Data.getElement());

// 4. 将SecurityTokenReference加入KeyInfo
keyInfo.addUnknownElement(securityTokenRef);

// 5. 把自定义KeyInfo绑定到签名对象
sig.setKeyInfo(keyInfo);

// 执行签名操作
logUtil.debug("Start signing");
sig.sign(privateKey);
logUtil.debug("Finished signing");

生成的目标XML结构

执行上述代码后,你会得到符合业务要求的KeyInfo结构:

<ds:KeyInfo>
  <wsse:SecurityTokenReference xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" wsse:TokenType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">
    <ds:X509Data>
      <ds:X509Certificate> xxx certificate value xxx </ds:X509Certificate>
    </ds:X509Data>
  </wsse:SecurityTokenReference>
</ds:KeyInfo>

注意事项

  • 务必保证WS-Security的命名空间URI和前缀与业务系统要求一致,不要随意修改
  • 如果需要给SecurityTokenReference添加Id等其他属性,直接调用securityTokenRef.setAttribute()即可
  • addUnknownElement方法是实现自定义KeyInfo结构的核心,它允许我们将任意XML元素注入KeyInfo中

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:07:20