Multiple GitHub identities
Tips on setting up multiple GitHub accounts with SSH authentication, under WSL2
SSH keys on Windows and WSL 2
I followed this
From GitHub:
Outline
- Generate 2 SSH keypairs
- Create SSH config with alternative hostname for secondary GitHub account
- Set permissions on SSH keypairs and config
- Review files and permissions
- Store keypairs in Password Manager
- Add public key to each GitHub account
- Find alternative GitHub email address
- Set up dotfiles directory
- Set up symlinks to dotfiles
- Create .gitconfig
Generate 2 SSH keypairs
I use Windows Terminal, and connect to my Ubuntu 20.04 WSL2 distro
ssh-keygen -t rsa -b 4096 -C "work@emailaddr.ess"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nrubuntu/.ssh/id_rsa): /home/nrubuntu/.ssh/github-work
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/nrubuntu/.ssh/github-work.
Your public key has been saved in /home/nrubuntu/.ssh/github-work.pub.
ssh-keygen -t rsa -b 4096 -C "personal@emailaddr.ess"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nrubuntu/.ssh/id_rsa): /home/nrubuntu/.ssh/github-personal
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/nrubuntu/.ssh/github-personal.
Your public key has been saved in /home/nrubuntu/.ssh/github-personal.pub.
Create SSH config with alternative hostname for secondary GitHub account
nano ~/.ssh/config
Create content:
########################
######## GLOBAL ########
#######################
Host *
AddKeysToAgent yes
ForwardAgent yes
IdentitiesOnly yes
PreferredAuthentications publickey
User git
# Default GitHub (work)
Host github.com
HostName github.com
IdentityFile ~/.ssh/github-work
# Alternative GitHub (personal)
Host personal.github.com
HostName github.com
IdentityFile ~/.ssh/github-personal
Set permissions on SSH keypairs and config
chmod 400 ~/.ssh/github-personal
chmod 400 ~/.ssh/github-work
chmod 600 ~/.ssh/config
Review files and permissions
ls -al ~/.ssh
gives:
total 36
drwx------ 2 nrubuntu nrubuntu 4096 Aug 11 11:34 .
drwxr-xr-x 27 nrubuntu nrubuntu 4096 Aug 11 11:12 ..
-rw------- 1 nrubuntu nrubuntu 482 Aug 11 11:34 config
-rwxr-xr-x 1 nrubuntu nrubuntu 137 Jul 9 11:39 environment
-r-------- 1 nrubuntu nrubuntu 3326 Jul 9 11:39 github-personal
-rwxr-xr-x 1 nrubuntu nrubuntu 748 Jul 9 11:39 github-personal.pub
-r-------- 1 nrubuntu nrubuntu 3326 Jul 9 11:39 github-work
-rwxr-xr-x 1 nrubuntu nrubuntu 762 Jul 9 11:39 github-work.pub
-rw-r--r-- 1 nrubuntu nrubuntu 1869 Jul 9 11:39 known_hosts
Store keypairs in Password Manager
I use LastPass with a hardware token, which in addition to storing passwords, supports the storage of SSH keypairs as a type, so I can set:
- Bit Strength
- Passphrase
- Private Key
- Public Key
- Hostname
I tag these as favourites, which gives me easy access to them, particularly to copy the passphrase to the clipboard
Add public key to each GitHub account
Find alternative GitHub email address
Under emails setting, you can see a GitHub-generated "private" email address which you can use:
when performing web-based Git operations (e.g. edits and merges) and sending email on your behalf
They also call out the point:
If you want command line Git operations to use your private email you must set your email in Git
Note that if you already have a commit with a non-obfuscated email address, you might need to run git commit --amend --reset-author
, wrapped in git rebase
commands as described on GitHub
Set up dotfiles directory
I've taken the approach from Nick Janetakis in:
- creating a separate directory to store different configuration files in a sub-directory
- creating symbolic links
Because I'm also trying to learn Vim, I find it easier to clone his whole repository
cd
git clone https://github.com/nickjj/dotfiles.git
If you don't want to do this, just create a directory dotfiles
~/.gitconfig
contains:
[core]
editor = vim
[color "diff"]
whitespace = red reverse
[include]
path = ~/.gitconfig.user
[includeIf "gitdir:~/writing/"]
path = ~/dotfiles/.gitconfig.personal
Copy the proforma ~/dotfiles/.gitconfig.user
into ~/.gitconfig.user
cp ~/dotfiles/.gitconfig.user ~/.gitconfig.user
Put your name and GitHub private email address in ~/.gitconfig.user
:
[user]
name = Nick Romney
email = 23456789+nickromney@users.noreply.github.com
Here I view the private address from my work email as my primary. For you it may be that your personal one is your primary.
In the ~/.gitconfig
file, I used the includeIf
directive - this detects if I'm in the ~/writing
directory, and if so, switches to use my personal config
~/.gitconfig.personal
[user]
name = Nick Romney
email = 98765432+nickromney@users.noreply.github.com
List keys with ssh-add -l
You should see:
The agent has no identities.
Then add:
ssh-add ~/.ssh/github-work
Note that I'm only adding my primary identity. Because I secure it with a passphrase, on reboot, I don't want to have to enter passphrases for both identities.
Re-list with ssh-add -l
(your SHA-256 values will be different)
4096 SHA256:AO5SK6f3c0MZZApDVXcWNntdx90CpdpzC+0kwA0tAqI /home/nrubuntu/.ssh/github-work (RSA)
Update packages, then add keychain
sudo apt-get update
sudo apt-get upgrade -y
sudo apt install keychain
From https://medium.com/@pscheit/use-an-ssh-agent-in-wsl-with-your-ssh-setup-in-windows-10-41756755993e
Append this line to your ~/.bashrc
/usr/bin/keychain --nogui $HOME/.ssh/github-work
source $HOME/.keychain/$HOSTNAME-sh
Ensure that the ssh-agent is working:
eval "$(ssh-agent -s)"
And check that GitHub can use your keys:
ssh -vT git@github.com
From the output we see:
debug1: Will attempt key: /home/nrubuntu/.ssh/github-work RSA SHA256:AO5SK6f3c0MZZApDVXcWNntdx90CpdpzC+0kwA0tAqI explicit agent
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa,rsa-sha2-512,rsa-sha2-256,ssh-dss>
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/nrubuntu/.ssh/github-work RSA SHA256:AO5SK6f3c0MZZApDVXcWNntdx90CpdpzC+0kwA0tAqI explicit agent
debug1: Server accepts key: /home/nrubuntu/.ssh/github-work RSA SHA256:AO5SK6f3c0MZZApDVXcWNntdx90CpdpzC+0kwA0tAqI explicit agent
debug1: Authentication succeeded (publickey).