OpenSAML and Apache Santuario (xmlsec) 1.5.1

Stephanie Stroka stephanie.stroka at adnovum.ch
Fri Apr 13 12:34:24 BST 2012


Hey Brent,

thanks for testing and investing your time into that!
I may have figured out what causes the trouble.
Though I'm still not sure about how to resolve it.

First of all: unmarshalling non encrypted messages seems to work fine, 
except when the unmarshalled msg is marshalled again for 
logging/debugging purposes: This causes the Id to be lost.

The second problem may be caused by using 
org.opensaml.saml2.encryption.Decrypter	to decrypt an 
org.opensaml.xml.XMLObject:

There's the stack trace to where I figured out the problem:

Thread [main] (Suspended)	
	AssertionUnmarshaller.processAttribute(XMLObject, Attr) line: 81	
	AssertionUnmarshaller(AbstractXMLObjectUnmarshaller).unmarshallAttribute(XMLObject, Attr) line: 239	
	AssertionUnmarshaller(AbstractXMLObjectUnmarshaller).unmarshall(Element) line: 108	
	Decrypter(Decrypter).decryptDataToList(EncryptedData, boolean) line: 467	
	Decrypter(Decrypter).decryptData(EncryptedData, boolean) line: 400	
	Decrypter.decryptData(EncryptedElementType) line: 141	
	Decrypter.decrypt(EncryptedAssertion) line: 69	
	Decrypter.decrypt(XMLObject) line: 152	
	Decrypter.decryptWhereNeccessary(XMLObject, EncryptionPass) line: 193	
	Decrypter.decryptWhereNeccessary(XMLObject, EncryptionPass) line: 209	
	Toolbox.verifySignature(SignableSAMLObject, String, AuthRequest, 
AuthResponse) line: 1477	
	ServiceProviderState.consume(Response, AuthRequest, AuthResponse) 
line: 223	
	ServiceProviderState.authenticate(AuthRequest, AuthResponse) line: 920	
	ServiceProviderState(AuthState).process(AuthRequest, AuthResponse) 
line: 91	
	AuthStateHarness.process(TestContext) line: 154	
	AuthStateHarness.authenticate(TestContext) line: 169	
	tSAMLUnitTests.encryptAssertion_redirect_noKeyInfo() line: 148	
	NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
available [native method]	
	NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39	
	DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25	
	Method.invoke(Object, Object...) line: 597	
	FrameworkMethod$1.runReflectiveCall() line: 44	
	FrameworkMethod$1(ReflectiveCallable).run() line: 15	
	FrameworkMethod.invokeExplosively(Object, Object...) line: 41	
	InvokeMethod.evaluate() line: 20	
	BlockJUnit4ClassRunner(ParentRunner<T>).runLeaf(Statement, Description, 
RunNotifier) line: 263	
	BlockJUnit4ClassRunner.runChild(FrameworkMethod, RunNotifier) line: 69	
	BlockJUnit4ClassRunner.runChild(Object, RunNotifier) line: 48	
	ParentRunner$3.run() line: 231	
	ParentRunner$1.schedule(Runnable) line: 60	
	BlockJUnit4ClassRunner(ParentRunner<T>).runChildren(RunNotifier) line: 229	
	ParentRunner<T>.access$000(ParentRunner, RunNotifier) line: 50	
	ParentRunner$2.evaluate() line: 222	
	RunBefores.evaluate() line: 28	
	RunAfters.evaluate() line: 31	
	BlockJUnit4ClassRunner(ParentRunner<T>).run(RunNotifier) line: 292	
	JUnit4TestAdapter.run(TestResult) line: 39	
	JUnitTestRunner.run() line: 421	
	JUnitTestRunner.launch(JUnitTest, boolean, boolean, boolean, boolean, 
boolean, boolean, Properties) line: 912	
	JUnitTestRunner.main(String[]) line: 766	
	

processAttribute(..) calls 
attribute.getOwnerElement().setIdAttributeNode(attribute, true)
which should register the ID attribute as an id.

Here's the content of attribute:

"attribute"		(id=96)
	flags		680
	localName	"ID"
	name		"ID"
	namespaceURI	null
	ownerNode 	ElementNSImpl (id=100)
	type		null
	value			"Assertion_d0bd8dd5b6d9b37731d6df773b369fde83408f45"

However, I wanted to verify that the ID is indeed registered, so I called
attribute.getOwnerElement().getOwnerDocument().getElementById("Assertion_d0bd8dd5b6d9b37731d6df773b369fde83408f45")
in the debugger and null is returned.

Do you have any ideas what might have gone wrong?

We are using xerces 2.9.1 and xalan 2.7.0.
To be honest, I've no idea how it has been endorsed into the JVM nor do 
I know anything about you install instructions ;-).
This project that I'm working on is about 10 years old and I just 
started 1 month ago.

I am using Java hotspot 1.6.0 under Linux x86 32bit, but the testing 
environment also (additionally) runs on 64bit Linux and under Solaris.

Steffi



On 04/12/12 23:18, Brent Putman wrote:
>
>
> On 4/12/12 1:12 PM, Brent Putman wrote:
>> I have not tried running OpenSAML v2 with the newer Santuario yet.  I'll
>> do some quick tests later today or tomorrow to see if I experience the
>> same issue.
>
> I did some testing. I was not able to reproduce this by just switching
> OpenSAML 2 to use 1.5.1.  All our signature signing and validation tests
> work fine for me.
>
> Your and Scott's comments about the SAML signature profile validator
> made me realize that the ID-ness of the attributes and their resolution
> can't be fundamentally broken in OpenSAML, and the Santuario IdResolver
> must be finding the ID's by DOM search and not by the fallback behavior
> that was removed in 1.5.0.  If that were the case, we'd be seeing
> routine failures of things in the profile validator, which uses the DOM
> search exclusively, before it even attempted to validate the signature.
>
> I also confirmed this by turning on DEBUG logging level for category:
> org.apache.xml.security.utils.IdResolver.  With 1.4.x, I  see output
> similar to the following:
>
> DEBUG IdResolver - getElementByIdType() Search for ID
> _b32801700a13922734aeb359f296ddac
> DEBUG IdResolver - getElementByIdUsingDOM() Search for ID
> _b32801700a13922734aeb359f296ddac
> DEBUG IdResolver - I could find an Element using the simple
> getElementByIdUsingDOM method: saml2:Assertion
>
> The line about getElementByIdType() is a little misleading - looking at
> code, what that really does is attempt to resolve from the IdResolver
> cache, nothing more.  The last line indicates a successful resolution
> via the DOM method (despite the slightly awkward English phrasing there).
>
> In order to troubleshoot what's going on in your environment, you might
> try reverting back to 1.4.x, and turning on the debug logging above.  I
> suspect you'll see the first 2 lines, but not the "I could find..."
> line, which would mean the DOM search is failing.  Unfortunately, it
> doesn't explicitly log anything when it then does the manual search
> against well-known namespaces, but the absence of the "I could find..."
> line in conjunction with a successful resolution and signature
> validation would confirm that is what it's doing.
>
> Also, if you are running the SAMLSignatureProfileValidator, it shouldn't
> matter what version of Santuario you are using.  The DOM search there
> should fail if the ID-ness is lost, so that could be an indication of
> the problem.
>
> Since it's been working for a large number of people, I'd suspect
> either: 1) something you are doing after parsing but before validation
> is changing the DOM, as you earlier suggested or 2) an environment issue
> with your XML parsing environment.  Can you check and confirm what
> version of Xerces and Xalan you are using, and that you have properly
> endorsed them in your JVM per our install instructions?  If there is an
> issue with some combination of Xerces and Xalan, or a bug in some
> version of those libraries, we'd love to uncover that.
>
> Also, on what JRE vendor, version and OS platform are you seeing this error?
>
>
> --
> To unsubscribe from this list send an email to dev-unsubscribe at shibboleth.net


More information about the dev mailing list