How to Setup SSH key for Git Operations in GitHub
Tags: github, git, authentication
Published: 2021-08-30 11:19:33

## Table of Contents
  - [Introduction](#introduction)
  - [Summary of Steps](#summary-of-steps)
  - [Create SSH Keys](#create-ssh-keys)
  - [Copy Public key to GitHub Settings](#copy-public-key-to-github-settings)
  - [Clone Repo using SSH URL](#clone-repo-using-ssh-url)
  - [Issue and Resolution](#issue-and-resolution)
  - [Bibliography and Reference](#bibliography-and-reference)

## Introduction
- In this blog, we will see how to setup password-less Git operation for our GitHub repos
- Starting from Aug-13-2021 GitHub [stopped supporting]((https://github.blog/changelog/2021-08-12-git-password-authentication-is-shutting-down/) ) password authentication for repository related Git Operations. 
- Instead, token-based authentication methods like personal access, OAuth, SSH Key, or GitHub App installation token will be required for all authenticated Git operations.
- In this blog, we will see how to setup SSH key based authentication in GitHub for doing Git operations

## Summary of Steps
- Step 1: Create SSH keys for your workstation using `ssh-keygen` command
- Step 2: Copy the SSH Public Key into GitHub Settings
- Step 3: Use SSH URL for the repository to clone

## Create SSH Keys
I'm using Ubuntu OS workstation and performed the steps in it.

- Open terminal and Run `ssh-keygen` command
The command creates following two files in `$USER_HOME/.ssh` directory, 
- `id_rsa` private key file, and 
- `id_rsa.pub` public key file
```
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key ($USER_HOME/.ssh/id_rsa):
```
Then press enter, to move further,
- It is important to ***Enter passphrase for your SSH key, to use the key for cloning private repo from GitHub***
```
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```
Finally, we can see the below output, which shows the path where the public and private key files are stored
```
Your identification has been saved in $USER_HOME/.ssh/id_rsa.
Your public key has been saved in $USER_HOME/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:VRqScsqwertyuioXGpazvfrw username@workstation_name
The key's randomart image is:
+---[RSA 2048]--+
| .+. o=o .     |
|.. o.oo.+      |
|o .   oo+ o    |
|.+   o -= +    |
|o   . o S      |
| .o+   o .     |
|.o..+ o O.     |
|o.o .-- =O.*.  |
|.+..E ooO.     |
+----[SHA256]---+
```
## Copy Public key to GitHub Settings
- Goto GitHub Settings

![GitHub Settings](https://github.com/chefgs/repo_images/blob/master/gh_sshkey/ghsettings.png?raw=true)

- Select `SSH and GPG key` from left pane

![SSH and GPG key setting](https://github.com/chefgs/repo_images/blob/master/gh_sshkey/sshkeysetting.png?raw=true)

- Select `New SSH key`

![New SSH key](https://github.com/chefgs/repo_images/blob/master/gh_sshkey/newkey.png?raw=true)

- Copy your workstation's (`id_rsa.pub`) public key content here

![Paste pub key content](https://github.com/chefgs/repo_images/blob/master/gh_sshkey/newkeyadd.png?raw=true)

- Save and the key will be listed in the `SSH key section`


## Clone Repo using SSH URL
- Now you can use the SSH URL to clone the repository

![Clone using ssh url](https://github.com/chefgs/repo_images/blob/master/gh_sshkey/clone.png?raw=true)

- While cloning, you would be prompted to enter the SSH key password
```
$ git clone git@github.com:github_userid/repo_name.git
Cloning into 'repo_name'...
Enter passphrase for key '$USER_HOME/.ssh/id_rsa': 
Checking connectivity... done.
```
- Once you enter your `SSH key password`, the repo will be cloned in your workstation

## Issue and Resolution
- Sometime we will get below error while updating the old repo, which was previously cloned using `http` and username/password, 
```
`fatal: could not read Username for 'https://github.com': terminal prompts disabled`
```
- Use the command to get rid of the issue.
```
# To avoid the error 
# we need to change gt config to use ssh/git method
git config --global --add url."git@github.com:".insteadOf "https://github.com/"
```

- Windows WSL and Ubuntu `Permission denied (publickey)` error.
- When you setup Github login in windows using WSL and Ubuntu make sure to create the _SSH key file using the name `id_rsa` only._
If we try to use other names as key file name, then we will get `Error: Permission denied (publickey)` error. 
- Refer the [docs here](https://docs.github.com/en/authentication/troubleshooting-ssh/error-permission-denied-publickey)

## Bibliography and Reference
[GitHub Docs for Working with SSH key](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/working-with-ssh-key-passphrases)

[GitHub Docs for cloning repo using SSH URL](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-ssh-urls)

[Creating SSH key for Windows 10](https://ubuntu.com/tutorials/ssh-keygen-on-windows#3-key-generation-with-ubuntu-on-wsl)