Contacting the Spirits in Multiple Dimensions with SSH Keys

What up! ☝🏻

Recently I had the problem of requiring multiple SSH keys for the same host. The host in question was GitHub. I’m not a huge fan of reusing the same key across multiple resources, sometimes you’ll catch me using the same key for git services, but when it comes to SSH access to remote hosts, it’s a hard no.

Stack Exchange had a heap of solutions including adding an entry to your identity file (more on this later), setting the GIT_SSH_COMMAND environment variable, configuring core.sshCommand as well as a few others such as configuring custom scripts and other “urgh” based solutions.

The tl;dr is I created an SSH key and associated it with a host entry in my SSH config file by specifying the Host value as github.com-username when I did a clone or added a remote I would then do git clone [email protected]:username/myrepo.git.

Create Keys for your GitHub Account(s)

$ ssh-keygen -t rsa -C "github-username" -f "~/.ssh/github-username"`

The -C comment is optional and allows you to easily identify the key. If you have ever catted a public key file you will notice the comment at the end of the file, for example:

$ cat test.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPzxupGm96maeWxmt8P41omL9kTJ
FpQepkCa1ecZajPJdXpUQwxiDLJgcq9Lrl7wCTxlw3D5vNUXQaCmwxqzWhxUOCpiY7
3OgEFNgJDZGJt3bLenn2+10E7GYGRwHsgBioex7jjM3WsciGhGesykjv7GMwrYS0zy
1sYu4O+yQFtyxPyGKJ6Ze2dOakACQOS5Xa9whumcsmtDQLTuHNC5iNWeoLYSZNWvOD
p7N1OVFcRua03mODtkUeLL9vziLI3hFpG/9N3U71TLxR2pT904hKnJttzzDjnC7k6h
A8SoOdrF4hJd7kAGidRRw4ptYZ0t7p+8hOBTFlTFuIh0vkH this is an example comment

The -f flag allows you to specify the name of the key-pair, this can also be done when using the ssh-keygen wizard:

Enter file in which to save the key (/Users/errbufferoverfl/.ssh/id_rsa):

Either way, I’d suggest you use something meaningful such as servicename-username, enter a strong password using your password manager, you should now have a public and private key in your ~/.ssh/ directory.

Add the Public Key to the Associated GitHub Account

The GitHub documentation can help if you are unfamiliar with this step.

Configure SSH Config

If you don’t have one already, in your ~/.ssh/ create a file called config. For GitHub we can configure it as follows (remember to change the username to your GitHub usernames):

# account one
Host github.com-username
    HostName github.com
    User git
    ItentifyFile ~/.ssh/github-username

# account two
Host github.com-username-two
    HostName github.com
    User git
    ItentifyFile ~/.ssh/github-username-two

Configure your Git Repo

If you have an existing repo you previously cloned you may need to modify your .git/config remote origin so it works with your new configuration. However, if you haven’t, the following syntax will ensure the repository is set up correctly:

$ git clone [email protected]:username/yourrepo.git

The username you specify after the : should match the value you set earlier.

Once you have your repository cloned you can configure your user name and user email.

As mentioned previously, if you already have a repository, you will need to update the origin that is already configured. This can be done as follows:

$ git remote set-url origin [email protected]:username/your-repo-name.git

Ensure the details between the : and the @ match the relevant Host details in your SSH config file.

You should not be able to git push and git pull like normal and it should automatically select the correct keys.

Note

More recently I have been using submodules, these can cause an annoying little problem when using SSH keys in this way as when downloading the submodule it does not automatically select the keys. To fix this you will want to update the submodule remotes within the .git/config file in the same way we did previously.