2012-09-25 72 views
1

是否可以验证下面的XML文档:验证XML签名JAVA

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
<SignedInfo> 
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
<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>DsP5NLca+plhp9tZvGwykfb2whQYt3CQ5sbsVd9Q9aE=</DigestValue> 
</Reference> 
</SignedInfo> 
<SignatureValue> 
LrfE0po3YPvVxB/m77iBWWiR07Ghiuhuj7tO2C2LKqZK2cLrAiidt+3tjbJ3m16quCFxfh7bmjRtJsGi7a3HKtK 
qY4auqrjNB62AtYrxvm+7Qd/cRacom4e3M9uF9JD1zTfoGun9w4WDfDrDaoZ+ZwUgNtf6sTYO5Ctcj5sYcD0= 
</SignatureValue> 
<KeyInfo> 
<KeyName>7D665C81ABBE1A7D0E525BFC171F04D276F07BF2</KeyName> 
</KeyInfo> 
</Signature> 

问题是,当我运行我的代码,会出现此错误

Exception in thread "main" javax.xml.crypto.dsig.XMLSignatureException: cannot find validation key 
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignature$DOMSignatureValue.validate(Unknown Source) 
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.validate(Unknown Source) 
    at paket.XmlValidator.validate(XmlValidator.java:28) 
    at paket.Test.main(Test.java:43) 
Caused by: javax.xml.crypto.KeySelectorException: No KeyValue element found! 
    at paket.KeyValueKeySelector.select(KeyValueKeySelector.java:47) 
    ... 4 more 
javax.xml.crypto.KeySelectorException: No KeyValue element found! 
    at paket.KeyValueKeySelector.select(KeyValueKeySelector.java:47) 
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignature$DOMSignatureValue.validate(Unknown Source) 
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.validate(Unknown Source) 
    at paket.XmlValidator.validate(XmlValidator.java:28) 
    at paket.Test.main(Test.java:43) 

我已经成功地验证了下面的XML与相同的代码:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
<SignedInfo> 
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
<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>+uYi9GD7lNpk5+AZWjVylxm4PeKGXoFEalJPd44oMeg=</DigestValue> 
</Reference> 
</SignedInfo> 
<SignatureValue>Ov9TJmROGakTblMO8F2otx3YsmzY1N7tUEuJVauqP4EgePUtYpfMdiv1fKdZreeLyri7WRIOrxiq 
mEJEWCmpzVKZypJ293y4STmRw4rfUgFQeaatj2AmK2q5zDaE9jzl6+HtiRgDykZpgx7DWC8MHydK 
P8wnEHyn2ozYdqL0VCjRfk95zcm0jMknWmytippXf1bqufkhlOLdS46VGyvYM8ZAc742MN3QX1+I 
SvNs1a+FNrgQwb0NaYLzX2hWOtFNo2ZparQXynfQy1jj6JHBRvmldLjHiI4nwYgtfEZL6Fgh/H6c 
PSnM/Sd6hoh1B6zjhbIViqfaLKLkds/Et6WNYw==</SignatureValue> 
<KeyInfo> 
<KeyValue> 
<RSAKeyValue> 
<Modulus>xhbxdz2KP0/GwuoBuE2EfqoSUHj5nTZAC7c+UoUYtpqC8yRfe6BaFjdT/kWJNM8rZhJRawkh8qub 
U4Iag0N1Cu8JNgOMXjeFJnVpa1HDijk9blQhLybGawh+TrC1v8D/9OGN5avkAjG/jpEFofOUpINp 
Z2ThbhjgOzZV2kSa776nlwLhTLChf0iL5a78otVcDcuU8nmVkkhwFLbggbIRgdVFAk0bKFDYwWqw 
kOmimDs2c7lLvu9n+X6IEFJLKt5YmKsBlhxx7LjvVih7vFc27+OtQpKw2EZjHPpmcP/qOEzESOCe 
C8AHDrw3EWU5n1Bib8t8WteE5WPd2HbsJ86o3w==</Modulus> 
<Exponent>AQAB</Exponent> 
</RSAKeyValue> 
</KeyValue> 
</KeyInfo> 
</Signature> 

这个两个XML签名之间有什么区别,为什么它是w在第二个XML示例上而不是在第一个上?

回答

0

不同的是,在第一个XML您提供的密钥信息与键名

<KeyInfo> 
<KeyName>7D665C81ABBE1A7D0E525BFC171F04D276F07BF2</KeyName> 
</KeyInfo> 

和第二:

<KeyInfo> 
<KeyValue> 
<RSAKeyValue> 
<Modulus>xhbxdz2KP0/GwuoBuE2EfqoSUHj5nTZAC7c+UoUYtpqC8yRfe6BaFjdT/kWJNM8rZhJRawkh8qub 
U4Iag0N1Cu8JNgOMXjeFJnVpa1HDijk9blQhLybGawh+TrC1v8D/9OGN5avkAjG/jpEFofOUpINp 
Z2ThbhjgOzZV2kSa776nlwLhTLChf0iL5a78otVcDcuU8nmVkkhwFLbggbIRgdVFAk0bKFDYwWqw 
kOmimDs2c7lLvu9n+X6IEFJLKt5YmKsBlhxx7LjvVih7vFc27+OtQpKw2EZjHPpmcP/qOEzESOCe 
C8AHDrw3EWU5n1Bib8t8WteE5WPd2HbsJ86o3w==</Modulus> 
<Exponent>AQAB</Exponent> 
</RSAKeyValue> 
</KeyValue> 
</KeyInfo> 
+0

可以第一个版本将只与键名验证??? – kozla13

+0

错误很明显说没有找到KeyValue元素_javax.xml.crypto.KeySelectorException:没有KeyValue元素found_。希望有所帮助! – Anshu

+0

问题是只能通过KeyName节点进行验证。 – kozla13

1

的KeyValueKeySelector不会帮助你在这里,因为该签名不包含键值。 您必须扩展KeySelector并实现一个KeyNameKeySelector,它将根据给定的KeyName在一个KeyStore中查找实际的密钥。假设您在该密钥库中拥有该密钥,那么您可以验证该签名。

这应该让你去:http://jirablog.blogspot.no/2007/11/xml-signature-pouzit-nebo-ne.html