如何使用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
相关产品推荐
相关产品推荐

