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 key1@mydomain.com -r  key2@mydomain.com --local-user sig1@mydomain.com --batch --passphrase-file /path/to/gpg-password --sign -ea myfile

The command encrypts the file for two recipients: key1@mydomain.com and key2@mydomain.com. It signs the file with sig1@mydomain.com. 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 key1@mydomain.com -r  key2@mydomain.com --local-user sig1@mydomain.com --local-user sig2@mydomain.com --batch --passphrase-file /path/to/gpg-password --sign -ea myfile

gpg: skipped "sig2@mydomain.com": 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.