devAlice
← Multi-OS

密码管理器 — Mac + Windows 统一配置与 CLI 自动化

在两台机器上配置 1Password / Bitwarden,并集成 SSH · Git · dotfiles 自动获取功能。

密码管理器在两个场景中能创造最大价值——(1) 浏览器自动填充,(2) 从终端/dotfiles/CI 自动获取密钥。如果你只用到 (1),你只发挥了一半的潜力。配置好 (2),就不需要再把明文密钥写入 .env,新机器也能用一条命令完成引导。

我认为密码管理器的真正价值不在于记住密码,而在于彻底消除明文密钥的存在理由。以前 .env 文件散落在各台机器上;如今通过 op run 在运行时注入密钥,由于密钥从不落地为明文文件,泄露风险从根本上被消除。

本指南对比 1Password(推荐)· Bitwarden,然后演示 Mac + Windows 统一配置流程。

TL;DR

项目1PasswordBitwarden
价格付费(按月)免费 + 付费套餐
安全模型E2E + Secret Key(设备认证)E2E + 主密码
CLI 质量✅ 优秀(op CLI + 生物识别)良好(bw CLI)
SSH 集成✅ 原生 SSH agent手动
Git 签名✅ 通过 SSH 密钥签名提交手动
移动端 / 家庭共享
自托管✅(Vaultwarden)

推荐:1Password(开发者工作流集成更完善)。对价格敏感或需要自托管,选 Bitwarden。

1. 1Password 配置

1.1 安装(Mac)

brew install --cask 1password 1password-cli

1.2 安装(Windows)

winget install --id AgileBits.1Password -e
winget install --id AgileBits.1Password.CLI -e

1.3 首次登录

桌面应用 → 登录(邮箱 + Secret Key + 主密码)。Secret Key 来自注册时的 PDF 或其他已登录设备。

1.4 CLI ↔ 桌面集成

桌面应用 → Settings → Developer → 「Integrate with 1Password CLI」 ✅。这是关键步骤 — op 命令通过 GUI 生物识别(Touch ID / Windows Hello)完成认证。

验证:

op vault list
# 通过 Touch ID/Windows Hello 解锁,无需输入密码

2. SSH 密钥集成(1Password)

传统方式是将 SSH 密钥以明文文件存放在 ~/.ssh/id_ed25519。1Password 内置了 SSH agent — 密钥存储在保险库中,每次使用时通过生物识别授权。

2.1 生成密钥

1Password 桌面 → 「+」→ SSH Key:

  • Namepersonal-ed25519
  • Algorithm:Ed25519
  • 自动生成密钥对

2.2 启用 SSH Agent

桌面 → Settings → Developer → 「Use the SSH agent」

  • macOS:自动添加到 ~/.ssh/config
  • Windows:自动设置环境变量

2.3 向 GitHub 注册公钥

1Password 保险库 → 对应密钥条目 → 复制「Public key」→ GitHub → Settings → SSH and GPG keys → New SSH key。

2.4 测试

ssh -T git@github.com
# Hi yourname! You've successfully authenticated...
# (一次 Touch ID / Windows Hello 确认)

~/.ssh/ 中不再存放明文密钥文件。新机器只需登录 1Password,SSH 即可立即工作。

3. Git 提交签名(使用 SSH 密钥)

比 GPG 更简单,复用同一把密钥:

git config --global gpg.format ssh
git config --global user.signingkey "ssh-ed25519 AAAA... your-comment"
# 从 1Password 条目中复制公钥
git config --global commit.gpgsign true

之后 git commit → 1Password 生物识别 → 自动签名。在 GitHub Settings → SSH and GPG keys → 「Add new signing key」中注册相同公钥。

4. .env / API 密钥集成

不再使用明文 .env,改为从 1Password 获取:

4.1 添加密钥

1Password → 「+」→ API Credential:

  • TitleAnthropic API Key
  • Credentialsk-ant-...
  • Tagsdevapi

4.2 CLI 获取

op item get "Anthropic API Key" --fields credential
# sk-ant-...

4.3 op run — 自动注入

.env.tmpl 中仅包含占位符:

ANTHROPIC_API_KEY=op://Private/Anthropic API Key/credential
GITHUB_TOKEN=op://Private/GitHub/token

运行:

op run --env-file=.env.tmpl -- npm run dev
# 命令以真实值作为环境变量运行

.env.tmpl 可以安全提交(只包含引用)。实际密钥始终留在保险库中。

4.4 chezmoi 集成

参见 mac/dotfiles,chezmoi 模板:

# dot_env.tmpl
export ANTHROPIC_API_KEY={{ onepasswordRead "op://Private/Anthropic/credential" }}

chezmoi apply 自动注入 → 在新机器上生成明文 .env

5. Bitwarden — 免费替代方案

5.1 安装

# Mac
brew install --cask bitwarden bitwarden-cli
 
# Windows
winget install Bitwarden.Bitwarden
winget install Bitwarden.CLI

5.2 登录 + 会话

bw login email@example.com
# 主密码 → 返回 API Key
 
# 导出会话
export BW_SESSION="$(bw unlock --raw)"
# 或在 .zshrc 中定义函数:
function bwl { export BW_SESSION="$(bw unlock --raw)"; }

5.3 读取密钥

bw get item "Anthropic API"
bw get password "Anthropic API"
bw get notes "Some Long Note"

JSON 输出,与 jq 配合使用效果很好:

bw get item "GitHub" | jq -r '.login.password'

5.4 不足之处

  • 无 SSH agent 集成(可手动存储密钥,但不会自动使用)
  • 不支持自动 Git 提交签名
  • 生物识别集成依赖操作系统/应用(不如 1Password 流畅)

5.5 自托管(Vaultwarden)

# Mac/Linux docker
docker run -d \
  --name vaultwarden \
  -v ./vw-data:/data \
  -p 8000:80 \
  vaultwarden/server:latest

在家庭服务器上运行,通过 bw config server http://your-server:8000 切换。Bitwarden 客户端无需任何修改即可使用。

6. 双机工作流

在 Mac 上添加的密钥可立即在 Windows 上使用(保险库同步是自动的):

# 在 Mac 上添加新密钥
op item create --category="API Credential" \
  --title="New Service" \
  --vault="Private" \
  credential="sk-..."
 
# 立即在 Windows pwsh 中使用
op item get "New Service" --fields credential

通过 Git/Syncthing 在两台机器间共享 .env.tmpl(值只存在于保险库中,模板文件是安全的)。

验证

  1. op vault listbw list folders — 认证正常
  2. ssh -T git@github.com — 1Password SSH agent 通过一次 Touch ID 认证
  3. git commit -S -m "test"git log --show-signature → 「Good signature」
  4. op run --env-file=.env.tmpl -- env | grep MY_KEY → 注入了真实值
  5. 在 Windows 上登录 1Password CLI → 可访问相同保险库

故障排查

op CLI 无法与 GUI 配对

  • 桌面 → Settings → Developer → 「Integrate with 1Password CLI」未开启
  • 桌面必须处于运行状态(已登录)
  • macOS:系统设置 → 安全性 → 授予生物识别权限

Bitwarden 会话过期

默认闲置 30 分钟后锁定。重新运行 bw unlock --raw。不要在 .zshrc 中配置自动解锁 — 主密码会暴露在环境变量中。

两个 SSH agent 冲突(1Password 与 ssh-agent)

~/.ssh/config 中固定:

Host github.com
  IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"

Windows 端设置 SSH_AUTH_SOCK

op run 引号处理异常

改用 op inject(更清晰):op inject -i .env.tmpl -o .env.runtime && source .env.runtime。会临时创建明文文件 — 用完后删除。

家庭/团队保险库权限问题

1Password Business → 按保险库设置权限。用 op vault list 检查 CLI 可访问哪些保险库。缺少权限时命令会报错。

参考资料

更新日志

  • 2026-05-12:初稿。1Password vs Bitwarden 对比 + SSH 集成 · Git 签名 · 环境变量自动注入 · 双机工作流 + 五个故障排查案例。