Search code examples
encryptionbatch-processinggnupgpgp

GPG: How to sign with multiple signatures with different passphrases?


I have a job that runs periodically and signs/encrypts a file like so:

$ gpg --homedir /path/to/.gnupg -r [email protected] -r  [email protected] --local-user [email protected] --batch --passphrase-file /path/to/gpg-password --sign -ea myfile

The command encrypts the file for two recipients: [email protected] and [email protected]. It signs the file with [email protected]. It runs in batch mode as there is no human interactivity - this is an automated process. It gets the passphrase for the signature from /path/to/gpg-password.

What I would like to do is now sign the file with two signatures at the same time. Like so:

$ gpg --homedir /path/to/.gnupg -r [email protected] -r  [email protected] --local-user [email protected] --local-user [email protected] --batch --passphrase-file /path/to/gpg-password --sign -ea myfile

gpg: skipped "[email protected]": bad passphrase

It works fine in interactive mode (eg. without --batch), I just have to supply the two passphrases via the command line. However, in batch mode it fails as it tries to get the signatures from the file. The signature is only valid for one of the signing keys.

From the man page:

--passphrase-file file

Read the passphrase from file file. Only the first line will be read from file file. This can only be used if only one passphrase is supplied.

How do I tell it what the password is for each key?


Solution

  • For anyone else in the same situation as me, I ended up working around this apparent deficiency of gpg by editing one of the signing keys to have the same password as the other (the password stored in the gpg-password file). This doesn't compromise security in this instance since the password is stored in a text file anyway - the real security is the password of the user that this commands runs from and the fact that the secret keys are kept secret). You can change the password on a key by doing gpg --edit-key <key_id>, then passwd. Don't forget to save after.