Java中使用XMLSignature API为XML文档添加数字签名需严格遵循W3C规范,核心步骤包括:准备PKCS#12密钥对、构造SignedInfo指定SHA-256/RSA-SHA256等算法、设置Exclusive规范化、插入ds:Signature节点并签名,最后用DOMValidateContext验证。
Java中使用XMLSignature API为XML文档添加数字签名,核心是通过javax.xml.crypto.dsig包中的类构建签名对象、选择签名算法、引用待签名数据,并用私钥完成签名。整个过程需严格遵循W3C XML Signature规范(如http://www.w3.org/2000/09/xmldsig#),否则生成的签名可能无法被其他系统(如SAML服务、WS-Security网关)正确验证。
签名前必须有有效的密钥对。推荐使用PKCS#12格式的密钥库(.p12或.pfx),它同时包含私钥和对应证书链:
keytool -genkeypair生成,或用OpenSSL导出已有密钥KeyStore读取,通过别名获取PrivateKey和X509Certificate
SignedInfo是签名的核心元数据,定义了摘要算法、签名算法和引用规则:
SHA-256(对应URI http://www.w3.org/2001/04/xmlenc#sha256)RSA-SHA256(URI http://www.w3.org/2001/04/xmldsig-more#rsa-sha256)或ECDSA-SHA256
Reference需设置Transforms(如CanonicalizationMethod.EXCLUSIVE)以保证规范化一致,避免因空白、命名空间前缀差异导致验签失败签名不是覆盖原文,而是在XML中插入节点(通常放在命名空间下):
DOMSignContext将XMLSignature对象绑定到目标Document的某个位置(例如根元素末尾或特定父节点)sign()触发计算:对每个Reference的URI定位内容 → 规范化 → 摘要 → 签名运算是Base64编码的原始签名字节;可嵌入证书用于验签方提取公钥签名后立即用XMLSignatureFactory.newXMLSignature()配合DOMValidateContext验证,可快速发现常见问题:
#id但目标元素无Id属性或未声明xml:id)KeySelector从自动提取证书