2016-12-12 30 views
1

Привет я получил этот ErrorMessage:opensaml 3 подписи от ответа SAML является нулевым

net.shibboleth.utilities.java.support.logic.ConstraintViolationException: Signature was null 

На проверке ответа SAML от Azure AD.

Для целей тестирования я сохранил файл ответов как XML и нашел тег:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
     <ds:SignedInfo> 
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
      <ds:SignatureMethod 
       Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> 
      <ds:Reference URI="#_97031c65-0139-4047-a416-9495df5d6ed7"> 
       <ds:Transforms> 
        <ds:Transform 
         Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
       </ds:Transforms> 
       <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> 
       <ds:DigestValue> 
        KMaFHRt8inqVYsMGKnAryKUTQUbYGPUDPxdvj6T08OQ= 
       </ds:DigestValue> 
      </ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue> 
      ..... 
     </ds:SignatureValue> 
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
      <X509Data> 
       <X509Certificate> 
        .... 
       </X509Certificate> 
      </X509Data> 
     </KeyInfo> 
    </ds:Signature> 

я маршализацию ответ XML:

InitializationService.initialize(); 
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
documentBuilderFactory.setNamespaceAware(true); 
DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder(); 
String content = new String(Files.readAllBytes(Paths.get("saml_response_azure.xml"))); 
Document document = docBuilder.parse(new ByteArrayInputStream(content.trim().getBytes())); 

Element element = document.getDocumentElement(); 
Unmarshaller unmarshaller = XMLObjectProviderRegistrySupport.getUnmarshallerFactory().getUnmarshaller(element); 
Response response = (Response) unmarshaller.unmarshall(element); 

И ошибке отбрасывается на:

Signature signature = response.getAssertions().get(0).getSignature() // returns null 

SAMLSignatureProfileValidator profValidator = new SAMLSignatureProfileValidator(); 
profValidator.validate(signature); 
+0

Можете ли вы предоставить весь ответ где-нибудь? Например, –

+0

https://gist.github.com/Gobliins/26d8f760f120430eaeb29c223f2e436f Я заменил учетные данные некоей случайной информацией – Gobliins

+0

КПП. в opensaml 2.6.x У меня не было этой проблемы – Gobliins

ответ

2

Хорошо, думаю, я нашел его, похоже, что вы не добавляли никаких зависимостей от реализации для POM. Когда я использую ваш POM и включаю эту зависимость, я получаю объект подписи.

<dependency> 
    <groupId>org.opensaml</groupId> 
    <artifactId>opensaml-saml-impl</artifactId> 
    <version>3.2.0</version> 
</dependency> 

Модульная структура зависимостей является большим отличием от версии 2 OpenSAML.

+0

Работал. Можете ли вы также взглянуть на это: https://stackoverflow.com/questions/41116985/opensaml-xmlns-is-not-generated-on-nameidpolicy-and-authncontext – Gobliins