parent
							
								
									bb9c7d1b6e
								
							
						
					
					
						commit
						812bb0ead0
					
				| 
						 | 
					@ -42,6 +42,9 @@ import org.opensaml.xmlsec.SignatureSigningParametersResolver;
 | 
				
			||||||
import org.opensaml.xmlsec.criterion.SignatureSigningConfigurationCriterion;
 | 
					import org.opensaml.xmlsec.criterion.SignatureSigningConfigurationCriterion;
 | 
				
			||||||
import org.opensaml.xmlsec.crypto.XMLSigningUtil;
 | 
					import org.opensaml.xmlsec.crypto.XMLSigningUtil;
 | 
				
			||||||
import org.opensaml.xmlsec.impl.BasicSignatureSigningConfiguration;
 | 
					import org.opensaml.xmlsec.impl.BasicSignatureSigningConfiguration;
 | 
				
			||||||
 | 
					import org.opensaml.xmlsec.keyinfo.KeyInfoGeneratorManager;
 | 
				
			||||||
 | 
					import org.opensaml.xmlsec.keyinfo.NamedKeyInfoGeneratorManager;
 | 
				
			||||||
 | 
					import org.opensaml.xmlsec.keyinfo.impl.X509KeyInfoGeneratorFactory;
 | 
				
			||||||
import org.opensaml.xmlsec.signature.SignableXMLObject;
 | 
					import org.opensaml.xmlsec.signature.SignableXMLObject;
 | 
				
			||||||
import org.opensaml.xmlsec.signature.support.SignatureConstants;
 | 
					import org.opensaml.xmlsec.signature.support.SignatureConstants;
 | 
				
			||||||
import org.opensaml.xmlsec.signature.support.SignatureSupport;
 | 
					import org.opensaml.xmlsec.signature.support.SignatureSupport;
 | 
				
			||||||
| 
						 | 
					@ -102,6 +105,7 @@ final class OpenSamlSigningUtils {
 | 
				
			||||||
		signingConfiguration.setSignatureAlgorithms(algorithms);
 | 
							signingConfiguration.setSignatureAlgorithms(algorithms);
 | 
				
			||||||
		signingConfiguration.setSignatureReferenceDigestMethods(digests);
 | 
							signingConfiguration.setSignatureReferenceDigestMethods(digests);
 | 
				
			||||||
		signingConfiguration.setSignatureCanonicalizationAlgorithm(canonicalization);
 | 
							signingConfiguration.setSignatureCanonicalizationAlgorithm(canonicalization);
 | 
				
			||||||
 | 
							signingConfiguration.setKeyInfoGeneratorManager(buildSignatureKeyInfoGeneratorManager());
 | 
				
			||||||
		criteria.add(new SignatureSigningConfigurationCriterion(signingConfiguration));
 | 
							criteria.add(new SignatureSigningConfigurationCriterion(signingConfiguration));
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			SignatureSigningParameters parameters = resolver.resolveSingle(criteria);
 | 
								SignatureSigningParameters parameters = resolver.resolveSingle(criteria);
 | 
				
			||||||
| 
						 | 
					@ -113,6 +117,22 @@ final class OpenSamlSigningUtils {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private static NamedKeyInfoGeneratorManager buildSignatureKeyInfoGeneratorManager() {
 | 
				
			||||||
 | 
							final NamedKeyInfoGeneratorManager namedManager = new NamedKeyInfoGeneratorManager();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							namedManager.setUseDefaultManager(true);
 | 
				
			||||||
 | 
							final KeyInfoGeneratorManager defaultManager = namedManager.getDefaultManager();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Generator for X509Credentials
 | 
				
			||||||
 | 
							final X509KeyInfoGeneratorFactory x509Factory = new X509KeyInfoGeneratorFactory();
 | 
				
			||||||
 | 
							x509Factory.setEmitEntityCertificate(true);
 | 
				
			||||||
 | 
							x509Factory.setEmitEntityCertificateChain(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							defaultManager.registerFactory(x509Factory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return namedManager;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private static List<Credential> resolveSigningCredentials(RelyingPartyRegistration relyingPartyRegistration) {
 | 
						private static List<Credential> resolveSigningCredentials(RelyingPartyRegistration relyingPartyRegistration) {
 | 
				
			||||||
		List<Credential> credentials = new ArrayList<>();
 | 
							List<Credential> credentials = new ArrayList<>();
 | 
				
			||||||
		for (Saml2X509Credential x509Credential : relyingPartyRegistration.getSigningX509Credentials()) {
 | 
							for (Saml2X509Credential x509Credential : relyingPartyRegistration.getSigningX509Credentials()) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,89 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2002-2021 the original author or authors.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *      https://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package org.springframework.security.saml2.provider.service.web.authentication;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.xml.namespace.QName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.junit.jupiter.api.BeforeEach;
 | 
				
			||||||
 | 
					import org.junit.jupiter.api.Test;
 | 
				
			||||||
 | 
					import org.opensaml.core.xml.XMLObject;
 | 
				
			||||||
 | 
					import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 | 
				
			||||||
 | 
					import org.opensaml.saml.common.SAMLVersion;
 | 
				
			||||||
 | 
					import org.opensaml.saml.saml2.core.Issuer;
 | 
				
			||||||
 | 
					import org.opensaml.saml.saml2.core.Response;
 | 
				
			||||||
 | 
					import org.opensaml.xmlsec.signature.Signature;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.security.saml2.core.OpenSamlInitializationService;
 | 
				
			||||||
 | 
					import org.springframework.security.saml2.core.TestSaml2X509Credentials;
 | 
				
			||||||
 | 
					import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.assertj.core.api.Assertions.assertThat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Test open SAML signatures
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class OpenSamlSigningUtilsTests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						static {
 | 
				
			||||||
 | 
							OpenSamlInitializationService.initialize();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private RelyingPartyRegistration registration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@BeforeEach
 | 
				
			||||||
 | 
						public void setup() {
 | 
				
			||||||
 | 
							this.registration = RelyingPartyRegistration.withRegistrationId("saml-idp")
 | 
				
			||||||
 | 
									.entityId("https://some.idp.example.com/entity-id").signingX509Credentials((c) -> {
 | 
				
			||||||
 | 
										c.add(TestSaml2X509Credentials.relyingPartySigningCredential());
 | 
				
			||||||
 | 
										c.add(TestSaml2X509Credentials.assertingPartySigningCredential());
 | 
				
			||||||
 | 
									}).assertingPartyDetails((c) -> c.entityId("https://some.idp.example.com/entity-id")
 | 
				
			||||||
 | 
											.singleSignOnServiceLocation("https://some.idp.example.com/service-location"))
 | 
				
			||||||
 | 
									.build();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Test
 | 
				
			||||||
 | 
						public void whenSigningAnObjectThenKeyInfoIsPartOfTheSignature() {
 | 
				
			||||||
 | 
							Response response = response("destination", "issuer");
 | 
				
			||||||
 | 
							OpenSamlSigningUtils.sign(response, this.registration);
 | 
				
			||||||
 | 
							Signature signature = response.getSignature();
 | 
				
			||||||
 | 
							assertThat(signature).isNotNull();
 | 
				
			||||||
 | 
							assertThat(signature.getKeyInfo()).isNotNull();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Response response(String destination, String issuerEntityId) {
 | 
				
			||||||
 | 
							Response response = build(Response.DEFAULT_ELEMENT_NAME);
 | 
				
			||||||
 | 
							response.setID("R" + UUID.randomUUID());
 | 
				
			||||||
 | 
							response.setVersion(SAMLVersion.VERSION_20);
 | 
				
			||||||
 | 
							response.setID("_" + UUID.randomUUID());
 | 
				
			||||||
 | 
							response.setDestination(destination);
 | 
				
			||||||
 | 
							response.setIssuer(issuer(issuerEntityId));
 | 
				
			||||||
 | 
							return response;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Issuer issuer(String entityId) {
 | 
				
			||||||
 | 
							Issuer issuer = build(Issuer.DEFAULT_ELEMENT_NAME);
 | 
				
			||||||
 | 
							issuer.setValue(entityId);
 | 
				
			||||||
 | 
							return issuer;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<T extends XMLObject> T build(QName qName) {
 | 
				
			||||||
 | 
							return (T) XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(qName).buildObject(qName);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue