diff --git a/README.md b/README.md index f476332..a410a0e 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,32 @@ You only need to installl pyOpenSSL: ## Usage -`python ssl_checker.py host1[:port] [host2:port] [host3:port]...` +```bash +./ssl_checker.py -h +usage: ssl_checker.py -H [HOSTS [HOSTS ...]] [-j] [-h] + +optional arguments: + -H [HOSTS [HOSTS ...]], --host [HOSTS [HOSTS ...]] + Hosts as input separated by space + -j, --json Enable JSON in the output + -h, --help Show this help message and exit +``` + + Port is optional here. The script will use 443 if not specified. +`-j, --json` Use this if you want to only have the result in JSON + +`-H, --host` Enter the hosts separated by space + +`-h, --help` Shows the help and exit + + ## Example ```bash -narbeh@narbeh-xps:~/ssl-checker$ python ssl_checker.py test.com narbeh.org:443 archive.org facebook.com:443 twitter.com github.com google.com +narbeh@narbeh-xps:~/ssl-checker$ ./ssl_checker.py -H test.com narbeh.org:443 archive.org facebook.com:443 twitter.com github.com google.com Analyzing 7 hosts: [+] test.com Expired: False @@ -32,4 +50,12 @@ Analyzing 7 hosts: [+] google.com Expired: False 5 successful and 2 failed +``` + + +Example only with the `-j` argument which show the JSON only. Perfect for piping to another tool. + +```bash +narbeh@narbeh-xps:~/ssl-checker$ ./ssl_checker.py -j -H test.com narbeh.org:443 +{'test.com': {'valid_till': '2020-01-24', 'valid_from': '2017-01-15', 'cert_alg': u'sha256WithRSAEncryption', 'cert_ver': 2, 'cert_sn': 73932709062103623902948514363737041075L, 'cert_exp': False, 'issuer_c': u'US', 'issuer_cn': u'Network Solutions DV Server CA 2', 'issuer_o': u'Network Solutions L.L.C.', 'validity_days': 1104, 'issuer_ou': None}, 'narbeh.org': {'valid_till': '2018-05-18', 'valid_from': '2018-02-17', 'cert_alg': u'sha256WithRSAEncryption', 'cert_ver': 2, 'cert_sn': 319510066429286596971677345373584681421772L, 'cert_exp': False, 'issuer_c': u'US', 'issuer_cn': u"Let's Encrypt Authority X3", 'issuer_o': u"Let's Encrypt", 'validity_days': 90, 'issuer_ou': None}} ``` \ No newline at end of file diff --git a/ssl_checker.py b/ssl_checker.py old mode 100644 new mode 100755 index 9f588b7..450834d --- a/ssl_checker.py +++ b/ssl_checker.py @@ -2,7 +2,7 @@ import socket import sys -from pprint import pprint +from argparse import ArgumentParser, SUPPRESS from datetime import datetime from ssl import PROTOCOL_TLSv1 @@ -66,11 +66,15 @@ def get_cert_info(cert): return context -def show_result(hosts): +def show_result(user_args): """Get the context.""" context = {} failed_cnt = 0 - print('Analyzing {} hosts:\n'.format(len(hosts))) + hosts = user_args.hosts + + if not user_args.json_true: + print('Analyzing {} hosts:\n'.format(len(hosts))) + for host in hosts: host, port = filter_hostname(host) @@ -81,14 +85,20 @@ def show_result(hosts): try: cert = get_cert(host, port) context[host] = get_cert_info(cert) - print('\t{}[+]{} {:<20s} Expired: {}'.format(Clr.GREEN, Clr.RST, host, context[host]['cert_exp'])) + if not user_args.json_true: + print('\t{}[+]{} {:<20s} Expired: {}'.format(Clr.GREEN, Clr.RST, host, context[host]['cert_exp'])) except Exception as error: - print('\t{}[-]{} {:<20s} Failed: {}'.format(Clr.RED, Clr.RST, host, error)) + if not user_args.json_true: + print('\t{}[-]{} {:<20s} Failed: {}'.format(Clr.RED, Clr.RST, host, error)) + failed_cnt += 1 - print('\n{} successful and {} failed\n'.format(len(hosts) - failed_cnt, failed_cnt)) + if not user_args.json_true: + print('\n{} successful and {} failed\n'.format(len(hosts) - failed_cnt, failed_cnt)) - pprint(context) + # Enable JSON output if -j argument specified + if user_args.json_true: + print(context) def filter_hostname(host): @@ -101,9 +111,28 @@ def filter_hostname(host): return host, port -if __name__ == '__main__': - if len(sys.argv) < 2: - print('Usage: python {} host1 [host2] [host3] ...'.format(sys.argv[0])) - sys.exit(0) +def get_args(): + """Set argparse options.""" + parser = ArgumentParser(prog='ssl_checker.py', add_help=False) + parser.add_argument("-H", "--host", dest="hosts", nargs='*', required=True, + help="Hosts as input separated by space") + parser.add_argument("-j", "--json", dest="json_true", + action="store_true", default=False, + help="Enable JSON in the output") + parser.add_argument("-h", "--help", default=SUPPRESS, + action='help', + help='Show this help message and exit') - show_result(sys.argv[1:]) + args = parser.parse_args() + + # Checks hosts list + if isinstance(args.hosts, list): + if len(args.hosts) == 0: + parser.print_help() + sys.exit(0) + + return args + + +if __name__ == '__main__': + show_result(get_args())