from flask import Flask, request, render_template_string, redirect, url_for from cryptography import x509 from cryptography.hazmat.backends import default_backend app = Flask(__name__) # Simple HTML Form HTML_TEMPLATE = """ SSL Certificate Decoder - View CN, SAN, Issuer & More

Decode SSL Certificate



{% if cert_info %}

Certificate Information:

{{ cert_info }}
{% endif %} """ def parse_certificate(pem_data): try: cert = x509.load_pem_x509_certificate(pem_data.encode(), default_backend()) except Exception as e: return f"Invalid certificate: {e}" issuer = cert.issuer.get_attributes_for_oid(x509.OID_COMMON_NAME) subject = cert.subject.get_attributes_for_oid(x509.OID_COMMON_NAME) not_before = cert.not_valid_before not_after = cert.not_valid_after serial_number = cert.serial_number sig_algo = cert.signature_hash_algorithm.name # Get SANs try: ext = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName) sans = ext.value.get_values_for_type(x509.DNSName) except x509.ExtensionNotFound: sans = [] output = f""" Subject CN: {subject[0].value if subject else 'N/A'} Issuer CN: {issuer[0].value if issuer else 'N/A'} Valid From: {not_before} Valid Until: {not_after} Serial Number: {serial_number} Signature Alg: {sig_algo} SANs: {', '.join(sans) if sans else 'None'} """ return output.strip() @app.route("/", methods=["GET", "POST"]) def index(): if request.method == "POST": pem_cert = request.form.get("certificate", "").strip() cert_info = parse_certificate(pem_cert) # Store result temporarily in session or pass via GET param return redirect(url_for('index', cert_info=cert_info)) # GET Request — show result if available cert_info = request.args.get('cert_info') return render_template_string(HTML_TEMPLATE, cert_info=cert_info) if __name__ == "__main__": app.run(debug=True, port=5000)