├── CertExpirationCheck.py └── README.md /CertExpirationCheck.py: -------------------------------------------------------------------------------- 1 | # Credit to phreakmonkey.com / phreakmonkey at gmail.com 2 | # For OS X, brew install swig, then easy_install M2Crypto 3 | # Modified the original code to only output expiration date 4 | 5 | import sys 6 | import socket 7 | import string 8 | from M2Crypto import SSL 9 | 10 | def reportIP(IPaddress): 11 | ctx = SSL.Context() 12 | ctx.set_allow_unknown_ca(True) 13 | ctx.set_verify(SSL.verify_none, 1) 14 | conn = SSL.Connection(ctx) 15 | conn.postConnectionCheck = None 16 | timeout = SSL.timeout(15) 17 | conn.set_socket_read_timeout(timeout) 18 | conn.set_socket_write_timeout(timeout) 19 | try: 20 | sys.stderr.flush() 21 | conn.connect((IPaddress, 443)) 22 | except: 23 | print IPaddress+"|{SSL_HANDSHAKE_FAILED}|"+"|"+"|"+"|" 24 | sys.stderr.write('failed.\n') 25 | sys.stderr.flush() 26 | return 27 | sys.stderr.flush() 28 | 29 | cert = conn.get_peer_cert() 30 | try: 31 | cissuer = cert.get_issuer().as_text() 32 | except: 33 | sys.stderr.write("Error: No Valid Cert Presented\n"); 34 | print IPaddress+"|{NO_CERT_PRESENTED}|"+"|"+"|"+"|" 35 | sys.stderr.flush 36 | conn.close 37 | return 38 | 39 | sys.stderr.flush() 40 | csubject = cert.get_subject().as_text() 41 | try: 42 | cAltName = cert.get_ext('subjectAltName').get_value() 43 | except LookupError: 44 | cAltName = "" 45 | try: 46 | cCN = cert.get_subject().CN 47 | except AttributeError: 48 | cCN = "" 49 | try: 50 | cExpiry = str(cert.get_not_after()) 51 | except AttributeError: 52 | cExpiry = "" 53 | conn.close 54 | print cExpiry 55 | 56 | reportIP(sys.argv[1]) 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | CertExpirationCheck 2 | =================== 3 | 4 | Checks to see when the cert for a given domain expires. 5 | 6 | Code based on Phreakmonkey's script at phreakmonkey.com. 7 | --------------------------------------------------------------------------------