Add script 'revoke_key.sh'.
This commit is contained in:
		
							
								
								
									
										341
									
								
								revoke_key.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										341
									
								
								revoke_key.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,341 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  |  | ||||||
|  | script_dir="$(dirname $(realpath $0))" | ||||||
|  |  | ||||||
|  | log_file="$(mktemp)" | ||||||
|  | _date="$(date +%Y-%m-%d-%H%M)" | ||||||
|  |  | ||||||
|  | key_names_reserverd="ta ca server" | ||||||
|  |  | ||||||
|  | #--------------------------------------- | ||||||
|  | #----------------------------- | ||||||
|  | # Some functions | ||||||
|  | #----------------------------- | ||||||
|  | #--------------------------------------- | ||||||
|  |  | ||||||
|  | clean_up() { | ||||||
|  |  | ||||||
|  |    # Perform program exit housekeeping | ||||||
|  |    rm $log_file | ||||||
|  |    exit $1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | is_number() { | ||||||
|  |  | ||||||
|  |    return $(test ! -z "${1##*[!0-9]*}" > /dev/null 2>&1); | ||||||
|  |  | ||||||
|  |    # - also possible | ||||||
|  |    # - | ||||||
|  |    #[[ ! -z "${1##*[!0-9]*}" ]] && return 0 || return 1 | ||||||
|  |    #return $([[ ! -z "${1##*[!0-9]*}" ]]) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | is_int() { | ||||||
|  |    return $(test "$@" -eq "$@" > /dev/null 2>&1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | echononl(){ | ||||||
|  |    echo X\\c > /tmp/shprompt$$ | ||||||
|  |    if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then | ||||||
|  |       echo -e -n "$*\\c" 1>&2 | ||||||
|  |    else | ||||||
|  |        echo -e -n "$*" 1>&2 | ||||||
|  |    fi | ||||||
|  |    rm /tmp/shprompt$$ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | error(){ | ||||||
|  |    echo "" | ||||||
|  |    echo -e "\t[ \033[31m\033[1mError\033[m ]: $*" | ||||||
|  |    echo "" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | fatal(){ | ||||||
|  |    echo "" | ||||||
|  |    echo -e "\t[ \033[31m\033[1mFatal\033[m ]: $*" | ||||||
|  |    echo "" | ||||||
|  |    echo -e "\t\033[37m\033[1mInstalllation will be interrupted\033[m\033[m" | ||||||
|  |    echo "" | ||||||
|  |    clean_up 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | warn (){ | ||||||
|  |    echo "" | ||||||
|  |    echo -e "\t[ \033[33m\033[1mWarning\033[m ]: $*" | ||||||
|  |    echo "" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | info (){ | ||||||
|  |    echo "" | ||||||
|  |    echo -e "\t[ \033[32m\033[1mInfo\033[m ]: $*" | ||||||
|  |    echo "" | ||||||
|  | } | ||||||
|  | echo_done() { | ||||||
|  |    echo -e "\033[80G[ \033[32mdone\033[m ]" | ||||||
|  | } | ||||||
|  | echo_ok() { | ||||||
|  |    echo -e "\033[80G[ \033[32mok\033[m ]" | ||||||
|  | } | ||||||
|  | echo_warning() { | ||||||
|  |    echo -e "\033[80G[ \033[33m\033[1mwarn\033[m ]" | ||||||
|  | } | ||||||
|  | echo_failed(){ | ||||||
|  |    echo -e "\033[80G[ \033[1;31mfailed\033[m ]" | ||||||
|  | } | ||||||
|  | echo_skipped() { | ||||||
|  |    echo -e "\033[80G[ \033[37mskipped\033[m ]" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | trap clean_up SIGHUP SIGINT SIGTERM | ||||||
|  |  | ||||||
|  |  | ||||||
|  | clear | ||||||
|  | echo "" | ||||||
|  | echo -e "\033[21G\033[32mRevoke OpenVPN key.. \033[m" | ||||||
|  | echo "" | ||||||
|  | echo "" | ||||||
|  |  | ||||||
|  | declare -a conf_file_arr=() | ||||||
|  | declare -a conf_name_arr=() | ||||||
|  | for _conf_file in `ls ${script_dir}/conf/server-*.conf 2>/dev/null` ; do | ||||||
|  |    conf_file_arr+=("${_conf_file}") | ||||||
|  |    _basename=$(basename $_conf_file) | ||||||
|  |    _tmp_name=${_basename%%.*} | ||||||
|  |    _tmp_name=${_tmp_name#*-} | ||||||
|  |    conf_name_arr+=("$_tmp_name") | ||||||
|  | done | ||||||
|  |  | ||||||
|  | if [[ ${#conf_file_arr[@]} -lt 1 ]] ; then | ||||||
|  |    fatal "NO Configuration found!" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | echo "" | ||||||
|  |  | ||||||
|  | declare -i i=0 | ||||||
|  |  | ||||||
|  | if [[ ${#conf_file_arr[@]} -gt 1 ]] ; then | ||||||
|  |    echo "" | ||||||
|  |    echo "Which Configuration should be loaded?" | ||||||
|  |    echo "" | ||||||
|  |    for _conf_file in ${conf_file_arr[@]} ; do | ||||||
|  |       echo " [${i}] ${conf_name_arr[${i}]}" | ||||||
|  |       (( i++ )) | ||||||
|  |    done | ||||||
|  |    _OK=false | ||||||
|  |    echo | ||||||
|  |    echononl "Eingabe: " | ||||||
|  |    while ! $_OK ; do | ||||||
|  |       read _IN | ||||||
|  |       if is_number "$_IN" && [[ -n ${conf_file_arr[$_IN]} ]]; then | ||||||
|  |          conf_file=${conf_file_arr[$_IN]} | ||||||
|  |          _OK=true | ||||||
|  |       else | ||||||
|  |          echo ""   | ||||||
|  |          echo -e "\tFalsche Eingabe !" | ||||||
|  |          echo "" | ||||||
|  |          echononl "Eingabe: " | ||||||
|  |       fi | ||||||
|  |    done | ||||||
|  |  | ||||||
|  | else | ||||||
|  |    conf_file=${conf_file_arr[0]} | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | echo "" | ||||||
|  | echo -e "\033[32m--\033[m" | ||||||
|  | echo "" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #--------------------------------------- | ||||||
|  | #----------------------------- | ||||||
|  | # Read Configurations from $conf_file | ||||||
|  | #----------------------------- | ||||||
|  | #--------------------------------------- | ||||||
|  |  | ||||||
|  | echononl "   Load Configuration File $(basename ${conf_file}).." | ||||||
|  | if [[ ! -f "$conf_file" ]]; then | ||||||
|  |    echo_failed | ||||||
|  |    fatal "Configuration file \033[37m\033[1m$(basename ${conf_file})\033[m not found!" | ||||||
|  | else | ||||||
|  |    source "${conf_file}" > $log_file 2>&1 | ||||||
|  |    if [[ $? -eq 0 ]]; then | ||||||
|  |       echo_ok | ||||||
|  |    else | ||||||
|  |       echo_failed | ||||||
|  |       fatal "$(cat $log_file)" | ||||||
|  |    fi | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | EASY_RSA_DIR="${OPENVPN_BASE_DIR}/easy-rsa" | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | echo "" | ||||||
|  | echo -e "\033[32m--\033[m" | ||||||
|  | echo "" | ||||||
|  | KEY_NAME_TO_REVOKE="" | ||||||
|  | if [ -z "$KEY_NAME_TO_REVOKE" ]; then | ||||||
|  |    echo "Insert key name you wish to revoke." | ||||||
|  |    echo "" | ||||||
|  |    echo "" | ||||||
|  |    echononl "key name to revoke: " | ||||||
|  |    read KEY_NAME_TO_REVOKE | ||||||
|  |    while [ "X$KEY_NAME_TO_REVOKE" = "X" ] ; do | ||||||
|  |       echo -e "\n\t\033[33m\033[1mKey name is required!\033[m\n" | ||||||
|  |       echononl "key name: " | ||||||
|  |       read KEY_NAME_TO_REVOKE | ||||||
|  |    done | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | for _name in $key_names_reserverd ; do | ||||||
|  |    [[ "$_name" = "$KEY_NAME_TO_REVOKE" ]] && fatal "Name '$KEY_NAME_TO_REVOKE' cannot be used - its a reserved name!" | ||||||
|  | done | ||||||
|  |  | ||||||
|  | if [[ ! -f "${OPENVPN_BASE_DIR}/keys/${KEY_NAME_TO_REVOKE}.key" ]]; then | ||||||
|  |    fatal "Key '$KEY_NAME_TO_REVOKE' not found!" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | echo "" | ||||||
|  | echo -e "\033[32m--\033[m" | ||||||
|  | echo "" | ||||||
|  | echo "Key Name to revoke......: $KEY_NAME_TO_REVOKE" | ||||||
|  |  | ||||||
|  | info "Going to revoke key \033[37m\033[1m${KEY_NAME_TO_REVOKE}.key\033[m.." | ||||||
|  | echo -n "To continue type uppercase 'YES': " | ||||||
|  | read OK | ||||||
|  | echo "" | ||||||
|  | if [[ "$OK" != "YES" ]] ; then | ||||||
|  |    fatal "Abort by user request - Answer as not 'YES'" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #--------------------------------------- | ||||||
|  | #----------------------------- | ||||||
|  | # Revoke Key | ||||||
|  | #----------------------------- | ||||||
|  | #--------------------------------------- | ||||||
|  |  | ||||||
|  | echo "" | ||||||
|  |  | ||||||
|  | # --- | ||||||
|  | # --- | ||||||
|  | echononl "Backup existing OpenVPN directory '$OPENVPN_BASE_DIR'.." | ||||||
|  | if [[ -d "$OPENVPN_BASE_DIR" ]]; then | ||||||
|  |    cp -a "$OPENVPN_BASE_DIR" "${OPENVPN_BASE_DIR}.$_date" > "$log_file" 2>&1 | ||||||
|  |    if [[ $? -eq 0 ]] ; then | ||||||
|  |       echo_ok | ||||||
|  |    else | ||||||
|  |       echo_failed | ||||||
|  |       fatal "$(cat $log_file)" | ||||||
|  |    fi | ||||||
|  | else | ||||||
|  |    echo_skipped | ||||||
|  |    fatal "OpenVPN directory '$OPENVPN_BASE_DIR' not found!" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | # --- | ||||||
|  | # - source file vars | ||||||
|  | # --- | ||||||
|  | echononl "   Load configuration '${EASY_RSA_DIR}/vars'.." | ||||||
|  | source ${EASY_RSA_DIR}/vars > "$log_file" 2>&1 | ||||||
|  | if [[ $? -eq 0 ]] ; then | ||||||
|  |    echo_ok | ||||||
|  | else | ||||||
|  |    echo_failed | ||||||
|  |    error "$(cat $log_file)" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # --- | ||||||
|  | # - Revoke Key | ||||||
|  | # --- | ||||||
|  | echo "" | ||||||
|  | echo -e "\033[32m--\033[m" | ||||||
|  | echo "Revoke Key ${KEY_NAME_TO_REVOKE}.key .." | ||||||
|  | echo -e "\033[32m--\033[m" | ||||||
|  | echo "" | ||||||
|  |  | ||||||
|  | echononl "Change into key directory '$KEY_DIR'.." | ||||||
|  | cd "$KEY_DIR" > "$log_file" 2>&1 | ||||||
|  | if [[ $? -eq 0 ]] ; then | ||||||
|  |    echo_ok | ||||||
|  | else | ||||||
|  |    echo_failed | ||||||
|  |    fatal "$(cat $log_file)" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | echononl "Set Defaults .." | ||||||
|  | CRL="crl.pem" | ||||||
|  | RT="revoke-test.pem" | ||||||
|  | export KEY_CN="" | ||||||
|  | export KEY_OU="" | ||||||
|  | export KEY_NAME="" | ||||||
|  | echo_ok | ||||||
|  |  | ||||||
|  | echononl "Remove file '$RT'.." | ||||||
|  | rm -f "$RT" > "$log_file" 2>&1 | ||||||
|  | if [[ $? -eq 0 ]] ; then | ||||||
|  |    echo_ok | ||||||
|  | else | ||||||
|  |    echo_failed | ||||||
|  |    fatal "$(cat $log_file)" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | echononl "Revoke key ${KEY_NAME_TO_REVOKE}.key and update data base .." | ||||||
|  | $OPENSSL ca -revoke "${KEY_NAME_TO_REVOKE}.crt" -config "$KEY_CONFIG" > "$log_file" 2>&1 | ||||||
|  | if [[ $? -eq 0 ]] ; then | ||||||
|  |    echo_ok | ||||||
|  | else | ||||||
|  |    echo_failed | ||||||
|  |    fatal "$(cat $log_file)" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | echononl "Generate a new CRL -- try to be compatible with intermediate PKIs" | ||||||
|  | $OPENSSL ca -gencrl -out "$CRL" -config "$KEY_CONFIG" > "$log_file" 2>&1 | ||||||
|  | if [[ $? -eq 0 ]] ; then | ||||||
|  |    echo_ok | ||||||
|  | else | ||||||
|  |    echo_failed | ||||||
|  |    fatal "$(cat $log_file)" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # --- | ||||||
|  | # - Check if Revokation was sucessfully. | ||||||
|  | # --- | ||||||
|  | echo "" | ||||||
|  | echo -e "\033[32m--\033[m" | ||||||
|  | echo "Check if Revokation of Key ${KEY_NAME_TO_REVOKE} was sucessfully.." | ||||||
|  | echo -e "\033[32m--\033[m" | ||||||
|  | echo "" | ||||||
|  |  | ||||||
|  | echononl "Create CA file '$RT' from $CRL to check against.." | ||||||
|  | if [ -e export-ca.crt ]; then | ||||||
|  |    cat export-ca.crt "$CRL" >"$RT" 2> "$log_file" | ||||||
|  |    _retval=$? | ||||||
|  | else | ||||||
|  |    cat ca.crt "$CRL" >"$RT" 2> "$log_file" | ||||||
|  |    _retval=$? | ||||||
|  | fi | ||||||
|  | if [[ $_retval -eq 0 ]]; then | ||||||
|  |    echo_ok | ||||||
|  | else | ||||||
|  |    echo_failed | ||||||
|  |    error "$(cat $log_file)" | ||||||
|  |    fatal "Verifying the revocation is not possible!" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | echononl "Verify the revocation.." | ||||||
|  | $OPENSSL verify -CAfile "$RT" -crl_check "${KEY_NAME_TO_REVOKE}.crt" > "$log_file" 2>&1 | ||||||
|  | if [[ $? -eq 2 ]]; then | ||||||
|  |    echo_ok | ||||||
|  |    info "Key \033[37m\033[1m${KEY_NAME_TO_REVOKE}.key\033[m successfully revoked." | ||||||
|  | else | ||||||
|  |    echo_failed | ||||||
|  |    error "$(cat $log_file)" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | clean_up 0 | ||||||
		Reference in New Issue
	
	Block a user