JAXB反编组移除数字签名中的回车符问题求助
XML签名反编组后验证失败问题
使用的依赖
<dependency> <groupId>jakarta.activation</groupId> <artifactId>jakarta.activation-api</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>4.0.0</version> <scope>runtime</scope> </dependency>
问题详情
我已成功用信封方式生成XML签名,签名内容片段如下:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>xndyhbkzbLreG3cxXqa5Q5RdKEavhrc2Fvd0Wsc+Oug=</DigestValue></Reference></SignedInfo><SignatureValue>No+gNx3Hwd3WfH0v6OZ8uptWVyneZT55CfUrxMnW33a87egeiImwsyepZZXTbya0ifzX1iOtyyaf OwEDxTFhf/FCPH6Nj9KCFNabZddwN38tCOkkAkYdkKdW14AM80HU/9yPIAMWytibbyd3AKVuRQgd +qkf1/V8J1Ki1LNO4tbPzxqpNMpRmpH/469lgMHEz9Xy1DnJ154E+H2OWNufooGwwpV/pMbM8RzY
直接验证签名可以成功:
signature.sign(dsc); System.out.println("doc: " + getStringFromDocument(doc) + " validate: " + validate(doc));
但将签名反编组到DTO时验证失败,反编组代码如下:
JAXBElement<?> root = XmlUtils.getUnMarshaller(xml.getClass().getName()).unmarshal(getStreamSource(doc), xml.getClass()); xml.setSignature(((SignXml<?>) root.getValue()).getSignature());
对比发现,反编组后的签名丢失了 (回车符):原文档的SignatureValue包含该字符,反编组后被移除。我试过旧版JAXB的EscapeCharacter方案,但不适用于新版JAXB,请问有没有适配新版JAXB的解决办法?
内容的提问来源于stack exchange,提问作者czetsuya
相关产品推荐
相关产品推荐

