У меня нет ни малейшего понятия, как регистрировать ошибку в проекте 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());
Кто-нибудь еще видел эту проблему?