In this post, I will run through how to properly set your Windows machine up for use with GitHub. We will install the necessary software, configure SSH for authentication, and GPG to sign off our commits.
Skip to the TL;DR section if you already know what you're doing!
Git
Install git if you haven't already done so.
> winget install Microsoft.Git ;
Found Microsoft Git [Microsoft.Git] Version 2.40.1.0.0
This application is licensed to you by its owner.
Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
Downloading https://github.com/microsoft/git/releases/download/v2.40.1.vfs.0.0/Git-2.40.1.vfs.0.0-64-bit.exe
██████████████████████████████ 55.2 MB / 55.2 MB
Successfully verified installer hash
Starting package install...
Successfully installed
Verify that the installation is working.
> git --version ;
git version 2.40.1.vfs.0.0
SSH
ssh-agent
Verify that the ssh-agent is running. It should have been included with your installation of Git (install Git)
> Get-Service ssh-agent
Status Name DisplayName
------ ---- -----------
Running ssh-agent OpenSSH Authentication Agent
In the case that ssh-agent is Stopped
or Disabled
, follow the advice on this stackoverflow answer to run the following on PowerShell on admin mode.
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
SSH Config
Create an SSH key pair.
Remember to replace your_email@example.com
with your own email address!
> ssh-keygen -t ed25519 -C your_email@example.com
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\user_name/.ssh/id_ed25519):
Created directory 'C:\Users\user_name/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\user_name/.ssh/id_ed25519.
Your public key has been saved in C:\Users\user_name/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:JDCPuYyjvbBApibR62OhJcBag/PGLbeunxYYD0BFc+w your_email@example.com
The key's randomart image is:
+--[ED25519 256]--+
|..o++. |
|. oB |
|.o + o . |
|+o=o E o |
|+B+Bo S |
|*+Oo= |
|**o+ o |
|=+o.o. |
|..+*+ |
+----[SHA256]-----+
Add to ssh-agent. You will need to do this whenever you first start up your computer.
> ssh-add 'C:\Users\user_name\.ssh\id_ed25519'
Identity added: C:\Users\user_name\.ssh\id_ed25519 (your_email@example.com)
Show your public key
> cat C:\Users\user_name/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGy2VTtWVdYHlxCfnh8Me3V++wZBBxcnN0QiwkWrFbMX your_email@example.com
Keep the terminal window open, you will need in the next steps.
GitHub Settings
Get to your personal GitHub Key settings by either:
- Click this link: https://github.com/settings/ssh/new
- Navigate to github > profile picture (top right) > Settings > SSH and GPG keys > New SSH Key
Fill in the form with the necessary information before submitting the form. You should see the new entry on the keys page:
GPG
Installing
Install GPG if you don't already have it
winget install GnuPG.GnuPG ;
Verify that the GPG is running and that you're running version > 2.
> gpg --version
gpg (GnuPG) 2.4.1
libgcrypt 1.10.2
Copyright (C) 2023 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: C:\Users\user_name\AppData\Roaming\gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
GPG Config
Generate a new key by entering gpg --full-generate-key
.
I recommend using the default settings by hitting enter at each step and picking a secure password.
> gpg --full-generate-key
gpg (GnuPG) 2.4.1; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection?
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(4) NIST P-384
(6) Brainpool P-256
Your selection?
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Joel Lau
Email address: your_email@example.com
Comment: joel's desktop pc
You selected this USER-ID:
"Joel Lau (joel's desktop pc) <your_email@example.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: C:\\Users\\user_name\\AppData\\Roaming\\gnupg\\trustdb.gpg: trustdb created
gpg: directory 'C:\\Users\\user_name\\AppData\\Roaming\\gnupg\\openpgp-revocs.d' created
gpg: revocation certificate stored as 'C:\\Users\\user_name\\AppData\\Roaming\\gnupg\\openpgp-revocs.d\\DD2DB924314496969FFF1FC4FF7A0A2FE0F81BE3.rev'
public and secret key created and signed.
pub ed25519 2023-05-01 [SC]
DD2DB924314496969FFF1FC4FF7A0A2FE0F81BE3
uid Joel Lau (joel's desktop pc) <your_email@example.com>
sub cv25519 2023-05-01 [E]
Show the list of keys
> gpg --list-secret-keys --keyid-format=long
[keyboxd]
---------
sec ed25519/FF7A0A2FE0F81BE3 2023-05-01 [SC]
DD2DB924314496969FFF1FC4FF7A0A2FE0F81BE3
uid [ultimate] Joel Lau (joel's desktop pc) <your_email@example.com>
ssb cv25519/81D580E5588F5C57 2023-05-01 [E]
Print the key id you'd like to use
the key ID comes after the protocol name (FF7A0A2FE0F81BE3
)
> gpg --armor --export KEY_ID_HERE
# e.g. gpg --armor --export FF7A0A2FE0F81BE3
Keep the terminal window open, you will need in the next steps.
GitHub Settings
Get to your personal GitHub Key settings by either:
- Click this link: https://github.com/settings/gpg/new
- Navigate to github > profile picture (top right) > Settings > SSH and GPG keys > New GPG Key
Fill in the form with the necessary information before submitting the form. You should see the new entry on the keys page:
Git (Again)
git config --global user.name "Joel Lau" ; # set user name
git config --global user.email your_email@example.com ; # set email address
git config --global core.editor "code --wait" ; # set VSCode as default text editor
git config --global --unset gpg.format ; # unset any previous GPG configuration
git config --global commit.gpgsign true ; # sign all commits using GPG
git config --global gpg.program 'C:\Program Files (x86)\gnupg\bin\gpg.exe' # tell git where to find gpg
git config --global user.signingkey KEY_ID_HERE ; # set the signing key (replace `KEY_ID_HERE`)
the resulting gitconfig file should look at follows:
[user]
email = joel.lau@protonmail.com
name = Joel Lau
signingkey = 977D5B2A1AA15946
[init]
defaultBranch = main
[core]
editor = code --wait
[gpg]
program = C:\\Program Files (x86)\\gnupg\\bin\\gpg.exe
[commit]
gpgsign = true
TL;DR
# NOTE: remember to use PowerShell on admin
# git
winget install Microsoft.Git ;
# start ssh-agent
Get-Service -Name ssh-agent | Set-Service -StartupType Manual ;
# create ssh keys - add to https://github.com/settings/keys
ssh-keygen -t ed25519 -C "your_email@example.com"
# add keys to ssh-agent
ssh-add ~/.ssh/id_ed25519
# gpg
# NOTE: remember to add 'C:\Program Files (x86)\gnupg\bin' to path
winget install GnuPG.GnuPG ;
# create gpg keys - add to https://github.com/settings/keys
gpg --full-generate-key ;
# show list of keys
gpg --list-secret-keys --keyid-format=long ;
# show key (the text after `sec 4096R/`)
gpg --armor --export KEY_ID_HERE
# set user name
git config --global user.name "Joel Lau" ;
# set email address
git config --global user.email your_email@example.com ;
# set VSCode as default text editor
git config --global core.editor "code --wait" ;
# unset any previous GPG configuration
git config --global --unset gpg.format ;
# sign all commits using GPG
git config --global commit.gpgsign true ;
# tell git where to find gpg
git config --global gpg.program 'C:\Program Files (x86)\gnupg\bin\gpg.exe'
# set the signing key (replace `KEY_ID_HERE`)
git config --global user.signingkey KEY_ID_HERE ;
Top comments (0)