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

Java生成XML数字签名时出现
转义问题求助

解决XML数字签名中SignatureValue和Modulus节点的
转义问题

问题背景

在Java 11环境下生成XML数字签名后,输出的XML里SignatureValue和Modulus节点内出现了
转义字符(对应回车符CR),但预期输出仅保留换行符LF,无该转义内容。

原因分析


是XML对回车符(ASCII 13)的转义表示。Java的XML数字签名API默认采用带CRLF(回车+换行)的Base64编码格式,XML序列化时会将CR字符转义为
;而官方示例使用仅LF的行分隔方式,因此无此转义。

解决方案

方案1:修改XML序列化的换行属性

通过设置Transformer输出属性,强制使用LF作为换行符,避免CR被转义:

// 签名生成完成后,获取待输出的DOM文档
Document doc = ...; // 你的签名后的XML文档

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
// 指定换行符为LF,禁用CR
transformer.setOutputProperty(OutputKeys.LINE_SEPARATOR, "\n");

// 输出XML
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("signed_output.xml"));
transformer.transform(source, result);

方案2:清理节点文本中的CR字符

在签名生成完成后、XML输出前,手动移除目标节点文本中的回车符:

// 获取SignatureValue节点
Node signatureValueNode = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "SignatureValue").item(0);
String rawSigValue = signatureValueNode.getTextContent();
// 移除所有回车符
signatureValueNode.setTextContent(rawSigValue.replace("\r", ""));

// 同样处理Modulus节点
Node modulusNode = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Modulus").item(0);
String rawModulus = modulusNode.getTextContent();
modulusNode.setTextContent(rawModulus.replace("\r", ""));

// 后续正常输出XML即可

注意事项

  • 两种方案均需在签名计算完成后执行,避免影响签名有效性(签名基于规范化XML字节流,修改的仅为输出阶段的文本格式)。
  • 方案1从根源控制换行符类型,适合严格匹配输出格式的场景;方案2直接清理冗余字符,实现更简单。

内容的提问来源于stack exchange,提问作者Abdullah Al Mamun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:13:08