密码管理器 — Mac + Windows 统一配置与 CLI 自动化
在两台机器上配置 1Password / Bitwarden,并集成 SSH · Git · dotfiles 自动获取功能。
密码管理器在两个场景中能创造最大价值——(1) 浏览器自动填充,(2) 从终端/dotfiles/CI 自动获取密钥。如果你只用到 (1),你只发挥了一半的潜力。配置好 (2),就不需要再把明文密钥写入 .env,新机器也能用一条命令完成引导。
我认为密码管理器的真正价值不在于记住密码,而在于彻底消除明文密钥的存在理由。以前 .env 文件散落在各台机器上;如今通过 op run 在运行时注入密钥,由于密钥从不落地为明文文件,泄露风险从根本上被消除。
本指南对比 1Password(推荐)· Bitwarden,然后演示 Mac + Windows 统一配置流程。
TL;DR
| 项目 | 1Password | Bitwarden |
|---|---|---|
| 价格 | 付费(按月) | 免费 + 付费套餐 |
| 安全模型 | 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-cli1.2 安装(Windows)
winget install --id AgileBits.1Password -e
winget install --id AgileBits.1Password.CLI -e1.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:
- Name:
personal-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:
- Title:
Anthropic API Key - Credential:
sk-ant-... - Tags:
dev、api
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.CLI5.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(值只存在于保险库中,模板文件是安全的)。
验证
op vault list或bw list folders— 认证正常ssh -T git@github.com— 1Password SSH agent 通过一次 Touch ID 认证git commit -S -m "test"→git log --show-signature→ 「Good signature」op run --env-file=.env.tmpl -- env | grep MY_KEY→ 注入了真实值- 在 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 可访问哪些保险库。缺少权限时命令会报错。
参考资料
- mac/dotfiles — chezmoi + 1Password 集成
- multi-os/file-sync — 通过 Syncthing 同步
.env.tmpl等非密钥文件 - 1Password CLI(官方)
- Bitwarden CLI
- Vaultwarden(自托管)
更新日志
- 2026-05-12:初稿。1Password vs Bitwarden 对比 + SSH 集成 · Git 签名 · 环境变量自动注入 · 双机工作流 + 五个故障排查案例。