Windows git SSH authentication to GitHub

Imagine having a tool that can automatically detect if you are using JPA and Hibernate properly. Hypersistence Optimizer is that tool!

Installing Git for Windows

  1. Download git for windows
  2. Run the downloaded installer and pay attention to the following settings
  3. You may prefer installing the git context menu, but I like to keep things simple so I just unchecked it

    mysgit-install-no-context

  4. Choose “Use Git from the Windows command prompt”

    mysgit-install-command-prompt

  5. Choose “Checkout windows-style, commit Unix-style line endings”

    mysgit-install-checkout-windows-style

Installing SSH tools

The most common SSH windows utilities are the ones coming with Putty.

Downloading Putty binaries

First you need to go to Putty binaries repository and download the following resources:

  1. puttygen.exe
  2. plink.exe
  3. pageant.exe

Generating SSH keys

If you don’t have a SSH public/private key pair you can generate it using the puttygen utility.

From now on I’ll use %USER_HOME% whenever I refer to your Windows user home folder, which depending on your Windows version may be located in:

Version

Path

Windows XP

C:\Documents and Settings\vlad

Windows 7 and later

C:\Users\vlad

You need to create a %USER_HOME%.ssh folder to store your SSH private key.

mkdir .ssh
  1. Open puttygen and click Generate

    puttygen-save-private-key

  2. Copy the public key to clipboard
  3. Go to your GitHub account, open the Account settings menu and navigate to the SSH Keys section. There you need to paste your public key

    github-add-key

  4. Add a strong key passphrase for securing your private key usage and click “Save the private key”. You need to save it to the %USER_HOME%\.ssh folder.

    You should now have a %USER_HOME%\.ssh\github-rsa.ppk file.

Setting up the SSH agent

  1. Create a shortcut of pageant.exe and save it in the Startup folder.

    In Windows 10, you can access the Startup folder associated with your user account under this path:

    C:\Users\%USERNAME%\AppData\Roaming\Microsoft\
    Windows\Start Menu\Programs\Startup

    Make sure the shortcut’s target contains the path to your key as well.

    C:\Putty\pageant.exe %USER_HOME%\.ssh\github-rsa.ppk

    In order to set a parameter to a shortcut, you can right-click the shortcut, choose Properties, and edit the Target text area to set the parameter you wish to send to the shortcut executable.

  2. Run pageant and it should go to your System Tray
  3. Double-click the pageant System Tray icon

    Adding the SSH private key to Pageant

  4. Make sure the %USER_HOME%\.ssh\github-rsa.ppk private key is listed
  5. Go to environment variables and add the GIT_SSH variable to reference the plink.exe system path.

    plink-git-ssh-env

Setting up your identity

Now, you need to set up your username and email address that will be used when issuing a commit:

$ git config --global user.name "Vlad Mihalcea"
$ git config --global user.email mail@vladmihalcea.com

Testing time

First, you need to establish a Plink connection, to make sure the SSH authentication works:

D:\kits\Putty>plink.exe -v git@github.com
Looking up host "github.com"
Connecting to 192.30.252.129 port 22
Server version: SSH-2.0-libssh-0.6.0
Using SSH protocol version 2
We claim version: SSH-2.0-PuTTY_Release_0.63
Using Diffie-Hellman with standard group "group14"
Doing Diffie-Hellman key exchange with hash SHA-1
Host key fingerprint is:
ssh-rsa 2048 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
Initialised AES-256 SDCTR client->server encryption
Initialised HMAC-SHA-256 client->server MAC algorithm
Initialised AES-256 SDCTR server->client encryption
Initialised HMAC-SHA-256 server->client MAC algorithm
Pageant is running. Requesting keys.
Pageant has 1 SSH-2 keys
Using username "git".
Trying Pageant key #0
Authenticating with public key "artsoft96" from agent
Sending Pageant's response
Access granted
Opening session as main channel
Opened main channel
Server refused to allocate pty
Started a shell/command
Server sent command exit status 1
Hi vladmihalcea! You've successfully authenticated, but GitHub does not provide shell access.
Disconnected: All channels closed

Now clone one of your GitHub repositories and play with git. You shouldn’t be asked for your username/password.

D:\vlad\GitHub>git clone git@github.com:vladmihalcea/db-util.git
Cloning into 'db-util'...
remote: Reusing existing pack: 213, done.
remote: Total 213 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (213/213), 150.94 KiB | 97.00 KiB/s, done.
Resolving deltas: 100% (86/86), done.
Checking connectivity... done.
D:\vlad\GitHub>cd db-util
D:\vlad\GitHub\db-util>git commit -a -m "Change developer id to author"
[master 93ee2bf] Change developer id to author
 1 file changed, 1 insertion(+), 1 deletion(-)
D:\vlad\GitHub\db-util>git push
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 337 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git@github.com:vladmihalcea/db-util.git
   21e9c0e..93ee2bf  master -> master
Transactions and Concurrency Control eBook

3 Comments on “Windows git SSH authentication to GitHub

  1. This is a very helpful tutorial, and I appreciate your writing it. However, I don’t understand this line:
    “Make sure the shortcut’s target contains the path to your key as well.
    C:\Putty\pageant.exe %USER_HOME%.ssh\github-rsa.ppk”
    Aren’t shortcuts supposed to include only one file path at a time? When I tried this, it did not work.
    Please can you explain this portion further for me? I’ve never worked with SSH keys before, and would appreciate any help you can provide.

    • I updated that section to make it more clear how you can parameterize a shortcut.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.