This commit is contained in:
srasmusson
2016-05-09 00:00:23 +02:00
parent 4a8f8e98af
commit 45eae54018
6 changed files with 34 additions and 96 deletions

View File

@@ -2,13 +2,11 @@ package no.steras.opensamlbook.idp;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import net.shibboleth.utilities.java.support.xml.BasicParserPool; import net.shibboleth.utilities.java.support.xml.BasicParserPool;
import net.shibboleth.utilities.java.support.xml.XMLParserException;
import no.steras.opensamlbook.OpenSAMLUtils; import no.steras.opensamlbook.OpenSAMLUtils;
import no.steras.opensamlbook.sp.SPConstants; import no.steras.opensamlbook.sp.SPConstants;
import no.steras.opensamlbook.sp.SPCredentials; import no.steras.opensamlbook.sp.SPCredentials;
import org.apache.xml.security.utils.EncryptionConstants; import org.apache.xml.security.utils.EncryptionConstants;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.opensaml.core.xml.XMLObject;
import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
import org.opensaml.core.xml.io.*; import org.opensaml.core.xml.io.*;
import org.opensaml.core.xml.schema.XSString; import org.opensaml.core.xml.schema.XSString;
@@ -17,15 +15,12 @@ import org.opensaml.messaging.context.MessageContext;
import org.opensaml.messaging.decoder.MessageDecodingException; import org.opensaml.messaging.decoder.MessageDecodingException;
import org.opensaml.messaging.encoder.MessageEncodingException; import org.opensaml.messaging.encoder.MessageEncodingException;
import org.opensaml.saml.common.SAMLObject; import org.opensaml.saml.common.SAMLObject;
import org.opensaml.saml.common.binding.security.impl.MessageLifetimeSecurityHandler;
import org.opensaml.saml.saml2.binding.decoding.impl.HTTPSOAP11Decoder; import org.opensaml.saml.saml2.binding.decoding.impl.HTTPSOAP11Decoder;
import org.opensaml.saml.saml2.binding.encoding.impl.HTTPSOAP11Encoder; import org.opensaml.saml.saml2.binding.encoding.impl.HTTPSOAP11Encoder;
import org.opensaml.saml.saml2.core.*; import org.opensaml.saml.saml2.core.*;
import org.opensaml.saml.saml2.encryption.Encrypter; import org.opensaml.saml.saml2.encryption.Encrypter;
import org.opensaml.soap.messaging.context.SOAP11Context;
import org.opensaml.soap.soap11.Body;
import org.opensaml.soap.soap11.Envelope;
import org.opensaml.soap.soap11.decoder.http.impl.EnvelopeBodyHandler;
import org.opensaml.xmlsec.EncryptionParameters;
import org.opensaml.xmlsec.encryption.support.DataEncryptionParameters; import org.opensaml.xmlsec.encryption.support.DataEncryptionParameters;
import org.opensaml.xmlsec.encryption.support.EncryptionException; import org.opensaml.xmlsec.encryption.support.EncryptionException;
import org.opensaml.xmlsec.encryption.support.KeyEncryptionParameters; import org.opensaml.xmlsec.encryption.support.KeyEncryptionParameters;
@@ -35,45 +30,24 @@ import org.opensaml.xmlsec.signature.support.SignatureException;
import org.opensaml.xmlsec.signature.support.Signer; import org.opensaml.xmlsec.signature.support.Signer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.spec.ECField;
/**
* Created by Privat on 4/6/14.
*/
public class ArtifactResolutionServlet extends HttpServlet { public class ArtifactResolutionServlet extends HttpServlet {
private static Logger logger = LoggerFactory.getLogger(ArtifactResolutionServlet.class); private static Logger logger = LoggerFactory.getLogger(ArtifactResolutionServlet.class);
@Override @Override
protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
logger.debug("recieved artifactResolve"); logger.debug("recieved artifactResolve:");
HTTPSOAP11Decoder decoder = new HTTPSOAP11Decoder(); HTTPSOAP11Decoder decoder = new HTTPSOAP11Decoder();
decoder.setHttpServletRequest(req);
decoder.setHttpServletRequest(req);
try { try {
BasicParserPool parserPool = new BasicParserPool(); BasicParserPool parserPool = new BasicParserPool();
parserPool.initialize(); parserPool.initialize();
@@ -81,20 +55,18 @@ public class ArtifactResolutionServlet extends HttpServlet {
decoder.initialize(); decoder.initialize();
decoder.decode(); decoder.decode();
} catch (MessageDecodingException e) { } catch (MessageDecodingException e) {
e.printStackTrace(); throw new RuntimeException(e);
} catch (ComponentInitializationException e) { } catch (ComponentInitializationException e) {
e.printStackTrace(); throw new RuntimeException(e);
} }
OpenSAMLUtils.logSAMLObject(decoder.getMessageContext().getMessage()); OpenSAMLUtils.logSAMLObject(decoder.getMessageContext().getMessage());
ArtifactResponse artifactResponse = buildArtifactResponse(); ArtifactResponse artifactResponse = buildArtifactResponse();
MessageContext<SAMLObject> context = new MessageContext<SAMLObject>(); MessageContext<SAMLObject> context = new MessageContext<SAMLObject>();
context.setMessage(artifactResponse);
context.setMessage(artifactResponse);
HTTPSOAP11Encoder encoder = new HTTPSOAP11Encoder(); HTTPSOAP11Encoder encoder = new HTTPSOAP11Encoder();
encoder.setMessageContext(context); encoder.setMessageContext(context);
@@ -104,9 +76,9 @@ public class ArtifactResolutionServlet extends HttpServlet {
encoder.initialize(); encoder.initialize();
encoder.encode(); encoder.encode();
} catch (MessageEncodingException e) { } catch (MessageEncodingException e) {
e.printStackTrace(); throw new RuntimeException(e);
} catch (ComponentInitializationException e) { } catch (ComponentInitializationException e) {
e.printStackTrace(); throw new RuntimeException(e);
} }
@@ -295,15 +267,4 @@ public class ArtifactResolutionServlet extends HttpServlet {
return attributeStatement; return attributeStatement;
} }
public static Envelope wrapInSOAPEnvelope(final XMLObject xmlObject) {
Envelope envelope = OpenSAMLUtils.buildSAMLObject(Envelope.class);
Body body = OpenSAMLUtils.buildSAMLObject(Body.class);
body.getUnknownXMLObjects().add(xmlObject);
envelope.setBody(body);
return envelope;
}
} }

View File

@@ -1,8 +1,5 @@
package no.steras.opensamlbook.idp; package no.steras.opensamlbook.idp;
/**
* Created by Privat on 4/7/14.
*/
public class IDPConstants { public class IDPConstants {
public static final String IDP_ENTITY_ID = "TestIDP"; public static final String IDP_ENTITY_ID = "TestIDP";
public static final String SSO_SERVICE = "http://localhost:8080/webprofile-ref-project/idp/singleSignOnService"; public static final String SSO_SERVICE = "http://localhost:8080/webprofile-ref-project/idp/singleSignOnService";

View File

@@ -3,20 +3,8 @@ package no.steras.opensamlbook.idp;
import org.opensaml.security.credential.Credential; import org.opensaml.security.credential.Credential;
import org.opensaml.security.credential.CredentialSupport; import org.opensaml.security.credential.CredentialSupport;
import org.opensaml.security.crypto.KeySupport; import org.opensaml.security.crypto.KeySupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.security.*; import java.security.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Privat on 13/05/14.
*/
public class IDPCredentials { public class IDPCredentials {
private static final Credential credential; private static final Credential credential;
@@ -26,7 +14,6 @@ public class IDPCredentials {
private static Credential generateCredential() { private static Credential generateCredential() {
try { try {
//KeySupport
KeyPair keyPair = KeySupport.generateKeyPair("RSA", 1024, null); KeyPair keyPair = KeySupport.generateKeyPair("RSA", 1024, null);
return CredentialSupport.getSimpleCredential(keyPair.getPublic(), keyPair.getPrivate()); return CredentialSupport.getSimpleCredential(keyPair.getPublic(), keyPair.getPrivate());
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {

View File

@@ -1,6 +1,5 @@
package no.steras.opensamlbook.idp; package no.steras.opensamlbook.idp;
import no.steras.opensamlbook.OpenSAMLUtils;
import no.steras.opensamlbook.sp.SPConstants; import no.steras.opensamlbook.sp.SPConstants;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -12,14 +11,9 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
/**
* Created by Privat on 4/6/14.
*/
public class SingleSignOnServlet extends HttpServlet { public class SingleSignOnServlet extends HttpServlet {
private static Logger logger = LoggerFactory.getLogger(SingleSignOnServlet.class); private static Logger logger = LoggerFactory.getLogger(SingleSignOnServlet.class);
@Override @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("AuthnRequest recieved"); logger.info("AuthnRequest recieved");

View File

@@ -3,26 +3,25 @@ package no.steras.opensamlbook.sp;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import no.steras.opensamlbook.OpenSAMLUtils; import no.steras.opensamlbook.OpenSAMLUtils;
import no.steras.opensamlbook.idp.IDPConstants; import no.steras.opensamlbook.idp.IDPConstants;
import org.apache.commons.lang.ObjectUtils;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.chrono.ISOChronology;
import org.opensaml.core.config.InitializationException; import org.opensaml.core.config.InitializationException;
import org.opensaml.core.config.InitializationService; import org.opensaml.core.config.InitializationService;
import org.opensaml.core.config.Initializer;
import org.opensaml.messaging.context.InOutOperationContext;
import org.opensaml.messaging.context.MessageContext; import org.opensaml.messaging.context.MessageContext;
import org.opensaml.messaging.encoder.MessageEncodingException; import org.opensaml.messaging.encoder.MessageEncodingException;
import org.opensaml.saml.common.SAMLObject;
import org.opensaml.messaging.handler.MessageHandlerException;
import org.opensaml.messaging.pipeline.servlet.BasicHttpServletMessagePipeline;
import org.opensaml.messaging.pipeline.servlet.HttpServletMessagePipeline;
import org.opensaml.saml.common.SAMLObject;
import org.opensaml.saml.common.binding.security.impl.SAMLOutboundProtocolMessageSigningHandler;
import org.opensaml.saml.common.messaging.context.SAMLEndpointContext; import org.opensaml.saml.common.messaging.context.SAMLEndpointContext;
import org.opensaml.saml.common.messaging.context.SAMLMessageInfoContext;
import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext; import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext;
import org.opensaml.saml.common.xml.SAMLConstants; import org.opensaml.saml.common.xml.SAMLConstants;
import org.opensaml.saml.saml2.binding.encoding.impl.HTTPRedirectDeflateEncoder; import org.opensaml.saml.saml2.binding.encoding.impl.HTTPRedirectDeflateEncoder;
import org.opensaml.saml.saml2.core.*; import org.opensaml.saml.saml2.core.*;
import org.opensaml.saml.saml2.metadata.Endpoint; import org.opensaml.saml.saml2.metadata.Endpoint;
import org.opensaml.saml.saml2.metadata.SingleSignOnService; import org.opensaml.saml.saml2.metadata.SingleSignOnService;
import org.opensaml.xmlsec.SecurityConfigurationSupport;
import org.opensaml.xmlsec.SignatureSigningConfiguration;
import org.opensaml.xmlsec.SignatureSigningParameters; import org.opensaml.xmlsec.SignatureSigningParameters;
import org.opensaml.xmlsec.context.SecurityParametersContext; import org.opensaml.xmlsec.context.SecurityParametersContext;
import org.opensaml.xmlsec.signature.support.SignatureConstants; import org.opensaml.xmlsec.signature.support.SignatureConstants;
@@ -44,10 +43,6 @@ public class AccessFilter implements Filter {
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException { public void init(FilterConfig filterConfig) throws ServletException {
for (Provider jceProvider : Security.getProviders()) {
logger.info(jceProvider.getInfo());
}
try { try {
logger.info("Bootstrapping"); logger.info("Bootstrapping");
InitializationService.initialize(); InitializationService.initialize();
@@ -85,7 +80,6 @@ public class AccessFilter implements Filter {
MessageContext context = new MessageContext(); MessageContext context = new MessageContext();
SAMLPeerEntityContext peerEntityContext = context.getSubcontext(SAMLPeerEntityContext.class, true); SAMLPeerEntityContext peerEntityContext = context.getSubcontext(SAMLPeerEntityContext.class, true);
peerEntityContext.setEntityId(IDPConstants.IDP_ENTITY_ID);
SAMLEndpointContext endpointContext = peerEntityContext.getSubcontext(SAMLEndpointContext.class, true); SAMLEndpointContext endpointContext = peerEntityContext.getSubcontext(SAMLEndpointContext.class, true);
endpointContext.setEndpoint(getIPDEndpoint()); endpointContext.setEndpoint(getIPDEndpoint());
@@ -166,10 +160,6 @@ public class AccessFilter implements Filter {
return SPConstants.SP_ENTITY_ID; return SPConstants.SP_ENTITY_ID;
} }
private String getSPNameQualifier() {
return SPConstants.SP_ENTITY_ID;
}
private String getAssertionConsumerEndpoint() { private String getAssertionConsumerEndpoint() {
return SPConstants.ASSERTION_CONSUMER_SERVICE; return SPConstants.ASSERTION_CONSUMER_SERVICE;
} }

View File

@@ -7,6 +7,7 @@ import net.shibboleth.utilities.java.support.xml.BasicParserPool;
import no.steras.opensamlbook.OpenSAMLUtils; import no.steras.opensamlbook.OpenSAMLUtils;
import no.steras.opensamlbook.idp.IDPConstants; import no.steras.opensamlbook.idp.IDPConstants;
import no.steras.opensamlbook.idp.IDPCredentials; import no.steras.opensamlbook.idp.IDPCredentials;
import org.apache.xml.security.algorithms.MessageDigestAlgorithm;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.opensaml.core.xml.XMLObject; import org.opensaml.core.xml.XMLObject;
import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
@@ -16,6 +17,7 @@ import org.opensaml.messaging.context.InOutOperationContext;
import org.opensaml.messaging.context.MessageContext; import org.opensaml.messaging.context.MessageContext;
import org.opensaml.messaging.encoder.MessageEncodingException; import org.opensaml.messaging.encoder.MessageEncodingException;
import org.opensaml.messaging.handler.MessageHandler; import org.opensaml.messaging.handler.MessageHandler;
import org.opensaml.messaging.handler.MessageHandlerException;
import org.opensaml.messaging.handler.impl.BasicMessageHandlerChain; import org.opensaml.messaging.handler.impl.BasicMessageHandlerChain;
import org.opensaml.messaging.pipeline.httpclient.BasicHttpClientMessagePipeline; import org.opensaml.messaging.pipeline.httpclient.BasicHttpClientMessagePipeline;
import org.opensaml.messaging.pipeline.httpclient.HttpClientMessagePipeline; import org.opensaml.messaging.pipeline.httpclient.HttpClientMessagePipeline;
@@ -23,8 +25,12 @@ import org.opensaml.messaging.pipeline.httpclient.HttpClientMessagePipelineFacto
import org.opensaml.profile.context.ProfileRequestContext; import org.opensaml.profile.context.ProfileRequestContext;
import org.opensaml.saml.common.SAMLObject; import org.opensaml.saml.common.SAMLObject;
import org.opensaml.saml.common.binding.impl.SAMLSOAPDecoderBodyHandler; import org.opensaml.saml.common.binding.impl.SAMLSOAPDecoderBodyHandler;
import org.opensaml.saml.common.binding.security.impl.MessageLifetimeSecurityHandler;
import org.opensaml.saml.common.binding.security.impl.ReceivedEndpointSecurityHandler;
import org.opensaml.saml.common.binding.security.impl.SAMLOutboundProtocolMessageSigningHandler; import org.opensaml.saml.common.binding.security.impl.SAMLOutboundProtocolMessageSigningHandler;
import org.opensaml.saml.common.binding.security.impl.SAMLProtocolMessageXMLSignatureSecurityHandler;
import org.opensaml.saml.common.messaging.context.SAMLEndpointContext; import org.opensaml.saml.common.messaging.context.SAMLEndpointContext;
import org.opensaml.saml.common.messaging.context.SAMLMessageInfoContext;
import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext; import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext;
import org.opensaml.saml.common.xml.SAMLConstants; import org.opensaml.saml.common.xml.SAMLConstants;
import org.opensaml.saml.saml2.binding.decoding.impl.HttpClientResponseSOAP11Decoder; import org.opensaml.saml.saml2.binding.decoding.impl.HttpClientResponseSOAP11Decoder;
@@ -64,6 +70,10 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.ValidationException; import javax.xml.bind.ValidationException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/** /**
* Created by Privat on 4/6/14. * Created by Privat on 4/6/14.
@@ -78,10 +88,9 @@ public class ConsumerServlet extends HttpServlet {
logger.info("Artifact: " + artifact.getArtifact()); logger.info("Artifact: " + artifact.getArtifact());
ArtifactResolve artifactResolve = buildArtifactResolve(artifact); ArtifactResolve artifactResolve = buildArtifactResolve(artifact);
//signArtifactResolve(artifactResolve);
logger.info("Sending ArtifactResolve"); logger.info("Sending ArtifactResolve");
logger.info("ArtifactResolve: "); logger.info("ArtifactResolve: ");
//OpenSAMLUtils.logSAMLObject(artifactResolve); OpenSAMLUtils.logSAMLObject(artifactResolve);
ArtifactResponse artifactResponse = sendAndReceiveArtifactResolve(artifactResolve, resp); ArtifactResponse artifactResponse = sendAndReceiveArtifactResolve(artifactResolve, resp);
logger.info("ArtifactResponse received"); logger.info("ArtifactResponse received");
@@ -116,6 +125,7 @@ public class ConsumerServlet extends HttpServlet {
} }
private void verifyAssertionSignature(Assertion assertion) { private void verifyAssertionSignature(Assertion assertion) {
if (!assertion.isSigned()) { if (!assertion.isSigned()) {
throw new RuntimeException("The SAML Assertion was not signed"); throw new RuntimeException("The SAML Assertion was not signed");
} }
@@ -218,15 +228,14 @@ public class ConsumerServlet extends HttpServlet {
} catch (SecurityException e) { } catch (SecurityException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (ComponentInitializationException e) { } catch (ComponentInitializationException e) {
e.printStackTrace(); throw new RuntimeException(e);
} catch (MessageEncodingException e) { } catch (MessageEncodingException e) {
e.printStackTrace(); throw new RuntimeException(e);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
e.printStackTrace(); throw new RuntimeException(e);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); throw new RuntimeException(e);
} }
return null;
} }