Java 当使用xml签名时,整个xml文档是混乱的

Java 当使用xml签名时,整个xml文档是混乱的,java,xml,saml,xml-signature,saml-2.0,Java,Xml,Saml,Xml Signature,Saml 2.0,我正在使用xml签名验证saml请求: 签名前的初始saml请求: <samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID ="abc" Version="2.0" IssueInstant="2012-04-14T8:55:05:31" ProtocolBinding="urn:o asis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsum

我正在使用xml签名验证saml请求:

签名前的初始saml请求:

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID
="abc" Version="2.0" IssueInstant="2012-04-14T8:55:05:31" ProtocolBinding="urn:o
asis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="http://l
ocalhost:8080/consumer.jsp"><saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0
:assertion">http://localhost:8080/saml/SProvider.jsp</saml:Issuer></samlp:AuthnR
equest>
http://localhost:8080/saml/SProvider.jsp
在对xml文档进行签名并将其转换为字符串(使用transformer)之后,我得到以下信息:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?><samlp:AuthnReques
    t xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL
    ="http://localhost:8080/consumer.jsp" ID="abc" IssueInstant="2012-04-14T8:55:05:
    31" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.
    0"><saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://localh
    ost:8080/saml/SProvider.jsp</saml:Issuer><Signature xmlns="http://www.w3.org/200
    0/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/
    TR/2001/REC-xml-c14n-20010315#WithComments"/><SignatureMethod Algorithm="http://
    www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform A
    lgorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><
    DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>J
    QV+Gff3C0PDb5zbaB62ItqWaJ/yIFgOVfANUehlJpQ=</DigestValue></Reference></SignedInf
    o><SignatureValue>PJCFgkGUlQiOVn6g0hTgbbHkqOGAKB5sA8QjcdKrR5R9zuyn9ymfFZMo1jqpxU
   //#here 3UOCz1BcxsWt6+ 
    CSFSAS0SaQstuN8ns/5ltIYu3LFUrpIT4eRHxbYEjf+CFj0c08lFB+BLK3Tx3vEi7nQF+X1rUvZX
    XZEUmaAMLqNdhRSqurY=</SignatureValue></Signature></samlp:AuthnRequest>
http://localh
ost:8080/saml/SProvider.jsp<
DigestMethod算法=”http://www.w3.org/2001/04/xmlenc#sha256“/>J
QV+Gff3C0PDb5zbaB62ItqWaJ/yIFgOVfANUehlJpQ=PJCFGKGULQIOVN6G0HTGBBHKQOGAKB5SA8QJCDKRR5R9ZUYN9YMFZMO1JQPXU
//#此处3UOCz1BcxsWt6+
CSFSAS0SaQstuN8ns/5LTIYU3LFURPITERHBYEJF+CFj0c08lFB+BLK3Tx3vEi7nQF+X1rUvZX
XZEUmaAMLqNdhRSqurY=


正如您所看到的,初始字符串中的第一个属性是ID,但签名后的第一个属性是AssertionConsumerServiceURL。为什么会变得混乱?此外,在签名文档中,请参见此处的(从最后一行起的第三行),有一个换行符。为什么会有换行符。我不认为加密值包含换行符。我不明白发生了什么事。请提供帮助。

为了计算签名,XML文件必须是。它必须采用标准格式,以便接收应用程序验证签名


但是,我不认为它需要被规范化;因为接收应用程序还必须规范化XML以计算签名进行验证。所以,您可以在签名后尝试删除它。但我不知道这是否有效,所以请彻底测试它。

请参阅此链接。其中大部分都说xml签名不能保证xml标记的顺序。它还说,这是由于规范化。但我不能肯定这一点。我知道的一件事是,使用xml签名并不少见。

感谢您的回复。但我已经规范化使用“带注释”。如果你想,我会把我用过的代码也放上去。“带注释”只是意味着它会保留你的XML注释,而你没有任何注释……那么我该怎么做呢。我的意思是,我应该使用哪种算法?格式化只会使它更具可读性。我想知道为什么会变得混乱。而且,我无法读取服务器中的元素颁发者。