Skip to content

Commit 5003a5f

Browse files
author
Roland Hedberg
committed
Merge pull request #228 from HaToHo/master
New metadata configuration for encryption. With the keys in the test folder and full path.
2 parents 9c2b951 + f90d663 commit 5003a5f

File tree

16 files changed

+288
-133
lines changed

16 files changed

+288
-133
lines changed

example/sp-wsgi/sp.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import logging
44
import re
55
import argparse
6+
import os
67
from saml2.extension.pefim import SPCertEnc
8+
from saml2.metadata import create_metadata_string
79
import service_conf
810

911
from Cookie import SimpleCookie
@@ -753,6 +755,21 @@ def add_urls():
753755

754756
# ----------------------------------------------------------------------------
755757

758+
def metadata(environ, start_response):
759+
try:
760+
path = _args.path
761+
if path is None or len(path) == 0:
762+
path = os.path.dirname(os.path.abspath( __file__ ))
763+
if path[-1] != "/":
764+
path += "/"
765+
metadata = create_metadata_string(path+"sp_conf.py", None,
766+
_args.valid, _args.cert, _args.keyfile,
767+
_args.id, _args.name, _args.sign)
768+
start_response('200 OK', [('Content-Type', "text/xml")])
769+
return metadata
770+
except Exception as ex:
771+
logger.error("An error occured while creating metadata:" + ex.message)
772+
return not_found(environ, start_response)
756773

757774
def application(environ, start_response):
758775
"""
@@ -769,6 +786,8 @@ def application(environ, start_response):
769786
path = environ.get('PATH_INFO', '').lstrip('/')
770787
logger.debug("<application> PATH: '%s'" % path)
771788

789+
if path == "metadata":
790+
return metadata(environ, start_response)
772791

773792
logger.debug("Finding callback to run")
774793
try:
@@ -822,6 +841,18 @@ def application(environ, start_response):
822841
_parser.add_argument('-W', dest='wayf', action='store_true',
823842
help="Which WAYF url to use")
824843
_parser.add_argument("config", help="SAML client config")
844+
_parser.add_argument('-p', dest='path', help='Path to configuration file.')
845+
_parser.add_argument('-v', dest='valid', default="4",
846+
help="How long, in days, the metadata is valid from the time of creation")
847+
_parser.add_argument('-c', dest='cert', help='certificate')
848+
_parser.add_argument('-i', dest='id',
849+
help="The ID of the entities descriptor in the metadata")
850+
_parser.add_argument('-k', dest='keyfile',
851+
help="A file with a key to sign the metadata with")
852+
_parser.add_argument('-n', dest='name')
853+
_parser.add_argument('-S', dest='sign', action='store_true',
854+
help="sign the metadata")
855+
825856

826857
ARGS = {}
827858
_args = _parser.parse_args()

example/sp-wsgi/sp.xml

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/saml2/config.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@
4949
}
5050

5151
COMMON_ARGS = [
52-
"entityid", "xmlsec_binary", "debug", "key_file", "cert_file",
53-
"encryption_type", "secret", "accepted_time_diff", "name", "ca_certs",
52+
"entityid", "xmlsec_binary", "debug", "key_file", "cert_file", "encryption_keypairs", "additional_cert_files",
53+
"metadata_key_usage", "secret", "accepted_time_diff", "name", "ca_certs",
5454
"description", "valid_for", "verify_ssl_cert",
5555
"organization",
5656
"contact_person",
@@ -190,7 +190,9 @@ def __init__(self, homedir="."):
190190
self.debug = False
191191
self.key_file = None
192192
self.cert_file = None
193-
self.encryption_type = 'both'
193+
self.encryption_keypairs = None
194+
self.additional_cert_files = None
195+
self.metadata_key_usage = 'both'
194196
self.secret = None
195197
self.accepted_time_diff = None
196198
self.name = None

src/saml2/metadata.py

Lines changed: 62 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -191,43 +191,45 @@ def do_contact_person_info(lava):
191191
return cps
192192

193193

194-
def do_key_descriptor(cert, use="both"):
195-
if use == "both":
196-
return [
197-
md.KeyDescriptor(
198-
key_info=ds.KeyInfo(
199-
x509_data=ds.X509Data(
200-
x509_certificate=ds.X509Certificate(text=cert)
201-
)
202-
),
203-
use="encryption"
204-
),
205-
md.KeyDescriptor(
206-
key_info=ds.KeyInfo(
207-
x509_data=ds.X509Data(
208-
x509_certificate=ds.X509Certificate(text=cert)
209-
)
210-
),
211-
use="signing"
194+
def do_key_descriptor(cert=None, enc_cert=None, use="both"):
195+
kd_list = []
196+
if use in ["signing", "both"] and cert is not None:
197+
if not isinstance(cert, list):
198+
cert = [cert]
199+
for _cert in cert:
200+
kd_list.append(
201+
md.KeyDescriptor(
202+
key_info=ds.KeyInfo(
203+
x509_data=ds.X509Data(
204+
x509_certificate=ds.X509Certificate(text=_cert)
205+
)
206+
),
207+
use="signing"
208+
)
212209
)
213-
]
214-
elif use in ["signing", "encryption"]:
215-
return md.KeyDescriptor(
216-
key_info=ds.KeyInfo(
217-
x509_data=ds.X509Data(
218-
x509_certificate=ds.X509Certificate(text=cert)
210+
if use in ["both", "encryption"] and enc_cert is not None:
211+
if not isinstance(enc_cert, list):
212+
enc_cert = [enc_cert]
213+
for _enc_cert in enc_cert:
214+
kd_list.append(
215+
md.KeyDescriptor(
216+
key_info=ds.KeyInfo(
217+
x509_data=ds.X509Data(
218+
x509_certificate=ds.X509Certificate(text=_enc_cert)
219+
)
220+
),
221+
use="encryption"
219222
)
220-
),
221-
use=use
222-
)
223-
else:
223+
)
224+
if len(kd_list) == 0 and cert is not None:
224225
return md.KeyDescriptor(
225226
key_info=ds.KeyInfo(
226227
x509_data=ds.X509Data(
227228
x509_certificate=ds.X509Certificate(text=cert)
228229
)
229230
)
230231
)
232+
return kd_list
231233

232234

233235
def do_requested_attribute(attributes, acs, is_required="false"):
@@ -502,7 +504,7 @@ def do_attribute_consuming_service(conf, spsso):
502504
spsso.attribute_consuming_service = [ac_serv]
503505

504506

505-
def do_spsso_descriptor(conf, cert=None):
507+
def do_spsso_descriptor(conf, cert=None, enc_cert=None):
506508
spsso = md.SPSSODescriptor()
507509
spsso.protocol_support_enumeration = samlp.NAMESPACE
508510

@@ -537,9 +539,9 @@ def do_spsso_descriptor(conf, cert=None):
537539
spsso.extensions = md.Extensions()
538540
spsso.extensions.add_extension_element(do_uiinfo(ui_info))
539541

540-
if cert:
541-
encryption_type = conf.encryption_type
542-
spsso.key_descriptor = do_key_descriptor(cert, encryption_type)
542+
if cert or enc_cert:
543+
metadata_key_usage = conf.metadata_key_usage
544+
spsso.key_descriptor = do_key_descriptor(cert=cert, enc_cert=enc_cert, use=metadata_key_usage)
543545

544546
for key in ["want_assertions_signed", "authn_requests_signed"]:
545547
try:
@@ -557,7 +559,7 @@ def do_spsso_descriptor(conf, cert=None):
557559
return spsso
558560

559561

560-
def do_idpsso_descriptor(conf, cert=None):
562+
def do_idpsso_descriptor(conf, cert=None, enc_cert=None):
561563
idpsso = md.IDPSSODescriptor()
562564
idpsso.protocol_support_enumeration = samlp.NAMESPACE
563565

@@ -586,8 +588,8 @@ def do_idpsso_descriptor(conf, cert=None):
586588
idpsso.extensions = md.Extensions()
587589
idpsso.extensions.add_extension_element(do_uiinfo(ui_info))
588590

589-
if cert:
590-
idpsso.key_descriptor = do_key_descriptor(cert)
591+
if cert or enc_cert:
592+
idpsso.key_descriptor = do_key_descriptor(cert, enc_cert, use=conf.metadata_key_usage)
591593

592594
for key in ["want_authn_requests_signed"]:
593595
#"want_authn_requests_only_with_valid_cert"]:
@@ -603,7 +605,7 @@ def do_idpsso_descriptor(conf, cert=None):
603605
return idpsso
604606

605607

606-
def do_aa_descriptor(conf, cert):
608+
def do_aa_descriptor(conf, cert=None, enc_cert=None):
607609
aad = md.AttributeAuthorityDescriptor()
608610
aad.protocol_support_enumeration = samlp.NAMESPACE
609611

@@ -616,8 +618,8 @@ def do_aa_descriptor(conf, cert):
616618

617619
_do_nameid_format(aad, conf, "aa")
618620

619-
if cert:
620-
aad.key_descriptor = do_key_descriptor(cert)
621+
if cert or enc_cert:
622+
aad.key_descriptor = do_key_descriptor(cert, enc_cert, use=conf.metadata_key_usage)
621623

622624
attributes = conf.getattr("attribute", "aa")
623625
if attributes:
@@ -632,7 +634,7 @@ def do_aa_descriptor(conf, cert):
632634
return aad
633635

634636

635-
def do_aq_descriptor(conf, cert):
637+
def do_aq_descriptor(conf, cert=None, enc_cert=None):
636638
aqs = md.AuthnAuthorityDescriptor()
637639
aqs.protocol_support_enumeration = samlp.NAMESPACE
638640

@@ -645,13 +647,13 @@ def do_aq_descriptor(conf, cert):
645647

646648
_do_nameid_format(aqs, conf, "aq")
647649

648-
if cert:
649-
aqs.key_descriptor = do_key_descriptor(cert)
650+
if cert or enc_cert:
651+
aqs.key_descriptor = do_key_descriptor(cert, enc_cert, use=conf.metadata_key_usage)
650652

651653
return aqs
652654

653655

654-
def do_pdp_descriptor(conf, cert):
656+
def do_pdp_descriptor(conf, cert=None, enc_cert=None):
655657
""" Create a Policy Decision Point descriptor """
656658
pdp = md.PDPDescriptor()
657659

@@ -667,13 +669,24 @@ def do_pdp_descriptor(conf, cert):
667669
_do_nameid_format(pdp, conf, "pdp")
668670

669671
if cert:
670-
pdp.key_descriptor = do_key_descriptor(cert)
672+
pdp.key_descriptor = do_key_descriptor(cert, enc_cert, use=conf.metadata_key_usage)
671673

672674
return pdp
673675

674676

675677
def entity_descriptor(confd):
676-
mycert = "".join(open(confd.cert_file).readlines()[1:-1])
678+
mycert = None
679+
enc_cert = None
680+
if confd.cert_file is not None:
681+
mycert = []
682+
mycert.append("".join(open(confd.cert_file).readlines()[1:-1]))
683+
if confd.additional_cert_files is not None:
684+
for _cert_file in confd.additional_cert_files:
685+
mycert.append("".join(open(_cert_file).readlines()[1:-1]))
686+
if confd.encryption_keypairs is not None:
687+
enc_cert = []
688+
for _encryption in confd.encryption_keypairs:
689+
enc_cert.append("".join(open(_encryption["cert_file"]).readlines()[1:-1]))
677690

678691
entd = md.EntityDescriptor()
679692
entd.entity_id = confd.entityid
@@ -701,19 +714,19 @@ def entity_descriptor(confd):
701714

702715
if "sp" in serves:
703716
confd.context = "sp"
704-
entd.spsso_descriptor = do_spsso_descriptor(confd, mycert)
717+
entd.spsso_descriptor = do_spsso_descriptor(confd, mycert, enc_cert)
705718
if "idp" in serves:
706719
confd.context = "idp"
707-
entd.idpsso_descriptor = do_idpsso_descriptor(confd, mycert)
720+
entd.idpsso_descriptor = do_idpsso_descriptor(confd, mycert, enc_cert)
708721
if "aa" in serves:
709722
confd.context = "aa"
710-
entd.attribute_authority_descriptor = do_aa_descriptor(confd, mycert)
723+
entd.attribute_authority_descriptor = do_aa_descriptor(confd, mycert, enc_cert)
711724
if "pdp" in serves:
712725
confd.context = "pdp"
713-
entd.pdp_descriptor = do_pdp_descriptor(confd, mycert)
726+
entd.pdp_descriptor = do_pdp_descriptor(confd, mycert, enc_cert)
714727
if "aq" in serves:
715728
confd.context = "aq"
716-
entd.authn_authority_descriptor = do_aq_descriptor(confd, mycert)
729+
entd.authn_authority_descriptor = do_aq_descriptor(confd, mycert, enc_cert)
717730

718731
return entd
719732

0 commit comments

Comments
 (0)