Generating and using SSH keys

Summary

SSH keys, a public key cryptographic system, secures network communication and replaces plain text password authentication on remote systems. SSH is widely used as the default service to connect to shell accounts, switches, routers, git repositories, serial consoles, etc. Many of these systems require ssh keys to operate, creating the keys varies depending on the operating systems and the ssh software installed. Directions for unix-based systems, including macOS, are detailed below.

Command summary

Create and copy keys to a remote host:

ssh-keygen
ssh-copy-id <remote host>

Details

Use ssh-keygen to create the key. The default options will be safe for the vast majority of users:

jemurray@shell:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jemurray/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jemurray/.ssh/id_rsa.
Your public key has been saved in /home/jemurray/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:5WjnOPnQwOsulQqddNpnEeNzROX2N9g4UEgrwu9DCJY jemurray@shell
The key's randomart image is:
+---[RSA 2048]----+
|          .ooo.  |
|      o   o.+.   |
|     E o o.*  o  |
|    . o.=+= o.+. |
|     o *S+o+ + oo|
|    . +.*Oo   . o|
|     . o*=o      |
|      o. +.      |
|       oo .      |
+----[SHA256]-----+

The new keys are stored in the ~/.ssh directory:

jemurray@shell:~$ ls -al .ssh/id_rsa*
-rw------- 1 jemurray jemurray 1876 Jun 16 13:07 .ssh/id_rsa
-rw-r--r-- 1 jemurray jemurray  396 Jun 16 13:07 .ssh/id_rsa.pub

Use ssh-copy-id to facilitate copying the ssh public key to remote servers. While scp can manually move the keys around, ssh-copy-id eliminates the complexity of creating directories, fixing permissions, and reduces accidental misconfiguration.

jemurray@shell:~$ ssh-copy-id sdf.org
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/jemurray/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
jemurray@sdf.org's password:

Number of key(s) added: 1

Now try logging into the machine with:   "ssh 'sdf.org'"
and check to make sure that only the key(s) you wanted were added.

Validate the newly created key is working:

jemurray@shell:~$ ssh sdf.org
Enter passphrase for key '/home/jemurray/.ssh/id_rsa':
 *
 * Wed Jun  3 23:41:54 UTC 2020
 *

Review the new public key ssh-copy-id pushed to the remote server:

jemurray@sdf:~ $ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC19FBRJBaiuE3uJVkRdL8CjFnQEDH/ysN2nyyn7LB/Y7dLSNnL1HWDt87Jnnc430Nv+4J7isaQdaHaG4bgeDGQyDBD9NYpmI1r6+OM1MK80dZ+Mv1Gtn7ppA/m23NuSVzVQze8arTBw0bzj90W+ro75XxjaZ+VS0VNUOdHgiDKuRs/E7Fqb52tVivB0+6BqgA9MwGN3Jm2PM0IhQFx/eBKy6glQDqotzrDw+du56GCGlFbzv8unBD6OQ2yQSyJ6ZdjaXZvHQvmPpIgThqCnqrM97Kb6/NwdYpJyfwuDeOycyPX9jYgssCqTOjazEA0mxm280nGNIceQUgD4sR6u4Pb jemurray@shell

ssh-agent saves the key password allowing remote authentication without having to type a password every time:

jemurray@shell:~$ ssh-agent bash

jemurray@shell:~$ ssh-add

Enter passphrase for /home/jemurray/.ssh/id_rsa:
Identity added: /home/jemurray/.ssh/id_rsa (jemurray@shell)

jemurray@shell:~$ ssh sdf.org
 *
 * Wed Jun  3 23:41:54 UTC 2020
 *