Skip to content

Commit 18667fc

Browse files
new: satosa-saml-metadata: make signing optional
Allow skipping signing with --no-sign - and in that case, do not require key+cert. Default to signing enabled (keep existing behaviour). Mark key and cert args as optional in Click and instead check them explicitly when signing is enabled. Add new method create_entity_descriptor_metadata as counterpart to create_signed_entity_descriptor to also apply `valid` option to EntityDescriptor but avoid signing.
1 parent 00c0d05 commit 18667fc

File tree

2 files changed

+46
-14
lines changed

2 files changed

+46
-14
lines changed

src/satosa/metadata_creation/saml_metadata.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,18 @@ def create_signed_entity_descriptor(entity_descriptor, security_context, valid_f
154154
raise ValueError("Could not construct valid EntityDescriptor tag")
155155

156156
return xmldoc
157+
158+
159+
def create_entity_descriptor_metadata(entity_descriptor, valid_for=None):
160+
"""
161+
:param entity_descriptor: the entity descriptor to create metadata for
162+
:param valid_for: number of hours the metadata should be valid
163+
:return: the EntityDescriptor metadata
164+
165+
:type entity_descriptor: saml2.md.EntityDescriptor]
166+
:type valid_for: Optional[int]
167+
"""
168+
if valid_for:
169+
entity_descriptor.valid_until = in_a_while(hours=valid_for)
170+
171+
return str(entity_descriptor)

src/satosa/scripts/satosa_saml_metadata.py

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from saml2.sigver import security_context
66

77
from ..metadata_creation.saml_metadata import create_entity_descriptors
8+
from ..metadata_creation.saml_metadata import create_entity_descriptor_metadata
89
from ..metadata_creation.saml_metadata import create_signed_entity_descriptor
910
from ..satosa_config import SATOSAConfig
1011

@@ -16,44 +17,58 @@ def _get_security_context(key, cert):
1617
return security_context(conf)
1718

1819

19-
def _create_split_entity_descriptors(entities, secc, valid):
20+
def _create_split_entity_descriptors(entities, secc, valid, sign=True):
2021
output = []
2122
for module_name, eds in entities.items():
2223
for i, ed in enumerate(eds):
23-
output.append((create_signed_entity_descriptor(ed, secc, valid), "{}_{}.xml".format(module_name, i)))
24+
ed_str = (
25+
create_signed_entity_descriptor(ed, secc, valid)
26+
if sign
27+
else create_entity_descriptor_metadata(ed, valid)
28+
)
29+
output.append((ed_str, "{}_{}.xml".format(module_name, i)))
2430

2531
return output
2632

2733

28-
def _create_merged_entities_descriptors(entities, secc, valid, name):
34+
def _create_merged_entities_descriptors(entities, secc, valid, name, sign=True):
2935
output = []
3036
frontend_entity_descriptors = [e for sublist in entities.values() for e in sublist]
3137
for frontend in frontend_entity_descriptors:
32-
output.append((create_signed_entity_descriptor(frontend, secc, valid), name))
38+
ed_str = (
39+
create_signed_entity_descriptor(frontend, secc, valid)
40+
if sign
41+
else create_entity_descriptor_metadata(frontend, valid)
42+
)
43+
output.append((ed_str, name))
3344

3445
return output
3546

3647

3748
def create_and_write_saml_metadata(proxy_conf, key, cert, dir, valid, split_frontend_metadata=False,
38-
split_backend_metadata=False):
49+
split_backend_metadata=False, sign=True):
3950
"""
4051
Generates SAML metadata for the given PROXY_CONF, signed with the given KEY and associated CERT.
4152
"""
4253
satosa_config = SATOSAConfig(proxy_conf)
43-
secc = _get_security_context(key, cert)
54+
55+
if sign and (not key or not cert):
56+
raise ValueError("Key and cert are required when signing")
57+
secc = _get_security_context(key, cert) if sign else None
58+
4459
frontend_entities, backend_entities = create_entity_descriptors(satosa_config)
4560

4661
output = []
4762
if frontend_entities:
4863
if split_frontend_metadata:
49-
output.extend(_create_split_entity_descriptors(frontend_entities, secc, valid))
64+
output.extend(_create_split_entity_descriptors(frontend_entities, secc, valid, sign))
5065
else:
51-
output.extend(_create_merged_entities_descriptors(frontend_entities, secc, valid, "frontend.xml"))
66+
output.extend(_create_merged_entities_descriptors(frontend_entities, secc, valid, "frontend.xml", sign))
5267
if backend_entities:
5368
if split_backend_metadata:
54-
output.extend(_create_split_entity_descriptors(backend_entities, secc, valid))
69+
output.extend(_create_split_entity_descriptors(backend_entities, secc, valid, sign))
5570
else:
56-
output.extend(_create_merged_entities_descriptors(backend_entities, secc, valid, "backend.xml"))
71+
output.extend(_create_merged_entities_descriptors(backend_entities, secc, valid, "backend.xml", sign))
5772

5873
for metadata, filename in output:
5974
path = os.path.join(dir, filename)
@@ -64,8 +79,8 @@ def create_and_write_saml_metadata(proxy_conf, key, cert, dir, valid, split_fron
6479

6580
@click.command()
6681
@click.argument("proxy_conf")
67-
@click.argument("key")
68-
@click.argument("cert")
82+
@click.argument("key", required=False)
83+
@click.argument("cert", required=False)
6984
@click.option("--dir",
7085
type=click.Path(exists=True, file_okay=False, dir_okay=True, writable=True, readable=False,
7186
resolve_path=False),
@@ -75,5 +90,7 @@ def create_and_write_saml_metadata(proxy_conf, key, cert, dir, valid, split_fron
7590
help="Create one entity descriptor per file for the frontend metadata")
7691
@click.option("--split-backend", is_flag=True, type=click.BOOL, default=False,
7792
help="Create one entity descriptor per file for the backend metadata")
78-
def construct_saml_metadata(proxy_conf, key, cert, dir, valid, split_frontend, split_backend):
79-
create_and_write_saml_metadata(proxy_conf, key, cert, dir, valid, split_frontend, split_backend)
93+
@click.option("--sign/--no-sign", is_flag=True, type=click.BOOL, default=True,
94+
help="Sign the generated metadata")
95+
def construct_saml_metadata(proxy_conf, key, cert, dir, valid, split_frontend, split_backend, sign):
96+
create_and_write_saml_metadata(proxy_conf, key, cert, dir, valid, split_frontend, split_backend, sign)

0 commit comments

Comments
 (0)