javax.xml.crypto.URIReferenceException:

I am trying to write XML Digital signature code using xmldsig.jar from JAVA Web Services Developer Pack 2.0.

It works fine if I sign whole document. If I try to sign only reference..i.e. part of document by specifying URI while creatig Reference, it doesnt work. Its throwing below error...

Any light? Thanks for your help...

javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Could not find a resolver for URI /S:Envelope/S:Header/wsse:Security/saml:Assertion and Base /

at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(DOMReference.java:366)

at org.jcp.xml.dsig.internal.dom.DOMReference.digest(DOMReference.java:278)

at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(DOMXMLSignature.java:441)

at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:337)

at GenEnveloped.main(GenEnveloped.java:130)

Caused by: javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Could not find a resolver for URI /S:Envelope/S:Header/wsse:Security/saml:Assertion and Base /

at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(DOMURIDereferencer.java:84)

at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(DOMReference.java:358)

... 4 more

Caused by: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Could not find a resolver for URI /S:Envelope/S:Header/wsse:Security/saml:Assertion and Base /

at com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver.getInstance(Unknown Source)

at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(DOMURIDereferencer.java:75)

... 5 more

javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Could not find a resolver for URI /S:Envelope/S:Header/wsse:Security/saml:Assertion and Base /

at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(DOMURIDereferencer.java:84)

at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(DOMReference.java:358)

at org.jcp.xml.dsig.internal.dom.DOMReference.digest(DOMReference.java:278)

at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(DOMXMLSignature.java:441)

at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:337)

at GenEnveloped.main(GenEnveloped.java:130)

Caused by: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Could not find a resolver for URI /S:Envelope/S:Header/wsse:Security/saml:Assertion and Base /

at com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver.getInstance(Unknown Source)

at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(DOMURIDereferencer.java:75)

... 5 more

javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Could not find a resolver for URI /S:Envelope/S:Header/wsse:Security/saml:Assertion and Base /

at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(DOMURIDereferencer.java:84)

at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(DOMReference.java:358)

at org.jcp.xml.dsig.internal.dom.DOMReference.digest(DOMReference.java:278)

at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(DOMXMLSignature.java:441)

at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:337)

at GenEnveloped.main(GenEnveloped.java:130)

Caused by: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Could not find a resolver for URI /S:Envelope/S:Header/wsse:Security/saml:Assertion and Base /

at com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver.getInstance(Unknown Source)

at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(DOMURIDereferencer.java:75)

... 5 more

Exception in thread "main"

[4193 byte] By [AjitRa] at [2007-10-2 22:31:45]
# 1
Hi Ajith, I too am getting the same exception, can you let me know whether it was resloved and how.Rgds,Satish
satish_s_kumara at 2007-7-14 1:49:14 > top of Java-index,Security,Other Security APIs, Tools, and Issues...
# 2

Hi Satish,

API Doesnt support full XPointer by default. Thats why I was getting that error. If you try just Element ID then it work. To use XPointer you need to use URIDereferencer. I havent tried it, but it should work :)

http://weblogs.java.net/blog/mullan/archive/2006/06/supporting_addi.html

Hope this helps.

Cheers,

Ajit

AjitRa at 2007-7-14 1:49:14 > top of Java-index,Security,Other Security APIs, Tools, and Issues...
# 3

Hi AjitR,

I'm not sure if my error is the same as yours, I also have a URIReferenceException, but only with "file:/...." method, not with "http://..." method.

I have read the article on extending URIDereferencer http://weblogs.java.net/blog/mullan/archive/2006/06/supporting_addi.html, but since it was too compact, I couldn't know how to start.

I would try to explain my problem as the next post

URIReferenceExceptiona at 2007-7-14 1:49:14 > top of Java-index,Security,Other Security APIs, Tools, and Issues...
# 4

Dear all

I've got a

"Exception in thread "main" javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: java.lang.NullPointerException"

which occurs at the line below.

-

signature.sign(dsc);

-

The cause of the problem is the use of a URI-type reference: if I use a "file:/..." one, Exception occurs, if I use a "http://..." one, then there is no Exception

--

Reference ref_1 = xsfac.newReference("file:/C:/temp/myPix.jpg",xsfac.newDigestMethod(DigestMethod.SHA1, null));

Reference ref_2 = xsfac.newReference("file:///C:/temp/myPix.jpg",xsfac.newDigestMethod(DigestMethod.SHA1, null));

Reference ref_3 = xsfac.newReference("http://www.mycompany.com/data/myPix.jpg", xsfac.newDigestMEthod(DigestMethod.SHA1,null));

--

Below is the full code

import javax.xml.crypto.dsig.XMLSignatureFactory;

public class GenSig{

XMLSignatureFactory xsfac = XMLSignatureFactory.getInstance("DOM");

Reference ref_1 = xsfac.newReference("file:/C:/temp/myPix.jpg",xsfac.newDigestMethod(DigestMethod.SHA1, null));

Reference ref_2 = xsfac.newReference("file:///C:/temp/myPix.jpg",xsfac.newDigestMethod(DigestMethod.SHA1, null));

Reference ref_3 = xsfac.newReference("http://www.mycompany.com/data/myPix.jpg", xsfac.newDigestMEthod(DigestMethod.SHA1,null));

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setNamespaceAware(true);

Document doc = dbf.newDocumentBuilder().newDocument();

SignedInfo si = fac.newSignedInfo(

fac.newCanonicalizationMethod(

CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,

(C14NMethodParameterSpec)null),

fac.newSignatureMethod(SignatureMethod.DSA_SHA1, null),

Collections.singletonList(ref_1));

KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");

kpg.initialize(512);

KeyPair kp = kpg.generateKeyPair();

KeyInfoFactory kif = fac.getKeyInfoFactory();

KeyValue kv = kif.newKeyValue(kp.getPublic());

KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv));

XMLSignature signature = fac.newXMLSignature(si, ki);

DOMSignContext dsc = new DOMSignContext(kp.getPrivate(), doc);

signature.sign(dsc);

OutputStream os;

if (args.length > 0){

os = new FileOutputStream(args[1]);

}else{

os = System.out;

}

TransformerFactory tf = TransformerFactory.newInstance();

Transformer trans = tf.newTransformer();

trans.transform(new DOMSource(doc), new StreamResult(os));

}

The full error message is as below:

-

[java] Exception in thread "main" javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: java.lang.NullPointerException

[java] at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(Unknown Source)

[java] at org.jcp.xml.dsig.internal.dom.DOMReference.digest(Unknown Source)

[java] at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(Unknown Source)

[java] at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(Unknown Source)

[java] at dsig.detached.GenSig.main(GenSig.java:90)

[java] Caused by: javax.xml.crypto.URIReferenceException: java.lang.NullPointerException

[java] at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(Unknown Source)

[java] ... 5 more

[java] Caused by: java.lang.NullPointerException

[java] at com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverDirectHTTP.engineCanResolve(Unknown Source)

[java] at com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver.canResolve(Unknown Source)

[java] at com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver.getInstance(Unknown Source)

[java] ... 6 more

[java] javax.xml.crypto.URIReferenceException: java.lang.NullPointerException

[java] at org.jcp.xml.dsig.internal.dom.DOMURIDereferencer.dereference(Unknown Source)

[java] at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(Unknown Source)

[java] at org.jcp.xml.dsig.internal.dom.DOMReference.digest(Unknown Source)

[java] at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(Unknown Source)

[java] at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(Unknown Source)

[java] at dsig.detached.GenSig.main(GenSig.java:90)

[java] Caused by: java.lang.NullPointerException

[java] at com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverDirectHTTP.engineCanResolve(Unknown Source)

[java] at com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver.canResolve(Unknown Source)

[java] at com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver.getInstance(Unknown Source)

[java] ... 6 more

[java] Java Result: 1

-

URIReferenceExceptiona at 2007-7-14 1:49:14 > top of Java-index,Security,Other Security APIs, Tools, and Issues...
# 5

This is a known bug. It has been fixed in the Apache XML Security implementation (1.4

and up) but hasn't been fixed in the JDK yet. See http://issues.apache.org/bugzilla/show_bug.cgi?id=40783

for more details on the bug.

As a workaround, set your Base URI to something other than null using the

javax.xml.crypto.XMLSignContext.setBaseURI method.

smullana at 2007-7-14 1:49:14 > top of Java-index,Security,Other Security APIs, Tools, and Issues...
# 6
Thank you SeanI will digest it
URIReferenceExceptiona at 2007-7-14 1:49:14 > top of Java-index,Security,Other Security APIs, Tools, and Issues...