开源 · 兼容 WireGuard®
让你的 VPN 密钥无法被复制。
Latchwire 将你的 WireGuard 私钥保存在 YubiKey 内部。密钥在卡内生成,绝不离开卡片。协议和服务器都无需改变。没有卡,就没有隧道。
预发布版:面向 macOS 和 Linux 的命令行工具
工作原理
在 YubiKey 上生成密钥
使用固件 5.7 或更高版本的 YubiKey 运行 keygen。密钥在卡内的 PIV 保留槽位(82–95)中生成,其他槽位保持不变。出厂设置的卡会先更换 PIN 和 PUK。
把公钥添加到服务器
服务器看到的是一个普通的 WireGuard 对等端,因此无需插件或更新。Latchwire 面向 OPNsense、pfSense、Linux 和 MikroTik 等标准服务器设计。目前只在 Linux 容器中用测试服务器做过端到端测试。
输入 PIN 并连接
PIN 直接发送给卡片,不会被保存。通常只需输入一次;系统休眠后或其他程序重置卡片后会再次询问。拔出卡片,隧道就会关闭。目标是两秒内完成;用模拟卡测试时约为一秒。
传统 WireGuard 与 Latchwire 对比
| 问题 | 传统 WireGuard | Latchwire |
|---|---|---|
| 私钥在哪里? | 电脑上的一个文件里 | YubiKey 内部 |
| 能被复制吗? | 能,而且不留痕迹 | 不能。密钥无法从卡中取出 |
| 笔记本被盗,卡不在身边? | 必须在每台服务器上更换密钥 | 磁盘上的任何内容都无法完成握手 |
| 电脑上有恶意软件? | 它可以窃取密钥,日后继续使用 | 卡插着时它可以使用隧道,但无法带走密钥 |
| 备份 | 文件的副本 | 第二把 YubiKey,作为第二个对等端添加到服务器 |
| 服务器端 | 标准 WireGuard | 相同:标准 WireGuard |
| 成熟度 | 成熟,有官方客户端 | 预发布版 |
硬件
目前代码中只有下方第一项。标签说明了每一项的状态。
YubiKey 5
v1支持 X25519 的 PIV,固件 5.7 或更高版本。密钥在卡内生成,绝不离开卡片。目前的测试使用模拟卡,真实卡片的检查尚未完成。
OpenPGP 卡
即将支持计划在 v1 之后紧接着支持。尚未实现。
PKCS#11 与 HSM
即将支持计划在 v1 之后紧接着支持,面向支持 X25519 的设备。尚未实现。
TPM、Secure Enclave、FIDO2
远期规划安全等级较低,不在 v1 范围内。密钥由硬件加密,但使用时会暴露在内存中,因此这些设备永远不会声称密钥无法被复制。
安全
这项声明针对的是密钥被取走,而不是密钥被使用。以下是它涵盖和不涵盖的范围。
可以防护
- 从磁盘或备份中复制密钥:私钥从不写入这些位置
- 笔记本被盗或被制作磁盘镜像,而卡不在其中
- 包含私钥的配置文件:Latchwire 会拒绝它们
- 并非在卡内生成的密钥:Latchwire 会拒绝它们
- 开启断网保护(kill switch)时流量绕过隧道,具体限制见威胁模型
无法防护
- 卡已插入且已输入 PIN 时,以你的身份运行的恶意软件:它可以使用卡和隧道,且无需触摸
- 输入 PIN 后能够访问卡的其他程序;在某些系统上还包括其他本地用户
- 已被攻破的 root 账户或内核
- 笔记本连同卡和 PIN 一起被盗
- 读取进程内存:会话密钥和一项缓存的秘密值位于内存中,也可能进入交换空间。它们不是私钥,没有卡也无法完成握手
- 伪造的令牌:Latchwire 信任卡片报告的内容,目前还不验证证明(attestation)
项目状态
Latchwire 是预发布软件。以下是目前已有的内容和已检查的内容。
- 已测试
Linux 命令行与网络
在特权容器中用软件密钥和测试服务器做过端到端测试。
- 未验证
macOS 命令行与网络
已实现。手动检查尚未完成。
- 未验证
真实 YubiKey 的行为
自动测试使用模拟卡。真实卡片的检查尚未完成。
- 未就绪
Windows
尚未实现。Windows 版本目前无法编译。
- 未就绪
桌面应用
开发中。目前只有命令行工具。
- 尚无
签名版本与软件包
尚无发布版本,需要从源码构建。
- 尚无
独立安全审查
尚未进行过独立审查。
安装
从源码构建。目前还没有软件包或签名的二进制文件,此安装方式仅用于测试。
需要 Go 1.25 或更高版本,以及固件 5.7 或更高版本的 YubiKey 5。在 Linux 上构建时还需要 C 编译器和 libpcsclite-dev,运行时需要 pcscd。
构建
git clone https://github.com/Kodviva/latchwire
cd latchwire
go build -o latchwire ./cmd/latchwire
sudo install -o root -m 0755 latchwire /usr/local/bin/latchwire
分别在各自的终端中启动守护进程和代理
sudo latchwire daemon
latchwire agent
生成密钥并连接
latchwire devices
latchwire keygen --serial <serial> --address <tunnel-ip>
sudo latchwire add office office.conf
latchwire up office
keygen 会输出一个用于服务器的 [Peer] 块。隧道文件是普通的 WireGuard 文件,用 KeyRef 和 PublicKey 代替 PrivateKey。
计划提供 Homebrew、.deb、.rpm 和 Microsoft Store 软件包,但目前都还没有。
路线图
核心已实现
面向 macOS 和 Linux 的命令行客户端
完整网络功能已实现
全局隧道、DNS、断网保护、按需连接和允许用户。已在 Linux 上测试;macOS 待检查
真实硬件检查待完成
按公开清单检查真实 YubiKey 和 macOS 网络
Windows进行中
服务、网络层和断网保护
桌面应用与翻译进行中
面向 macOS、Windows 和 Linux 的桌面应用
签名版本计划中
Homebrew、直接下载、.deb、.rpm、Microsoft Store