Skip to main content

SSH IdentityAgent proxy that triggers KeePassXC database unlock via TouchID

Project description

KeePassXC SSH Agent

keepassxc-ssh-agent is an SSH IdentityAgent proxy for macOS that automatically triggers KeePassXC database unlock (via TouchID / Quick Unlock) when an SSH key is needed.

Similar to how Strongbox handles SSH keys, this tool sits between your SSH client and the system ssh-agent. When SSH requests a key that isn't loaded (because the KeePassXC database is locked), the proxy triggers KeePassXC's unlock dialog. After you authenticate with TouchID, KeePassXC pushes the keys to ssh-agent, and the SSH operation continues seamlessly.

Functionality demonstration

Prerequisites

  • macOS (uses Unix sockets and KeePassXC's browser extension socket)
  • Python >= 3.10
  • KeePassXC with:
    • Browser Integration enabled (Settings > Browser Integration > Enable browser integration) KeePassXC Browser Integration Settings screenshot
    • SSH Agent Integration enabled (Settings > SSH Agent > Enable SSH Agent integration) SSH-Agent settings screenshot
    • SSH keys configured with "Add key to agent when database is opened/unlocked" SSH-Key entry settings screenshot

Usage

usage: keepassxc-ssh-agent [-h] [--socket SOCKET] [--config CONFIG]
                           [--timeout TIMEOUT] [-v]
                           {install,run,status,uninstall} ...

SSH IdentityAgent proxy that triggers KeePassXC database unlock via TouchID

positional arguments:
  {install,run,status,uninstall}
    install             Associate with KeePassXC and install LaunchAgent
    run                 Start the SSH agent proxy (default command)
    status              Check connection status with KeePassXC
    uninstall           Remove LaunchAgent and restore SSH_AUTH_SOCK

options:
  -h, --help          show this help message and exit
  --socket SOCKET     Path for the agent Unix socket
                      (default: ~/.keepassxc/agent.sock)
  --config CONFIG     Path to config file
                      (default: ~/.keepassxc/ssh-agent.json)
  --timeout TIMEOUT   Timeout in seconds for unlock prompt (default: 30)
  -v, --verbose       Enable verbose logging

How It Works

SSH Client ──► SSH agent protocol ──► keepassxc-ssh-agent (proxy)
                                             │
                                             ├─► SSH agent protocol ──► System ssh-agent
                                             │   (forward requests / replay after unlock)
                                             │
                                             └─► Browser extension protocol ──► KeePassXC
                                                 (trigger unlock when keys missing)
  1. SSH client connects to the proxy socket and requests identities or a signature
  2. Proxy forwards the request to the system ssh-agent
  3. If ssh-agent returns keys/signature, proxy passes it through (no delay)
  4. If ssh-agent returns empty/failure (DB is locked, keys not loaded):
    • Proxy connects to KeePassXC via the browser extension protocol
    • Sends get-databasehash with triggerUnlock to show the unlock dialog
    • Polls until the database is unlocked or timeout expires
    • KeePassXC pushes SSH keys to ssh-agent on unlock
    • Proxy retries the original request and returns the result

SSH_AUTH_SOCK Interception

The proxy automatically intercepts SSH_AUTH_SOCK on startup by renaming the system ssh-agent socket (e.g. /tmp/com.apple.launchd.XXX/Listeners) to a .system backup and placing a symlink from the original path to the proxy socket. All SSH clients then connect to the proxy transparently. The proxy forwards requests to the renamed .system socket.

On shutdown, the proxy restores the original socket. No separate LaunchAgent or SSH config is needed — the run command handles everything.

Install

Make sure KeePassXC is running and unlocked with browser integration enabled, then:

Homebrew (recommended)

See homebrew homepage on how to setup homebrew.

brew install mietzen/tap/keepassxc-ssh-agent
keepassxc-ssh-agent install --register-only
brew services start keepassxc-ssh-agent

This will:

  • Install keepassxc-ssh-agent and its dependencies
  • Register with KeePassXC (you'll need to approve the association in the unlocked KeePassXC window)
  • Start the background service via Homebrew (auto-starts on login)

pipx - Automatic Install

See pipx installation guide on how to setup pipx.

pipx install keepassxc-ssh-agent
keepassxc-ssh-agent install -y

This will:

  • Generate encryption keys for the browser protocol
  • Request association with KeePassXC (you'll need to approve it in the KeePassXC window)
  • Save the agent configuration to ~/.keepassxc/ssh-agent.json
  • Save the browser API credentials to ~/.keepassxc/browser-api.json (shared with keepassxc-cli if installed)
  • Create a LaunchAgent for auto-start on login

The -y flag auto-accepts all prompts. Without it, you'll be asked interactively whether to create the LaunchAgent.

pipx - Manual Install

If you want more control over the installation, you can split it into steps:

1. Install the package

pipx install keepassxc-ssh-agent

2. Register with KeePassXC

Register with KeePassXC without creating a LaunchAgent:

keepassxc-ssh-agent install --register-only

You'll need to approve the association in the KeePassXC window when prompted.

3. Create a LaunchAgent (optional)

To auto-start the agent on login, create a LaunchAgent plist:

cat << 'EOF' > ~/Library/LaunchAgents/org.keepassxc.ssh-agent.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>org.keepassxc.ssh-agent</string>
  <key>ProgramArguments</key>
  <array>
    <string>/path/to/keepassxc-ssh-agent</string>
    <string>run</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
  <key>StandardOutPath</key>
  <string>/tmp/keepassxc-ssh-agent.out.log</string>
  <key>StandardErrorPath</key>
  <string>/tmp/keepassxc-ssh-agent.err.log</string>
</dict>
</plist>
EOF
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/org.keepassxc.ssh-agent.plist

Replace /path/to/keepassxc-ssh-agent with the actual path (find it with which keepassxc-ssh-agent).

Or start manually without a LaunchAgent:

keepassxc-ssh-agent run

Uninstall

Homebrew

brew services stop keepassxc-ssh-agent
brew uninstall keepassxc-ssh-agent
rm -rf ~/.keepassxc  # Remove config (optional)

pipx

keepassxc-ssh-agent uninstall -y
pipx uninstall keepassxc-ssh-agent

This stops and removes the LaunchAgent, restores the original SSH_AUTH_SOCK socket, and removes the config directory (~/.keepassxc/). Without -y, you'll be asked before deleting the config directory.

Manual Uninstall

1. Stop and remove the LaunchAgent

launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/org.keepassxc.ssh-agent.plist 2>/dev/null
rm -f ~/Library/LaunchAgents/org.keepassxc.ssh-agent.plist

2. Restore SSH_AUTH_SOCK

If the agent was running, it restores the original socket on shutdown automatically. If the system socket is still symlinked (e.g. after a crash), reboot or restore manually:

# Find the original socket path
SYSTEM_AGENT=$(cat ~/.keepassxc/ssh-agent.json | python3 -c 'import json,sys; print(json.load(sys.stdin).get("system_agent_path",""))')
# Remove the symlink and restore the backup
rm -f "$SYSTEM_AGENT"
mv "${SYSTEM_AGENT}.system" "$SYSTEM_AGENT"

3. Remove config and socket

rm -rf ~/.keepassxc

4. Uninstall the package

pipx uninstall keepassxc-ssh-agent

Known Limitations

  • macOS only: Uses KeePassXC's browser extension Unix socket at $TMPDIR/org.keepassxc.KeePassXC.BrowserServer
  • DB unlocked but agent cleared: If the database is already unlocked but ssh-agent keys were manually removed (ssh-add -D), the proxy detects empty keys and triggers "unlock", but KeePassXC reports "already unlocked" without reloading keys. Workaround: lock and re-unlock the database in KeePassXC.
  • Multiple databases: triggerUnlock only works for the currently active database tab in KeePassXC.

Development

This package depends on keepassxc-browser-api, which handles the KeePassXC browser extension protocol. The browser API credentials are stored in ~/.keepassxc/browser-api.json and are shared with keepassxc-cli if installed.

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run tests with coverage
pytest --cov=keepassxc_ssh_agent

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

keepassxc_ssh_agent-1.2.0.tar.gz (4.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

keepassxc_ssh_agent-1.2.0-py3-none-any.whl (15.9 kB view details)

Uploaded Python 3

File details

Details for the file keepassxc_ssh_agent-1.2.0.tar.gz.

File metadata

  • Download URL: keepassxc_ssh_agent-1.2.0.tar.gz
  • Upload date:
  • Size: 4.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for keepassxc_ssh_agent-1.2.0.tar.gz
Algorithm Hash digest
SHA256 6e032b33919816973f7918b40c74f7ac0f20f3dd1e85648dc37578b53435d1a3
MD5 2cc850d46b2a8c11819c52d8e5e5f001
BLAKE2b-256 7369d607b7837e168c56cc6d3f118e32989f312444ef5697a9f8f40b27deb0a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for keepassxc_ssh_agent-1.2.0.tar.gz:

Publisher: pypi.yml on mietzen/keepassxc-ssh-agent

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file keepassxc_ssh_agent-1.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for keepassxc_ssh_agent-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 27249694bcd05acb5bea1c42ac2507ec9d0503e3f894540e957665f38cc9baac
MD5 cd89bbeee10c31998fe1d0a5f7dca3cf
BLAKE2b-256 ea9470c933d1d2405848b075da23c1797a0cff2cc8a1581c1ba9e1696ada97b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for keepassxc_ssh_agent-1.2.0-py3-none-any.whl:

Publisher: pypi.yml on mietzen/keepassxc-ssh-agent

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page