How can I decode a SSL certificate using python?

前端 未结 5 1894
半阙折子戏
半阙折子戏 2020-12-02 14:42

How can I decode a pem-encoded (base64) certificate with Python? For example this here from github.com:

-----BEGIN CERTIFICATE-----
MIIHKjCCBhKgAwIBAgIQDnd2i         


        
5条回答
  •  离开以前
    2020-12-02 15:09

    Notes:

    • Everything relies on (!!!undocumented!!!) ssl._ssl._test_decode_cert
      (present in Python 3(.7) / Python 2), no additional module(s) needed
    • Please, take a look at [SO]: Can't receive peer certificate in Python client using OpenSSL's ssl.SSLContext() (@CristiFati's answer), which addresses a wider problem

    Regarding the certificate (PEM) from the question:

    • Saved it in a file called q016899247.crt (in the script (code00.py) dir)
    • The end tag: ("-----END CERTIFICATE----") was missing a hyphen (-) at the end; corrected in Question @VERSION #4.)

    code00.py:

    #!/usr/bin/env python3
    
    import sys
    import os
    import ssl
    import pprint
    
    
    def main():
        cert_file_base_name = "q016899247.crt"
        cert_file_name = os.path.join(os.path.dirname(__file__), cert_file_base_name)
        try:
            cert_dict = ssl._ssl._test_decode_cert(cert_file_name)
        except Exception as e:
            print("Error decoding certificate: {0:}".format(e))
        else:
            print("Certificate ({0:s}) data:\n".format(cert_file_base_name))
            pprint.pprint(cert_dict)
    
    
    if __name__ == "__main__":
        print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
        main()
        print("\nDone.")
    

    Output:

    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q016899247]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code00.py
    Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32
    
    Certificate (q016899247.crt) data:
    
    {'OCSP': ('http://ocsp.digicert.com',),
     'caIssuers': ('http://www.digicert.com/CACerts/DigiCertHighAssuranceEVCA-1.crt',),
     'crlDistributionPoints': ('http://crl3.digicert.com/ev2009a.crl',
                               'http://crl4.digicert.com/ev2009a.crl'),
     'issuer': ((('countryName', 'US'),),
                (('organizationName', 'DigiCert Inc'),),
                (('organizationalUnitName', 'www.digicert.com'),),
                (('commonName', 'DigiCert High Assurance EV CA-1'),)),
     'notAfter': 'Jul 29 12:00:00 2013 GMT',
     'notBefore': 'May 27 00:00:00 2011 GMT',
     'serialNumber': '0E77768A5D07F0E57959CA2A9D5082B5',
     'subject': ((('businessCategory', 'Private Organization'),),
                 (('jurisdictionCountryName', 'US'),),
                 (('jurisdictionStateOrProvinceName', 'California'),),
                 (('serialNumber', 'C3268102'),),
                 (('countryName', 'US'),),
                 (('stateOrProvinceName', 'California'),),
                 (('localityName', 'San Francisco'),),
                 (('organizationName', 'GitHub, Inc.'),),
                 (('commonName', 'github.com'),)),
     'subjectAltName': (('DNS', 'github.com'), ('DNS', 'www.github.com')),
     'version': 3}
    
    Done.
    

提交回复
热议问题