# -*-shell-script-*- # This should be sourced by bash (though we welcome changes to make it POSIX sh compliant) # Monkeysphere host revoke-key subcommand # # The monkeysphere scripts are written by: # Jameson Rollins # Jamie McClelland # Daniel Kahn Gillmor # # They are Copyright 2008-2010, and are all released under the GPL, # version 3 or later. # revoke host key revoke_key() { local keyID local publish keyID=$(check_key_input "$@") if [ "$PROMPT" = "false" ] ; then publish=N else cat <&2 This will generate a revocation certificate for key $keyID and dump the certificate to standard output. It can also directly publish the new revocation certificate to the public keyservers via $KEYSERVER if you want it to. Publishing this certificate will IMMEDIATELY and PERMANENTLY revoke your host key! EOF printf "Publish the certificate after generation? (y/n/Q) " >&2 read publish if ! [ "${publish/y/Y}" = 'Y' -o "${publish/n/N}" = 'N' ] ; then failure "aborting at user request" fi fi # our current implementation is very simple: we just want to # generate the revocation certificate on stdout. This provides # for the two most likely (but hopefully not common) scenarios: # an admin wants a revocation certificate for the host which they # can store securely offline. In this case, the admin can # redirect stdout to a file, or can simply copy/paste or # transcribe from the terminal. # Alternately, an admin might want to publish the revocation # certificate immediately, which we can help them do as well. if [ "$PROMPT" = 'false' ] ; then # FIXME: allow the end user to choose something other than # "key was compromised" (1) and to supply their own revocation # string. local revoke_commands="y 1 Monkeysphere host key revocation (automated) $(date '+%F_%T%z') y " revcert=$(GNUPGHOME="$GNUPGHOME_HOST" gpg_host --command-fd 0 --armor --gen-revoke "0x${keyID}!" <<<"$revoke_commands" ) \ || failure "Failed to generate revocation certificate!" else # note: we're not using the gpg_host function because we actually # want to use gpg's UI in this case, so we want to omit --no-tty revcert=$(GNUPGHOME="$GNUPGHOME_HOST" gpg --no-greeting --quiet --armor --gen-revoke "0x${keyID}!") \ || failure "Failed to generate revocation certificate!" fi # if you run gpg --gen-revoke but cancel it or quit in the middle, # it returns success, but emits no revocation certificate: if ! [ "$revcert" ] ; then failure "Revocation canceled." fi ## ok, now we have the revocation certificate. Print it, and ## offer to publish if originally requested: printf "%s\n" "$revcert" if [ "${publish/y/Y}" = 'Y' ] ; then printf "\n" >&2 printf "Really publish this cert to $KEYSERVER ? (Y/n) " >&2 read really if [ "${really/n/N}" = 'N' ] ; then printf "Not publishing.\n" >&2 else local newhome=$(msmktempdir) GNUPGHOME="$newhome" gpg --no-tty --quiet --import < "$HOST_KEY_FILE" GNUPGHOME="$newhome" gpg --no-tty --quiet --import <<< "$revcert" GNUPGHOME="$newhome" gpg --keyserver "$KEYSERVER" --send "0x${keyID}!" rm -rf "$newhome" fi fi }