2015-01-23 4 views
0

을 작동하지 않는, 그래서 내가 OpenSAML 서명 유효성 검사 건너 한 몇 가지 연구 결과를 쓸 것이다. OpenSAML (2.0)이 SAML 메타 데이터 (EntitiesDescriptor)에서 서명의 유효성 검사를 시도하는 방식과 관련된 문제가 있습니다. OpenSAML (2.0) EntitiesDescriptor 서명 검증은 내가 어떻게 표어 프로젝트에 버그를 기록하는 단서가 없다

나는 그러나 그것은 나를 항상 NullPointerException이 발생, 필사적으로 FilesystemMetadataProvider 내 SAML 메타 데이터 구조의 서명을 검증하기 위해 노력했다. 다른 곳에서도이 문제에 관한 다른 기사가 있지만 정확한 이유를 알 수있는 사람은 아무도 없습니다. 내가 처음 시도 이제 어떻게

는 다음과 같이이었다 : org.opensaml.xml.signature.SignatureValidator.validate에

java.lang.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()); 

이 지속적으로 예외를 던지는 끝 (SignatureValidator.java:69)

XMLTooling 및 OpenSAML 클래스 주위 디버깅 후, 나는 오류의 이유를 발견했다. 문제는 해 XMLSignature가 org.opensaml.xml.signature.impl.SignatureImpl 클래스에서 처리되는 방식에있을 것 같다 : 이제 SignatureValidator는 주문 setXMLSignature에이 방법을 실행

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)); 
} 

() -> 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 소스의 repo는 자신의 코드베이스의 대부분을 충당 단위 테스트를 가지고 . 여기에서 라이브러리 사용법을 배울 수 있습니다. 예를 들어 메타 데이터의 서명 유효성 검사는 SignatureValidationFilter 클래스에 캡슐화됩니다. 다음은 단위 테스트를 사용하는 방법을 보여줍니다. http://svn.shibboleth.net/view/java-opensaml2/trunk/src/test/java/org/opensaml/saml2/metadata/provider/SignatureValidationFilterTest.java

이 단위 테스트에서는 SAMLSignatureProfileValidator를 Validator의 구현으로 사용하고 있음을 알 수 있습니다. 일반 SignatureValidator보다 정교합니다.

해보십시오 SignatureValidationFilter. 그래도 작동하지 않으면 여기에 메타 데이터를 게시하십시오.