This is an old revision of the document!
Table of Contents
Setting up Passwordless SSH-key
Generating keys
ssh-keygen
You use the tool “ssh-keygen” to create your public-private key pair. Depending on what you need to do, there are many options available, but here is an example session showing how you can run ssh-keygen
:
[user@host ~]$ ssh-keygen -t ed25519 -C "Add a Description to easily tell which machine this belongs to" Generating public/private key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): [Enter to leave default] Enter passphrase (empty for no passphrase): [Enter to leave empty] Enter same passphrase: [Enter to leave empty]
You should leave the default values above by simply hitting Enter three times. The private key is created in id_ed25519 and the matching public key is id_ed25519.pub. The id_ed25519 file name is what ssh will look for when attempting public-key authentication (unless specified differently using the IdentityFile variable in the global config file /etc/ssh/ssh_config or your local config file ~/.ssh/config).
Distributing your public key
The *.pub file needs to be appended to the ~/.ssh/authorized_keys file to be recognized by ssh. This should be done on any remote hosts you wish to connect to using public-key authorization. Each key in this file needs to be added on its own line and the file needs to have specific permissions and ownership in order to be recognized:
- owner: the user whose home directory it resides in
- permissions: 0600, writable by the owner and no one else
There are different ways to distribute and set up the authorized_keys file depending on your situation:
Local Console Access
If you have access to the console of the remote host (i.e. you can physically access the console in-person), then you can set up the authorized_keys file like this (note that this does not require admin/sudo privileges):
- Generate your SSH key on your computer that you will use to access the remote host using ssh-keygen as described above
- Save the .pub key file either in email to yourself or on a USB drive
- On the local console of the remote host, login as your user account:
- Copy the contents of the new public key (either from email or a USB drive) to a temp file:
TMP_NEWKEY_FILE=/tmp/newkey.pub echo "ssh-ed25519 AAAAasdfghjklQWERTYPOIUzxcvbnm/00/PLokIJuhYG12345 this is a comment" > $TMP_NEWKEY_FILE
- Set up your ~/.ssh directory and authorized_keys file with correct permissions. This is safe to do even if they already exist and will not erase or overwrite existing keys:
mkdir -p ~/.ssh touch ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
- Append your new public key:
cat $TMP_NEWKEY_FILE >> ~/.ssh/authorized)_keys
- Delete the temp file:
rm $TMP_NEWKEY_FILE
Password authentication is enabled on the remote host
If you can log in to the remote host using a password, then you can use the command ssh-copy-id to set up your public key. Here is an example session showing how ssh-copy-id works:
[user@localhost ~]$ ssh-copy-id user@remotehost /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/username/.ssh/id_ed25519.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 user@remotehosts's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'user@remotehost'" and check to make sure that only the key(s) you wanted were added.
If ssh-copy-id does not work or is not available, then you can manually accomplish the same steps like this:
# Your pub key's filename may differ depending on whether it was ed25519 (id_ed25519.pub), rsa (id_rsa.pub) or dsa (id_dsa.pub) [user@localhost ~]$ scp ~/.ssh/id_ed25519.pub user@remotehost:/home/user/.ssh/my_id.pub Enter password for user@remotehost: [user@localhost ~]$ ssh user@remotehost Enter Password [user@remotehost ~]$ cd .ssh [user@remotehost .ssh]$ cat my_id.pub >> authorized_keys [user@remotehost .ssh]$ chmod 600 authorized_keys [user@remotehost .ssh]$ rm my_id.pub
Password authentication is disabled on the remote host
If password authentication is already disabled, then you will have to give your public key file to someone with admin access who already has public key authentication set up, or follow the above instructions for local console access to set it up yourself.
If you have admin access and have been asked to add someone else's public key to their user account, the following example code should guide you on the steps to take. This assumes that they have somehow given you their public key and it is stored in a file called /tmp/newkey.pub and their user account is example. Modify these variables appropriately to meet your needs:
USERNAME=example TMP_PUBKEY_FILE="/tmp/newkey.pub" USER_HOME=$(eval echo "~$USERNAME") AUTHKEY_FILE="$USER_HOME/.ssh/authorized_keys" # Ensure .ssh exists sudo mkdir -p "$USER_HOME/.ssh" sudo touch "$AUTHKEY_FILE" # Append key if not already present if ! sudo grep -Fxq -f "$TMP_PUBKEY_FILE" "$AUTHKEY_FILE"; then cat "$TMP_PUBKEY_FILE" | sudo tee -a "$AUTHKEY_FILE" > /dev/null fi # Set permissions sudo chmod 700 "$USER_HOME/.ssh" sudo chmod 600 "$AUTHKEY_FILE" sudo chown -R "$USERNAME" "$USER_HOME/.ssh" # Clean up temp file rm -f "$TMP_PUBKEY_FILE"