#!/bin/bash

# SSL info

show_help() {
cat << EOF
Usage: $0 [info|infoall|subject|modulus|check] openssl_crt_key_files
Examples:
	compare 2 modulus files:
		$0 check file1 file2
	show modulus:
		$0 modulus file
	show online info from https web:
		$0 web URL
	show info (with pager):
		$0 file
EOF
exit 0
}

ssl_read() {
  if grep -q '^-----BEGIN\( .* \| \)PRIVATE KEY-----' "$1"; then
    openssl rsa -noout -in "$@"
  else
    openssl x509 -noout -in "$@"
  fi
}

ssl_read_all() {
  txt=""
  while read line; do
    if [ "${line//-----END}" != "$line" ]; then
        txt="$txt$line\n"
        printf -- "$txt" | openssl x509 -noout -text
        txt=""
    else
        txt="$txt$line\n"
    fi
  done < "$1"
}

ssl_read_web() {
  openssl s_client -showcerts -servername "$1" -connect "$1:443" \
    </dev/null 2>/dev/null \
    | ssl_read_all /dev/stdin
}

check_modulus() {
  m1="`ssl_read \"$1\" -modulus | cut -d= -f1`"
  m2="`ssl_read \"$2\" -modulus | cut -d= -f1`"
  if [ "$m1" = "$m2" ]; then
    echo "MATCH OK"
    exit 0
  else
    echo "$m1"
    echo "$m2"
    echo "NO MATCH"
    exit 1
  fi
}

case "$1" in
  i|info)
	shift
	for i in "$@"; do
		echo "$i:"
		ssl_read "$i" -text
	done
	;;
  ia|infoall)
  	shift
  	for i in "$@"; do
  		echo "$i:"
  		ssl_read_all "$i"
  	done
  	;;
  web|info_web)
	shift
	for i in "$@"; do
		echo "$i:"
		ssl_read_web "$i"
	done
	;;
  m|mod*)
	shift
	for i in "$@"; do
		echo "$i:"
		ssl_read "$i" -modulus
	done
	;;
  check)
	check_modulus "$2" "$3"
	;;
  s|sub*)
	shift
	for i in "$@"; do
		echo "$i:"
		ssl_read "$i" -subject | sed 's/^subject *= *//i'
	done
	;;
  *)
  	if [ -z "$1" ]; then
		show_help
  	elif [ -z "$2" ]; then
  		ssl_read "$1" -text | less -FX
  	fi
  	;;
esac
