Git, SSH, and GPG¶
These instructions should work for Linux, macOS, and Windows.
Important
Install Git, SSH, GPG, and the GitHub CLI before proceeding. Follow the Linux setup guide, macOS setup guide, or Windows setup guide.
Configure Git¶
Configure your username and email:
git config --global user.name "your_username"
git config --global user.email "email_used_for_github@address.tld"
To clone with https, you may need to add the git https helper. Run sudo apt install libcurl4-openssl-dev
in Ubuntu or dnf install curl-devel
in Fedora.
Set up SSH keys¶
What you’ll be doing
SSH keys provide asymmetric cryptography for securing your connections. In asymmetric cryptography, there are two keys: a public one and a private one. The public key encrypt messages, while the private one is needed to decrypt them. This means that you could send your public key out to everyone. But your private key must remain on your computer and be secure. For historical reasons, SSH, OpenSSL, and GPG provide independent mechanisms, but they’re similar.
Generate a new SSH key¶
Add it to the ssh-agent¶
Add it to GitHub¶
Configure SSH¶
About these steps
Disable SSH agent forwarding, which is very insecure. Also disable X forwarding, which also has security concerns. These are usually the defaults.
Create or edit ~/.ssh/config
. Replace the contents with the following.
AddKeysToAgent yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
# Modify these as needed
Host *
ServerAliveInterval 60
ServerAliveCountMax 1200
Host github
HostName github.com
IdentityFile ~/.ssh/id_ed25519
User kelly@gmail.com
Tip
If needed, fix permissions with this snippet:
Optional: Connect to another server¶
To set up your keys to connect to another server, run ssh-copy-id
to transfer your key. Also add it to your config:
Servers lacking EdDSA support
Some servers might not support EdDSA yet. If this is the case, generate another pair of keys:
Substituteid_ed25519
for id_rsa
in your config. Optional: Allow remote access¶
You will need to install and configure the SSH server.
firewalld
should accept communications over port 22 without additional configuration. If not, look for firewalld guides (and shoot me a message).
Enable “Remote Login” and “Allow full disk access for remote users” under Sharing settings.
Enable “OpenSSH server” under Optional Features.
Alternative to GPG: Sign with SSH¶
As of August 2022, GitHub supports signing with SSH keys, which you can use instead. This is an alternative to signing with GPG keys. However, this has no significant advantages, is more limited, and may be less secure.
If you still want to sign with SSH keys
Run:
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519
git config --global commit.gpgsign true
Note: Although the config keys are gpg.format
and gpg.format
, it will actually use SSH.
Set up GPG keys¶
Generate a key pair¶
Also see GitHub’s guide to generating GPG keys. You may consider using an @users.noreply
email address per their suggestion.
-
Install GPG:
sudo apt install gnupg
sudo dnf install gnupg
brew install gnupg
choco install gnupg
(as an administrator) -
Launch gpg-agent by running
-
Then, generate a key pair by running
Use your full name and the email address you used on GitHub. As with SSH keys, you may choose to use a passphrase. Choose a reasonable expiration date.
Tell Git to use your GPG key¶
To see your generate key pair, run
sec ed25519 2023-11-04 [SC] [expires: 2025-11-03] (1)!
983C8320158FBB03818D3910C01A28311C1501SH (2)!
uid [ultimate] Kerri Johnson <kerri-johnson@hotmail.com>
ssb cv25519 2023-11-04 [E] [expires: 2025-08-03]
- Check the type:
pub
is public;sec
is your private key. Here, we wantsec
. - This is your key ID. (Note: There may be a prefix, using
/
as a seperator.)
If you have multiple keys, make sure to select the one you want. Using your secret key ID, run:
git config --global --unset gpg.format
git config --global commit.gpgsign true
git config --global user.signingkey 983C8320158FBB03818D3910C01A28311C1501SH
Upload the GPG key to GitHub¶
Using your secret key ID, run
Then upload to GitHub by running the following.
- Use a good title.
Delete the key.private.gpg
file when done.
Optional: Publicize your public key¶
Note
This assumes that you used a real email address, not a @users.noreply.github.com
address.
To list your public keys, run
You’ll see this:
pub ed25519 2023-11-04 [SC] [expires: 2025-11-03] (1)!
AC03281HD01A83C8DD50A9BEAA130FA03599207C (2)!
uid [ultimate] Kerri Johnson <kerri.johnson@hotmail.com>
sub cv25519 2023-11-04 [E] [expires: 2025-11-03]
- Check the type:
pub
is public;sec
is your private key. Here, we wantpub
. - This is your key ID. (Note: There may be a prefix, using
/
as a seperator.)
Danger
Make sure you are using your public (pub
) key, not your private key (sec
).
Using your public key ID, run the following to get a key file called kerri-johnson.pub.asc
:
You can make this file available publicly, such as on your website.
Thanks
Thank you to Cole Helsell for drafting this guide with me.