2015-01-23 2 views
0

У меня нет ни малейшего понятия, как регистрировать ошибку в проекте Shibboleth, поэтому я напишу некоторые выводы, которые я встречал с проверкой подписи OpenSAML. Возникает проблема, связанная с тем, как OpenSAML (2.0) пытается проверить подписи в метаданных SAML (EntitiesDescriptor).OpenSAML (2.0) EntitiesDescriptor подпись валидация не работает

Я пытался отчаянно проверить подпись в моей структуре метаданных SAML с помощью FilesystemMetadataProvider, однако она всегда меня выводит NullPointerException. Есть еще некоторые статьи об этой проблеме в другом месте, но никто, похоже, не знал о том, почему именно.

Теперь я первый попытался было что-то вроде этого:

FilesystemMetadataProvider provider = new FilesystemMetadataProvider(new File("metadata.xml")); 
provider.setRequireValidMetadata(true); 
provider.setParserPool(new BasicParserPool()); 
provider.initialize(); 
EntitiesDescriptor ed = provider.getEntitiesDescriptor("My Servers"); 
SignatureValidator validator = new SignatureValidator(getTrustedCredential()); 
validator.validate(ed.getSignature()); 

Это постоянно заканчивается бросать исключение:

java.lang.NullPointerException в org.opensaml.xml.signature.SignatureValidator.validate (SignatureValidator.java:69)

После некоторой отладки вокруг классов XMLTooling и OpenSAML я нашел причину ошибки. Проблема, как представляется, в том, как XMLSignature обрабатывается в классе org.opensaml.xml.signature.impl.SignatureImpl:

public void releaseDOM() { 
    super.releaseDOM(); 
    **this.xmlSignature = null;** 
    if (this.keyInfo != null) { 
    this.keyInfo.releaseChildrenDOM(true); 
    this.keyInfo.releaseDOM(); 
    } 
} 

public XMLSignature getXMLSignature() { 
    return this.xmlSignature; 
} 

public void setXMLSignature(XMLSignature signature) { 
    this.xmlSignature = ((XMLSignature)prepareForAssignment(this.xmlSignature, signature)); 
} 

Теперь SignatureValidator запускает эти методы в порядке setXMLSignature() -> releaseDOM() -> getXMLSignature(), который не может проверить EntitiesDescriptor. Однако с другими типами подписей это, похоже, работает нормально.

В качестве временного решения было два способа, которые мне удалось проверить подпись:

1) Обратное проектирование класс SignatureImpl и удаление «this.xmlSignature = NULL;» от releaseDOM методы()

2) Переопределение проверки подписи с использованием XML синтаксического анализа и демаршаллинга (как показано ниже)

File file = new File("metadata.xml"); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document document = db.parse(file); 
UnmarshallerFactory unmarshallerFactory = Configuration.getUnmarshallerFactory(); 
Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(document.getDocumentElement()); 
EntitiesDescriptor ed = (EntitiesDescriptor) unmarshaller.unmarshall(document.getDocumentElement()); 
SignatureValidator validator = new SignatureValidator(getTrustedCredential()); 
validator.validate(ed.getSignature()); 

Кто-нибудь еще видел эту проблему?

ответ

0

Как файл ошибки и др: https://shibboleth.net/community/

Вам не нужно перепроектировать его, источник OpenSAML доступен: http://svn.shibboleth.net/view/java-opensaml2/trunk/src

OpenSAML источник репо имеет модульные тесты, которые охватывают большую часть своего кода базы , Здесь вы можете узнать, как использовать библиотеку. Например, проверка подписи в метаданных инкапсулируется в класс SignatureValidationFilter. Ниже приведен единичный тест, показывающий, как его использовать: http://svn.shibboleth.net/view/java-opensaml2/trunk/src/test/java/org/opensaml/saml2/metadata/provider/SignatureValidationFilterTest.java

Из этого модульного теста вы можете увидеть, что они используют SAMLSignatureProfileValidator в качестве реализации Validator. Это сложнее, чем простой SignatureValidator.

Try SignatureValidationFilter. Если он все еще не работает, разместите здесь свои метаданные.

Смежные вопросы