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

如何使用WSS4J在KeyInfo中省略SecurityTokenReference标签?

解决方案

可以通过调整WSS4J的配置实现这个需求,核心是关闭SecurityTokenReference(STR)的自动生成,让X509Data直接作为KeyInfo的子节点。

问题原因

你当前设置的WSConstants.ISSUER_SERIAL密钥标识符类型,默认会触发WSS4J生成符合WS-Security规范的SecurityTokenReference包裹结构。要生成纯XML-DSIG标准的KeyInfo结构,需要显式关闭STR的生成逻辑。

修改步骤

在签名配置代码中添加一行设置,关闭SecurityTokenReference的使用,同时保持密钥标识符类型为ISSUER_SERIAL:

// 原有代码
signature.setKeyIdentifierType(WSConstants.ISSUER_SERIAL);
// 添加这行,关闭SecurityTokenReference生成
signature.setUseSecurityTokenReference(false);

同时确保你的Crypto配置能正确加载完整的证书信息,这样WSS4J会自动在X509Data节点下同时生成X509Certificate和X509IssuerSerial子节点,匹配你想要的规范结构。

修改后的关键代码片段

WSSecSignature signature = new WSSecSignature(secHeader);
signature.setX509Certificate((X509Certificate) certificate);
// ... 其他原有配置 ...
signature.setKeyIdentifierType(WSConstants.ISSUER_SERIAL);
// 新增:关闭SecurityTokenReference包裹
signature.setUseSecurityTokenReference(false);
Document signed = signature.build(crypto);

预期生成结果

修改后生成的KeyInfo结构会符合XML-DSIG规范:

<ds:KeyInfo>
  <ds:X509Data>
    <ds:X509Certificate>...</ds:X509Certificate>
    <ds:X509IssuerSerial>
      <ds:X509IssuerName>...</ds:X509IssuerName>
      <ds:X509SerialNumber>...</ds:X509SerialNumber>
    </ds:X509IssuerSerial>
  </ds:X509Data>
</ds:KeyInfo>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:51:32