2017-04-26 5 views
0

J'ai utilisé OpenSaml V2 pendant un certain temps, ce qui fonctionne bien, et j'ai récemment commencé la migration. En raison du manque d'informations, même à partir du livre OpenSaml V3 que j'ai récemment acheté, j'ai quelques problèmes avec quelques choses qui fonctionnaient bien avec V2.Erreur/exception lors du rassemblement de la réponse signée et cryptée OpenSAML v3

J'ai utilisé la méthode suivante pour chiffrer l'assertion. Cette méthode semble fonctionner correctement.

private EncryptedAssertion createEncryptedAssertion(Assertion assertion) throws SamlException { 

    try { 
     Credential keyEncryptionCredential = CredentialSupport.getSimpleCredential(this.encryptingCertificate, this.encryptingPrivateKey); 

     DataEncryptionParameters encryptionParameters = new DataEncryptionParameters(); 
     encryptionParameters.setAlgorithm(EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128); 

     KeyEncryptionParameters keyEncryptionParameters = new KeyEncryptionParameters(); 
     keyEncryptionParameters.setEncryptionCredential(keyEncryptionCredential); 
     keyEncryptionParameters.setAlgorithm(EncryptionConstants.ALGO_ID_KEYTRANSPORT_RSAOAEP); 

     Encrypter samlEncrypter = new Encrypter(encryptionParameters, keyEncryptionParameters); 
     samlEncrypter.setKeyPlacement(Encrypter.KeyPlacement.INLINE); 

     return samlEncrypter.encrypt(assertion); 
    } 
    catch(Exception e) { 
     throw new SamlException(e); 
    } 
} 

Le problème que j'ai arrive lorsque je tente de marshall ma réponse à l'affirmation chiffrée, en utilisant la méthode suivante:

public String marshall(XMLObject xmlObject, boolean encode) throws SamlException { 

    try { 

     ParserPool parserPool = XMLObjectProviderRegistrySupport.getParserPool(); 
     MarshallerFactory marshallerFactory = XMLObjectProviderRegistrySupport.getMarshallerFactory(); 
     Marshaller marshaller = marshallerFactory.getMarshaller(xmlObject); 
     if(marshaller == null) { 
      throw new SamlException("Unable to locate marshaller for " + xmlObject.getElementQName() 
           + " can not perform marshalling operation"); 
     } 

     Element element = marshallerFactory.getMarshaller(xmlObject).marshall(xmlObject, parserPool.newDocument()); 

     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3"); 

     StreamResult result = new StreamResult(new StringWriter()); 
     DOMSource source = new DOMSource(element); 

     transformer.transform(source, result); 
     String xmlString = result.getWriter().toString(); 

     if(encode) { 
      //return Util.base64EncodeMessage(xmlString); 
     } 
     return xmlString; 
    } 
    catch(Exception e) { 
     throw new SamlException(e); 
    } 
} 

Lorsque je tente de marshall ma réponse avec l'affirmation chiffrée, je reçois l'exception suivante:

Caused by: org.opensaml.core.xml.io.MarshallingException: Unable to root namespaces of cached DOM element, {http://www.w3.org/2001/04/xmlenc#}EncryptionMethod 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.prepareForAdoption(AbstractXMLObjectMarshaller.java:427) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshall(AbstractXMLObjectMarshaller.java:144) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallChildElements(AbstractXMLObjectMarshaller.java:271) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallInto(AbstractXMLObjectMarshaller.java:212) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshall(AbstractXMLObjectMarshaller.java:162) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallChildElements(AbstractXMLObjectMarshaller.java:271) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallInto(AbstractXMLObjectMarshaller.java:212) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshall(AbstractXMLObjectMarshaller.java:162) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallChildElements(AbstractXMLObjectMarshaller.java:271) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallInto(AbstractXMLObjectMarshaller.java:212) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshall(AbstractXMLObjectMarshaller.java:162) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallChildElements(AbstractXMLObjectMarshaller.java:271) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallInto(AbstractXMLObjectMarshaller.java:212) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshall(AbstractXMLObjectMarshaller.java:162) 
at org.opensaml.saml.common.AbstractSAMLObjectMarshaller.marshall(AbstractSAMLObjectMarshaller.java:65) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallChildElements(AbstractXMLObjectMarshaller.java:271) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshallInto(AbstractXMLObjectMarshaller.java:212) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.marshall(AbstractXMLObjectMarshaller.java:118) 
at org.opensaml.saml.common.AbstractSAMLObjectMarshaller.marshall(AbstractSAMLObjectMarshaller.java:57) 
at com.divinvest.sso.opensaml.SamlAssertionProducerV2.marshall(SamlAssertionProducerV2.java:171) 
... 25 more 
Caused by: org.w3c.dom.DOMException: Unable to resolve namespace prefix ds found on element {http://www.w3.org/2000/09/xmldsig#}DigestMethod 
at net.shibboleth.utilities.java.support.xml.NamespaceSupport.rootNamespaces(NamespaceSupport.java:247) 
at net.shibboleth.utilities.java.support.xml.NamespaceSupport.rootNamespaces(NamespaceSupport.java:295) 
at net.shibboleth.utilities.java.support.xml.NamespaceSupport.rootNamespaces(NamespaceSupport.java:200) 
at org.opensaml.core.xml.io.AbstractXMLObjectMarshaller.prepareForAdoption(AbstractXMLObjectMarshaller.java:422) 
... 44 more 

Est-ce que je manque quelque chose dans la méthode unmarshall? Je suis marshall mes objets de réponse avec l'assertion signée, réponse signée mais quand l'assertion est cryptée, je ne peux pas.

Merci

Répondre

0

La question était que xmltooling apportait la mauvaise version xmlsec (1.5.7), je devais inclure une exclusing afin d'utiliser xmlsec 2.0.5 qui utilise par OpenSAML-sécurité-api .