#!/usr/bin/env python3 import sys, subprocess from xml.etree import ElementTree as ET fn = "saml-response.xml" ns = { 'p': 'urn:oasis:names:tc:SAML:2.0:protocol', 's': 'urn:oasis:names:tc:SAML:2.0:assertion', 'ds': 'http://www.w3.org/2000/09/xmldsig#' } try: root = ET.parse(fn).getroot() except Exception as e: print("ERROR: cannot parse saml-response.xml:", e) sys.exit(1) def find_text(path, default=""): el = root.find(path, ns) return el.text.strip() if el is not None and el.text else default # Status (StatusCode Value attribute) status_el = root.find('.//p:Status/p:StatusCode', ns) status = status_el.get('Value') if status_el is not None else "" print("Status: " + status) # NameID nameid = find_text('.//s:NameID') print("Name: " + nameid) # Audience aud = find_text('.//s:Audience') print("Audience: " + aud) # Recipient (SubjectConfirmationData @Recipient) rec_el = root.find('.//s:Subject/s:SubjectConfirmation/s:SubjectConfirmationData', ns) recipient = rec_el.get('Recipient') if rec_el is not None else "" print("Recipient: " + recipient) # Extract cert and write PEM with proper line breaks cert_el = root.find('.//ds:X509Certificate', ns) if cert_el is None or not cert_el.text or not cert_el.text.strip(): print("no-cert-found") sys.exit(0) b64 = "".join(cert_el.text.split()) pem = "-----BEGIN CERTIFICATE-----\n" # wrap at 64 chars per line for i in range(0, len(b64), 64): pem += b64[i:i+64] + "\n" pem += "-----END CERTIFICATE-----\n" with open("google_cert.pem", "w") as f: f.write(pem) # Try to print openssl fingerprint try: out = subprocess.check_output(['openssl','x509','-in','google_cert.pem','-noout','-fingerprint','-sha256'], stderr=subprocess.STDOUT) print(out.decode().strip()) except Exception as e: print("openssl-not-available-or-error") # Print all Attribute values for AWS Role and RoleSessionName role_attr = root.find('.//s:Attribute[@Name="https://aws.amazon.com/SAML/Attributes/Role"]', ns) if role_attr is not None: vals = [v.text.strip() for v in role_attr.findall('.//s:AttributeValue', ns) if v.text] for v in vals: print("ROLE_ATTRIBUTE_VALUE: " + v) else: print("ROLE_ATTRIBUTE_VALUE: not-present") role_session_attr = root.find('.//s:Attribute[@Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName"]', ns) if role_session_attr is not None: vals = [v.text.strip() for v in role_session_attr.findall('.//s:AttributeValue', ns) if v.text] for v in vals: print("ROLE_SESSION_NAME_VALUE: " + v) else: print("ROLE_SESSION_NAME_VALUE: not-present")