diff --git a/lib/onelogin/ruby-saml/idp_metadata_parser.rb b/lib/onelogin/ruby-saml/idp_metadata_parser.rb index 7d0a343eb..5bdbbb247 100644 --- a/lib/onelogin/ruby-saml/idp_metadata_parser.rb +++ b/lib/onelogin/ruby-saml/idp_metadata_parser.rb @@ -146,6 +146,14 @@ def certificate_base64 "/md:EntityDescriptor/md:IDPSSODescriptor/md:KeyDescriptor[@use='signing']/ds:KeyInfo/ds:X509Data/ds:X509Certificate", { "md" => METADATA, "ds" => DSIG } ) + + unless node + node = REXML::XPath.first( + document, + "/md:EntityDescriptor/md:IDPSSODescriptor/md:KeyDescriptor/ds:KeyInfo/ds:X509Data/ds:X509Certificate", + { "md" => METADATA, "ds" => DSIG } + ) + end node.text if node end end diff --git a/test/idp_metadata_parser_test.rb b/test/idp_metadata_parser_test.rb index b60068b4c..ed1309deb 100644 --- a/test/idp_metadata_parser_test.rb +++ b/test/idp_metadata_parser_test.rb @@ -29,7 +29,33 @@ def initialize; end assert_equal "https://example.hello.com/access/saml/logout", settings.idp_slo_target_url assert_equal "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", settings.name_identifier_format assert_equal ["AuthToken", "SSOStartPage"], settings.idp_attribute_names + assert_equal "F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72", settings.idp_cert_fingerprint end + + it "extract certificate from md:KeyDescriptor[@use='signing']" do + idp_metadata_parser = OneLogin::RubySaml::IdpMetadataParser.new + idp_metadata = read_response("idp_descriptor.xml") + settings = idp_metadata_parser.parse(idp_metadata) + assert_equal "F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72", settings.idp_cert_fingerprint + end + + it "extract certificate from md:KeyDescriptor[@use='encryption']" do + idp_metadata_parser = OneLogin::RubySaml::IdpMetadataParser.new + idp_metadata = read_response("idp_descriptor.xml") + idp_metadata = idp_metadata.sub(/(.*?)<\/md:KeyDescriptor>/m, "") + settings = idp_metadata_parser.parse(idp_metadata) + assert_equal "F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72", settings.idp_cert_fingerprint + end + + it "extract certificate from md:KeyDescriptor" do + idp_metadata_parser = OneLogin::RubySaml::IdpMetadataParser.new + idp_metadata = read_response("idp_descriptor.xml") + idp_metadata = idp_metadata.sub(/(.*?)<\/md:KeyDescriptor>/m, "") + idp_metadata = idp_metadata.sub('', '') + settings = idp_metadata_parser.parse(idp_metadata) + assert_equal "F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72", settings.idp_cert_fingerprint + end + end describe "download and parse IdP descriptor file" do