Skip to content

Commit 9d1a098

Browse files
committed
Adding API for generating SAML SP metadata
Resolves elastic#49018
1 parent b076e6c commit 9d1a098

File tree

4 files changed

+18
-33
lines changed

4 files changed

+18
-33
lines changed

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/saml/TransportSamlSpMetadataAction.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.elasticsearch.xpack.security.authc.saml.SamlRealm;
2121
import org.elasticsearch.xpack.security.authc.saml.SamlSpMetadataBuilder;
2222
import org.elasticsearch.xpack.security.authc.saml.SamlUtils;
23+
import org.elasticsearch.xpack.security.authc.saml.SpConfiguration;
24+
import org.opensaml.saml.saml2.core.AuthnRequest;
2325
import org.opensaml.saml.saml2.metadata.EntityDescriptor;
2426
import org.opensaml.saml.saml2.metadata.impl.EntityDescriptorMarshaller;
2527
import org.w3c.dom.Element;
@@ -29,6 +31,7 @@
2931
import javax.xml.transform.stream.StreamResult;
3032
import java.io.StringWriter;
3133
import java.util.List;
34+
import java.util.Locale;
3235

3336
import static org.elasticsearch.xpack.security.authc.saml.SamlRealm.findSamlRealms;
3437

@@ -63,7 +66,13 @@ protected void doExecute(Task task, SamlSpMetadataRequest request,
6366
private void prepareMetadata(SamlRealm realm, ActionListener<SamlSpMetadataResponse> listener) {
6467
try {
6568
final EntityDescriptorMarshaller marshaller = new EntityDescriptorMarshaller();
66-
final SamlSpMetadataBuilder builder = new SamlSpMetadataBuilder(realm);
69+
final SpConfiguration spConfig = realm.getServiceProvider();
70+
final SamlSpMetadataBuilder builder = new SamlSpMetadataBuilder(Locale.getDefault(), spConfig.getEntityId())
71+
.assertionConsumerServiceUrl(spConfig.getAscUrl())
72+
.singleLogoutServiceUrl(spConfig.getLogoutUrl())
73+
.encryptionCredentials(spConfig.getEncryptionCredentials())
74+
.signingCredential(spConfig.getSigningConfiguration().getCredential())
75+
.authnRequestsSigned(spConfig.getSigningConfiguration().shouldSign(AuthnRequest.DEFAULT_ELEMENT_LOCAL_NAME));
6776
final EntityDescriptor descriptor = builder.build();
6877
final Element element = marshaller.marshall(descriptor);
6978
final StringWriter writer = new StringWriter();

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/saml/SamlSpMetadataBuilder.java

-24
Original file line numberDiff line numberDiff line change
@@ -96,30 +96,6 @@ public SamlSpMetadataBuilder(Locale locale, String entityId) {
9696
this.authnRequestsSigned = Boolean.FALSE;
9797
}
9898

99-
/**
100-
* @param samlRealm SamlRealm for which SP Metadata is built
101-
*/
102-
public SamlSpMetadataBuilder(SamlRealm samlRealm) {
103-
final SpConfiguration spConfig = samlRealm.getServiceProvider();
104-
this.locale = Locale.getDefault();
105-
this.entityId = spConfig.getEntityId();
106-
this.attributeNames = null;
107-
this.contacts = null;
108-
this.serviceName = "Elasticsearch";
109-
this.nameIdFormat = null;
110-
this.authnRequestsSigned = Boolean.FALSE;
111-
this.assertionConsumerServiceUrl = spConfig.getAscUrl();
112-
this.singleLogoutServiceUrl = spConfig.getLogoutUrl();
113-
if (spConfig.getEncryptionCredentials() != null) {
114-
this.encryptionCertificates.addAll(spConfig.getEncryptionCredentials()
115-
.stream().map(credential -> credential.getEntityCertificate()).collect(Collectors.toList()));
116-
}
117-
if(spConfig.getSigningConfiguration() != null && spConfig.getSigningConfiguration().getCredential() != null) {
118-
this.signingCertificate = spConfig.getSigningConfiguration().getCredential().getEntityCertificate();
119-
}
120-
this.authnRequestsSigned = spConfig.getSigningConfiguration().shouldSign(AuthnRequest.DEFAULT_ELEMENT_LOCAL_NAME);
121-
}
122-
12399
/**
124100
* The format that the service provider expects for incoming NameID element.
125101
*/

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/saml/SigningConfiguration.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
/**
1717
* Encapsulates the rules and credentials for how and when Elasticsearch should sign outgoing SAML messages.
1818
*/
19-
class SigningConfiguration {
19+
public class SigningConfiguration {
2020

2121
private final Set<String> messageTypes;
2222
private final X509Credential credential;
@@ -30,7 +30,7 @@ boolean shouldSign(SAMLObject object) {
3030
return shouldSign(object.getElementQName().getLocalPart());
3131
}
3232

33-
boolean shouldSign(String elementName) {
33+
public boolean shouldSign(String elementName) {
3434
if (credential == null) {
3535
return false;
3636
}
@@ -45,7 +45,7 @@ byte[] sign(byte[] content, String algo) throws SecurityException {
4545
return XMLSigningUtil.signWithURI(this.credential, algo, content);
4646
}
4747

48-
X509Credential getCredential() {
48+
public X509Credential getCredential() {
4949
return credential;
5050
}
5151
}

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/saml/SpConfiguration.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,23 @@ public SpConfiguration(final String entityId, final String ascUrl, final String
4141
/**
4242
* The SAML identifier (as a URI) for the Sp
4343
*/
44-
String getEntityId() {
44+
public String getEntityId() {
4545
return entityId;
4646
}
4747

48-
String getAscUrl() {
48+
public String getAscUrl() {
4949
return ascUrl;
5050
}
5151

52-
String getLogoutUrl() {
52+
public String getLogoutUrl() {
5353
return logoutUrl;
5454
}
5555

56-
List<X509Credential> getEncryptionCredentials() {
56+
public List<X509Credential> getEncryptionCredentials() {
5757
return encryptionCredentials;
5858
}
5959

60-
SigningConfiguration getSigningConfiguration() {
60+
public SigningConfiguration getSigningConfiguration() {
6161
return signingConfiguration;
6262
}
6363

0 commit comments

Comments
 (0)