# SSH Key Storage in 1Password — Reference

## Session: 2026-06-26 (Hermes Agent)

### Problem
1Password's native "SSH Key" item category (`category: SSH_KEY`, field type `SSHKEY`) does **not** correctly persist the `private_key` field when created via `op item create`. The field is silently dropped from the created item.

### Workaround
Use `SECURE_NOTE` with a `CONCEALED` field labeled `private key`. This stores the key securely, hides it from casual view, and makes it retrievable via `op read` or `op item get --reveal`.

### Pattern

1. **Generate key locally** (Ed25519 preferred):
   ```bash
   ssh-keygen -t ed25519 -C "hermes-agent@proxmox" -f ~/.ssh/id_ed25519_proxmox -N ""
   ```

2. **Build JSON template from file** (never pass private key on CLI):
   ```bash
   python3 -c "
   import json
   pk = open('~/.ssh/id_ed25519_proxmox').read().strip()
   puk = open('~/.ssh/id_ed25519_proxmox.pub').read().strip()
   template = {
       'title': 'hermes-agent Proxmox SSH Key',
       'category': 'SECURE_NOTE',
       'fields': [
           {'id': 'notesPlain', 'type': 'STRING', 'purpose': 'NOTES',
            'label': 'notesPlain', 'value': f'Public key:\\n{puk}'},
           {'id': 'private_key', 'type': 'CONCEALED',
            'label': 'private key', 'value': pk}
       ]
   }
   json.dump(template, open('/tmp/op_template.json', 'w'))
   "
   ```

3. **Create and verify**:
   ```bash
   cat /tmp/op_template.json | op item create - --vault Hermes
   # Verify
   op item get "hermes-agent Proxmox SSH Key" --vault Hermes --reveal
   ```

### Retrieval in Scripts

```bash
pk=$(op read 'op://Hermes/hermes-agent Proxmox SSH Key/private key')
tmpkey=$(mktemp)
echo "$pk" > "$tmpkey"
chmod 600 "$tmpkey"
ssh -i "$tmpkey" root@10.0.20.91 "hostname"
rm -f "$tmpkey"
```

### Note on Service Accounts
Hermes' `OP_SERVICE_ACCOUNT_TOKEN` is scoped to specific vaults. If `op vault list` shows only "Hermes", that's the only vault accessible. To add access to other vaults, update the 1Password integration's vault grants in the 1Password admin console.
