Select Page

SSH Agent: Streamlining Secure Remote Access

by | Aug 11, 2023

Understanding SSH Agents

ssh-agent serves as a key manager for SSH, holding your keys and certificates in unencrypted memory, readily available for use by ssh. It eliminates the need to enter a passphrase each time you connect to a server, operating discreetly in the background, independent of ssh. Typically, it initiates upon running ssh for the first time after a system reboot.

The security of private keys within the SSH agent is maintained by its deliberate limitations:

  1. No key material is written to disk.
  2. Private keys cannot be exported.
  3. Keys stored in the agent are exclusively used for signing messages.

Despite the agent’s sole ability to sign messages, a common misconception arises regarding SSH’s encryption and decryption of traffic using public and private key pairs. Contrary to this assumption, SSH utilizes these key pairs solely for authentication during the initial handshake.

To illustrate the verification of a user’s key during the SSH handshake from the server’s standpoint:

  1. The client presents a public key to the server.
  2. The server sends a brief, random message, requesting the client to sign it using the private key.
  3. The client instructs the SSH agent to sign the message, forwarding the result to the server.
  4. The server verifies the signature using the client’s public key.
  5. The server obtains proof that the client possesses the private key.

Later in the handshake process, a new set of ephemeral and symmetric keys is generated to encrypt the SSH session traffic. These keys may not persist for the entire session, as regular “rekey” events occur at intervals.

Advantages of Using an SSH Agent

  1. Enhanced Security: One of the key advantages of using an SSH agent is security. When you use an agent, you only need to enter your passphrase once per session, reducing the exposure of your private key. This minimizes the risk of attackers intercepting your passphrase.
  2. Streamlined Workflow: Imagine connecting to various remote servers multiple times a day without having to type in your passphrase each time. An SSH agent saves you from this hassle, making your workflow smoother and more efficient.
  3. Centralized Key Management: Managing multiple SSH keys can be a chore. With an SSH agent, you can store all your private keys in one place and let the agent handle the authentication process.
  4. Reduced Mistakes: Manually typing in passwords or passphrases can lead to typos and mistakes. An SSH agent eliminates this possibility, ensuring that your authentication process is error-free.

Using an SSH Agent: Step by Step

Step 1: Check for Existing Keys

Before diving into SSH agents, make sure you have SSH keys generated on your machine. Open a terminal and run:

ls ~/.ssh/

If you see files like id_rsa and, you already have SSH keys. If not, generate a new pair using:

ssh-keygen -t rsa -b 4096 -C ""

Step 2: Start the Agent

      • Launch the SSH agent in the background:
    eval "$(ssh-agent -s)"
      • Add your private key to the agent:
    ssh-add ~/.ssh/id_rsa

You might be prompted to enter your passphrase.

Step 3: Configure Remote Access

Copy your public SSH key to the clipboard:

xclip -sel clip < ~/.ssh/

Log in to the remote server or service and add your public key to the list of authorized keys.

Step 4: Experience the Convenience

Congratulations, you’re now benefiting from the power of the SSH agent! Connect to remote servers without the constant passphrase entry, and let the agent handle your authentication needs.


The agent protocol

SSH communicates with the agent using a Unix domain socket through the SSH agent protocol. While many users utilize the ssh-agent that is part of OpenSSH, various open-source alternatives are available.

The SSH agent protocol is straightforward, allowing for the creation of a basic SSH agent in just a day or two. Its primary operations include:

  1. Adding a regular key pair (public and decrypted private keys).
  2. Adding a constrained key pair (public and decrypted private keys).
  3. Adding a key (regular or constrained) from a smart card (public key only).
  4. Removing a key.
  5. Listing keys stored in the agent.
  6. Signing a message with a key stored in the agent.
  7. Locking or unlocking the entire agent with a passphrase.

But what exactly is a constrained key?

Typically, it’s a key with a limited lifetime or one that requires explicit user confirmation when used. The ssh-add command acts as the gateway to the SSH agent, handling all these operations except for signing. When executed without parameters, ssh-add scans your home directory for standard keys and adds them to the agent. By default, it looks for keys like:

  • ~/.ssh/id_rsa
  • ~/.ssh/id_ed25519
  • ~/.ssh/id_dsa
  • ~/.ssh/id_ecdsa

Once added, these keys are automatically used by ssh.

For macOS users, the ssh-agent that comes with macOS can store key passphrases in the macOS Keychain. This simplifies the process of re-adding keys to the agent after a reboot. Depending on Keychain settings, unlocking the keychain may still be necessary after a reboot. To store key passphrases in the Keychain, use the command ssh-add -K [key filename]. Passphrases are typically stored in the “Local Items” keychain, and ssh-agent will use these stored passphrases as needed.

What is Agent Forwarding?

The agent forwarding feature in SSH facilitates your local SSH agent to extend its capabilities through an existing SSH connection, allowing seamless authentication on a remote server. Consider a scenario where you SSH into an EC2 instance and wish to clone a private GitHub repository from there. Without agent forwarding, you’d need to store a copy of your GitHub private key on the EC2 host. However, with agent forwarding, the SSH client on EC2 can leverage the keys on your local computer for GitHub authentication.

To delve into the background, SSH connections can comprise multiple channels. For instance, an interactive connection to a bastion host (jump box) may run on one channel. When agent forwarding is activated for a connection, typically using ssh -A, a second channel is established in the background to relay any agent requests back to your local machine.

From the perspective of ssh, there is no distinction between a remote and a local ssh-agent. SSH always references the $SSH_AUTH_SOCK environment variable to locate the Unix domain socket for the agent. When connecting to a remote host with agent forwarding enabled, SSHD generates a remote Unix domain socket linked to the agent forwarding channel and exports an $SSH_AUTH_SOCK variable pointing to it.


SSH agents are the unsung heroes of secure remote access. They seamlessly blend enhanced security with streamlined convenience, making your interaction with remote servers and services more efficient.

By eliminating the need for repetitive passphrase entry, SSH agents empower you to focus on what truly matters—your work. Activate an SSH agent today and elevate your SSH experience to new heights of efficiency and security.


Submit a Comment

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

Looking For Something?

Follow Us

Related Articles

Fix: Your branch is behind origin/master

Fix: Your branch is behind origin/master

How t fix 'Your branch is behind origin/master When you see the message "your branch is behind origin/master," it means that your local branch is not up-to-date with the remote branch (usually called "master"). To solve this, you need to bring your local branch...

Fix: Your branch is ahead of origin/master by 1 commit

Fix: Your branch is ahead of origin/master by 1 commit

How to fix 'Your branch is ahead of origin/master by 1 commit' Have you ever seen the message "Your branch is ahead of origin/master by 1 commit" and wondered what to do? Don't worry; it's a common thing, and fixing it is easier than it sounds. Here's a simple guide...

Subscribe To Our Newsletter

Subscribe To Our Newsletter

Join our mailing list to receive the latest news and updates from our team.

You have Successfully Subscribed!