kr项目架构全景图:从CLI到守护进程、SSH Agent与PGP签名一文读懂
【免费下载链接】krDEPRECATED A dev tool for SSH auth Git commit/tag signing using a key stored in Krypton.项目地址https://gitcode.com/gh_mirrors/kr/kr点击查看免费下载kr是一个让手机Krypton App代替电脑保管 SSH 密钥的开发者工具krCLI 负责配对与日常操作后台守护进程krd以 SSH Agent 身份拦截签名请求krssh代理 SSH 连接并验证主机身份krgpg则把 Git commit/tag 签名转发到手机完成 PGP 签名。全文带你从 CLI 到守护进程一图读懂 kr 的 SSH 认证 Git 签名架构。⚠️ 先说明该项目已标记为DEPRECATED见 README.md后续开发转移至新的 akr 仓库。本文基于其 Go 源码解读架构设计依然对理解手机托管密钥 本地 Agent 代理这类系统很有参考价值。1. 一分钟认识 kr 是干什么的传统做法是在电脑上生成 SSH 密钥对私钥躺在~/.ssh/里Git 签名则依赖本机 gpg 密钥环。一旦电脑失窃或中毒私钥就可能泄露。kr 的思路是把私钥整个挪到手机里 私钥只存在于 Krypton 手机 App 的安全存储中永不出手机 电脑端只保留公钥所有用私钥签名的动作都会实时转发到手机由用户逐次批准 通信链路全程加密配对密钥由本地与手机双方协商生成。整个系统由4 个可执行文件组成入口代码都在src/目录下可执行文件一句话职责源码入口kr命令行客户端配对、查看公钥、配置 Git 签名、上传公钥到各云src/kr/kr.gokrd守护进程daemon内置 SSH Agent 控制服务器系统的总机src/krd/main.gokrsshSSH 代理客户端劫持 SSH 握手拿到真实主机名防止中间人欺骗src/krssh/main.gokrgpggpg 兼容前端Git 提交/标签签名请求转发到手机src/krgpg/main.go构建规则见 Makefile一条make install即可编译并安装全部 4 个二进制到$(PREFIX)/bin。2. 架构全景一次签名请求的完整旅程先看整体协作关系数据流向┌────────────────────────── 计算机 ──────────────────────────┐ │ ssh 客户端 ──▶ krssh解析主机密钥──▶ hostAuth socket │ │ git commit ──▶ krgpg ──────────────┐ │ │ kr 命令 ───────────────────────────┤ Unix socket (HTTP) │ │ ▼ │ │ ┌──── krd 守护进程 ────┐ │ │ │ ControlServer │ │ │ │ (配对/查询 REST) │ │ │ │ SSH Agent 服务 │ │ │ │ EnclaveClient ◀───┼── 加解密/队列 │ │ └────────┬────────────┘ │ └─────────────────────────────┼─────────────────────────────┘ AWS SQS 队列 SNS 推送加密密文 ▼ Krypton App私钥所在地人工批准一次git commit签名的旅程大致是Git 调用配置好的krgpg做分离签名krgpg通过 Unix socket 把 commit 内容发给krdkrd的EnclaveClient加密消息经 AWS SQS/SNS 发到手机手机弹出批准界面用户确认后返回签名krgpg把 ASCII armor 签名写回 stdoutGit 完成签名提交。SSH 认证是同样的链路只是请求方换成了SSH Agent 协议签名目标是登录会话而非 commit。3. krd 守护进程系统的总机启动入口 src/krd/main.go 非常精炼启动后同时监听 3 个 Unix socketSocket作用谁在连它krd.sock控制内嵌 HTTP 服务暴露 REST 接口kr客户端、krgpgkrd-agent.sockAgent标准 SSH Agent 协议[PROTOCOL.agent]ssh 客户端通过SSH_AUTH_SOCKhostAuth.sock接收 krssh 上报的主机密钥信息krssh控制服务器 src/daemon/control/server.go 注册了 4 个路由/version版本检查、/pairGET 查询 / PUT 发起配对 / DELETE 解除配对、/enclave转发任意签名请求到手机、/ping。也就是说krCLI 与守护进程之间用的正是HTTP over Unix socket这种简单可靠的通信方式。Agent 服务由 src/daemon/ssh_agent.go 的ServeKRAgent启动每个连接一个 goroutine 处理。4. SSH Agent 实现拦截签名支持优雅降级Agent 层src/daemon/ssh_agent.go实现了完整 SSH Agent 接口的核心两点List直接从本地缓存的 Profile 返回 Krypton 公钥不必惊动手机Sign关键路径src/daemon/ssh_agent.go。收到签名请求后先查原始终端 AgentSSH_AUTH_SOCK指向的其他 agent命中的本地密钥直接用否则从签名负载中解析出 session ID关联 krssh 上报的主机认证信息让你确认我在登录哪台机器通过EnclaveClient.RequestSignature把签名请求发往手机等待用户批准手机拒绝 → 通知 krssh 杀掉会话超时 → 自动回退到本地密钥保证不卡住工作流。这种主路径手机、失败回退本地的降级策略是 kr 可用性设计的亮点。5. krssh 代理客户端为什么手机知道你在登录哪台主机这是架构里最有意思的一环。SSH 客户端默认只显示Host key verification failed之类的模糊提示krssh 解决到底在连哪台机器的问题作为ProxyCommand插入 SSH 链路透明转发两端字节流src/krssh/main.go解析 SSH 数据包src/krssh/main.go在密钥交换回复中提取服务端主机密钥 签名连同主机名打包成HostAuth经hostAuth.sock上报给 krdsrc/krssh/main.go于是手机批准弹窗能显示真实主机名并且用户还可以在 Krypton 里钉住主机公钥——如果下次握手的公钥不一致krd 会回传HOST_KEY_MISMATCHkrssh 直接终止会话src/krssh/main.go。Agent 侧的验证逻辑在 src/daemon/ssh_agent.go用上报的主机公钥验证它对 session ID 的签名确属同一会话才把HostAuth附进签名请求。6. krgpg伪装成 gpg 的 Git 签名前端krgpg/main.go 的策略是能拦截就拦截拦不住就转发当 Git 以--bsaudetach-sign ascii armor方式调用时进入 Krypton 签名路径tree开头 → 解析 commitparent/author/committer/message→GitSignRequest发给手机src/krgpg/main.goobject开头 → 解析 tag 对象同样的流程src/krgpg/main.go其他 gpg 用法一律透传给本机真实gpgsrc/krgpg/main.goKrypton 签名失败时也会回退到本地 gpg 密钥环签名成功后伪造一行[GNUPG:] SIG_CREATED状态输出让 Git 认为签名顺利完成。配套的kr codesign命令定义于 src/kr/kr.go负责把git config的签名程序指向krgpg并提供on/off/test/uninstall子命令管理自动签名。7. Enclave 通信层加密、队列与推送真正对接手机的是EnclaveClientsrc/daemon/enclave/enclave.go核心职责配对Pair()生成PairingSecret含端到端加密密钥手机扫码后双方激活配对密钥经 src/common/persistance/ 持久化到~/.kr收发所有消息先经配对密钥加密再通过 src/common/transport/transport.go 的AWSTransport发送——底层是AWS SQS 队列双向SNS 推送唤醒手机 App请求追踪用 LRU 缓存维护请求 ID → 回调映射支持 ACK用户已收到提醒后延长等待超时离线容错手机还没回传解包密钥时出站消息进入outgoingQueue排队密钥就位后自动补发。协议细节配对密钥派生、请求/响应结构、超时策略集中在 src/common/protocol/ 目录pair.go、request.go、timeouts.go、host_auth.go。8. kr CLI 与部署运维kr客户端的全部命令注册在 src/kr/kr.go常用的几类命令作用kr pair/kr unpair与手机配对终端显示二维码/ 解除配对kr mekr me pgp打印 SSH / PGP 公钥kr copy、kr github、kr aws、kr gcp等拷贝公钥并自动打开对应平台添加密钥的设置页kr codesign开启/关闭/测试 Git 自动签名kr restart/kr upgrade/kr uninstall守护进程运维适配 apt / yum / yaourtkr transfer换手机时把服务器访问权移交给新设备部署方面Linux 依赖 systemd 拉起 krdkr restart通过nohup krd兜底见 src/kr/kr_unix.go打包脚本在 install/os.sh、install/rpm/kr.spec、install/debian/macOS 使用 LaunchAgents 自启动plist 见 install/macos/share_ext/co.krypt.krd.plist调试用环境变量KR_SILENCE_WARNINGS、KR_LOG_LEVEL等由kr env输出定义在 src/kr/kr.go。9. 架构小结值得借鉴的 4 个设计点职责分离CLI / 守护进程 / SSH 代理 / GPG 前端各司其职全部通过本地 Unix socket 解耦任何一环都可以单独测试src/下各模块自带_test.go私钥永不出手机所有签名都是请求-批准-返回的远程调用计算机端只持有公钥与缓存 Profile可用性降级SSH 签名超时回退本地 agentGit 签名失败回退本地 gpg工具链不会成为单点故障主机身份前置校验krssh 把你在登录哪台机器变成手机批准弹窗里的显式信息并支持公钥钉扎防 MITM。核心源码路径速查守护进程入口src/krd/main.go控制服务器src/daemon/control/server.goSSH Agentsrc/daemon/ssh_agent.go手机通信层src/daemon/enclave/enclave.go传输层AWS SQS/SNSsrc/common/transport/transport.go协议与配对src/common/protocol/pair.go持久化src/common/persistance/file_persister.goSSH 代理src/krssh/main.goGit 签名前端src/krgpg/main.go 再次提醒kr 已停止维护DEPRECATED新项目建议关注其继任者 akr但密钥托管到移动设备 本地 Agent 代理签名的这套架构模式至今仍是很好的学习样本。赞分享【免费下载链接】krDEPRECATED A dev tool for SSH auth Git commit/tag signing using a key stored in Krypton.项目地址https://gitcode.com/gh_mirrors/kr/kr点击查看免费下载相关推荐一文读懂 BakaSU 三层架构内核模块、Rust 守护进程与 Compose 管理器全景拆解一文读懂 BakaSU 三层架构内核模块、Rust 守护进程与 Compose 管理器全景拆解 BakaSU 是一款基于 KernelSU 的 Android深度拆解 tty7 源码从 CLI 到守护进程的 6 Crate 纯 Rust 架构全景图深度拆解 tty7 源码从 CLI 到守护进程的 6 Crate 纯 Rust 架构全景图 tty7 是一个纯 Rust 编写的终端工作台采用 GPU 渲染SSH Agent实战kr如何拦截签名请求并转发到手机一键授权SSH Agent实战kr如何拦截签名请求并转发到手机一键授权 为什么要把 SSH 授权交给手机 传统 SSH 登录依赖存放在电脑上的私钥文件如 ~/.s创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考