#!/bin/bash # seckey2sshagent: this is a hack of a script to cope with the fact # that openpgp2ssh currently cannot support encrypted secret keys. # the basic operating principal is: # export the secret key in encrypted format to a new keyring # remove the passphrase in that keyring # use that keyring with openpgp2ssh # Authors: Daniel Kahn Gillmor , # Jameson Rollins cleanup() { echo -n "removing temp gpg home... " 1>&2 rm -rf "$TMPPRIVATE" echo "done." 1>&2 } explanation() { echo -n "The basic strategy of seckey2sshagent is to dump your OpenPGP authentication key(s) into your agent. This script is a gross hack at the moment. It is done by creating a new, temporary private keyring, letting the user remove the passphrases from the keys, and then exporting them. The temporary private keyring is purged from the system. When you use this command, you'll find yourself dropped into a GPG 'edit-key' dialog relevant *only* to the temporary private keyring. At that point, you should clear the password from your key, with: passwd followed by the empty string for the new password. GPG will ask you if you're really sure. Answer yes, because this is only relevant to the temporary keyring. Then, do: save At this point, your key will be added to your running ssh-agent with the alias 'monkeysphere-key' and seckey2sshagent should terminate. You can check on it with: ssh-add -l " } # if no hex string is supplied, just print an explanation. # this covers seckey2sshagent --help, --usage, -h, etc... if [ "$(echo "$1" | tr -d '0-9a-fA-F')" ]; then explanation exit fi trap cleanup EXIT GPGIDS="$1" if [ -z "$GPGIDS" ]; then # hack: we need to get the list of secret keys, because if you # --list-secret-keys with no arguments, GPG fails to print the # capability flags (i've just filed this as # https://bugs.g10code.com/gnupg/issue945) KEYIDS=$(gpg2 --with-colons --list-secret-keys | grep ^sec | cut -f5 -d:) # default to using all fingerprints of authentication-enabled keys GPGIDS=$(gpg --with-colons --fingerprint --fingerprint --list-secret-keys $KEYIDS | egrep -A1 '^(ssb|sec):.*:[^:]*a[^:]*:$' | grep ^fpr: | cut -d: -f10) fi for GPGID in $GPGIDS; do TMPPRIVATE=$(mktemp -d) gpg --export-secret-key "$GPGID" | GNUPGHOME="$TMPPRIVATE" gpg --import # idea to script the password stuff. not working. # read -s -p "enter gpg password: " PASSWD; echo # cmd=$(cat <