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

