Developing on Windows 10 has been a joy since the release of Windows Subsystem for Linux (WSL), however straddling the line between Windows and Linux can sometimes cause friction.
With the steps outlined below we can resolve the No secret key error that can sometimes pop up while signing commits from Windows while also having GPG setup with a passphrase (which would be silly not to have, right??) in WSL.
My setup is as follows:
- Windows 10
- WSL v1
- Git 2.28
- GPG 2.2.21 with a key that has a passphrase
- IntelliJ IDEA (but this probably applies to other Windows IDEs)
When I’m working from my WSL console, I can easily create signed commits. My keys are stored in
~/.gnupg and everything works a treat. However, when I try to create a signed commit from IntelliJ in Windows, I get the following message:
Commit failed with error gpg: signing failed: No secret key gpg: signing failed: No secret key gpg failed to sign the data failed to write commit object
When performing the same commit via the WSL console, I would get a passphrase prompt, and the commit would succeed if I enter the correct passphrase:
I didn’t get a similar prompt in IntelliJ, so it became clear that I needed a Windows option for entering my passphrase. I already had gpg installed for Windows, but it was command line driven and I suspect there’s not a straightforward way to communicate to IntelliJ that a passphrase is required. I also didn’t want to wrap
gpg and store my passphrase in cleartext (because that’s like a security mullet – vault door in the front; screen door in the back).
The quickest, most secure, way to get this working would be to install Gpg4win and import my gpg keys from WSL. So, to do this, the first task is to export my keys so they can be imported. From WSL I just drop them on my desktop:
gpg -a --export-secret-keys > /c/Users/emerle/Desktop/gpgkeys.asc
Once this is done, you can import these into the
Kleopatra application that comes with Gpg4win. Be sure to permanently delete that gpgkeys.asc file – it has your private key(s) in it! Once you finish the import into
Kleopatra, you’ll have something like this (but less blurry)
Now, the only thing left to do is tell
git to use
Gpg4win. From the Windows version of
git, you set the
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
Now when IntelliJ uses the Windows version
git to perform the commit, it will use the defined
gpg.program. In this case, we should see our passphrase prompt when we try to commit:
Because you added this setting to your Windows git configuration, this shouldn’t interfere with your WSL configuration. Now you can seamlessly commit from either Windows or WSL with a GPG signature!