资讯详情

资讯详情

kr守护进程krd如何工作:单个Go进程管理三类UNIX socket详解

【免费下载链接】krDEPRECATED A dev tool for SSH auth Git commit/tag signing using a key stored in Krypton.项目地址https://gitcode.com/gh_mirrors/kr/kr点击查看免费下载krd 是 kr 工具包的核心守护进程它只是一个常驻的 Go 二进制文件却同时管理三类 UNIX socket——控制通道、SSH agent 通道和主机认证通道让 SSH 登录与 Git 签名请求都能安全地路由到手机上的 Krypton 应用。本文带你逐行看懂这个一进程三 socket的设计。⚠️ 提示kr 项目已标记为 DEPRECATED开发已迁至 akr 项目但 krd 的这套架构设计依然很有参考价值。krd 启动流程一个 main 函数串起三条监听线krd 的入口在 src/krd/main.go启动顺序非常清晰升级本地~/.ssh/config中的旧配置见 src/daemon/sshconfig.go打开通知器并启动通知文件清理协程依次调用DaemonListen()、AgentListen()、HostAuthListen()打开三个 socket用两个 goroutine 分别托管 HTTP 控制服务和 SSH agent 服务主协程阻塞等待退出信号三类 socket 的文件名常量都定义在 src/common/socket/socket.go#L81-L118socket 文件常量角色客户端~/.kr/krd.sockDAEMON_SOCKET_FILENAME控制平面HTTP 风格的命令通道krCLI、krgpg~/.kr/krd-agent.sockAGENT_SOCKET_FILENAMESSH agent响应 List/Sign 等 agent 协议ssh经IdentityAgent配置~/.kr/krd-hostauth.sockHOST_AUTH_FILENAME主机认证接收主机公钥证据krssh代理三个 socket 都放在~/.kr/目录下目录权限 0700并在每次监听前删除可能残留的旧 socket 文件避免上次异常退出导致的address in use。控制 socketkrd.sock守护进程的大脑krd.sock上跑的不是原始 TCP 协议而是一个标准http.ServeMux路由定义在 src/daemon/control/server.go#L44-L52GET /ping健康检查客户端用它判断 krd 是否存活GET /version返回 krd 版本号kr用它检测是否有旧版 krd 仍在运行GET/PUT/DELETE /pair查询、发起、解除手机配对POST /enclave把签名请求SSH 签名、Git commit/tag 签名、hosts 校验转发到enclave最终送达手机这条通道的意义在于kr命令行和krgpgGit 签名接口都不需要各自实现复杂协议只要拨号 发一个 HTTP 请求即可。连接封装在 src/common/socket/socket.go#L153-L171 的DaemonDialWithTimeout中——先pingDaemon探活5 秒超时则报ping timed out探活成功后才真正建连。客户端侧的调用示例见 src/daemon/client/client.go例如RequestKrdVersion()就是拨号后发GET /version。agent socketkrd-agent.sock伪装成 SSH agent把私钥留在手机上这是最巧妙的一个设计。安装时 kr 会往~/.ssh/config写入如下配置模板见 src/kr/sshconfig.go#L28-L36Host * IdentityAgent ~/.kr/krd-agent.sock ProxyCommand /usr/bin/krssh %h %pIdentityAgent是 OpenSSH 7.3 的选项让ssh直接把 krd 当作本地 agent 使用。于是 SSH 认证时发生的事是ssh通过 agent 协议向 krd 发出Sign请求要签的数据是 SSH 会话 IDkrd 的 Agent.Sign 先尝试回落到你原有的SSH_AUTH_SOCKwithOriginalAgent见 src/daemon/ssh_agent.go#L36-L50如果本地已有同一把公钥就直接用行为透明否则把SignRequest通过 enclave 通道发到手机由用户在 Krypton App 上点允许或拒绝签名原样返回给 ssh私钥从未离开手机agent 服务的主循环在 ServeKRAgent每个新连接交给一个 goroutine 执行agent.ServeAgent互不阻塞。 顺带一提krd 还有一套基于~/.kr/notify/krd-notify.log-*文件的旁路通知机制src/common/socket/notify.go因为 SSH 协议本身没有通道回传手机已批准/已拒绝这类消息krd 就把提示写进通知文件由krssh侧的读取协程实时打印到终端。hostauth socketkrd-hostauth.sock给主机身份拍照存证第三个 socket 专门服务于 krssh 这个 SSH 代理。流程是krssh作为ProxyCommand启动双向透传 SSH 流量同时旁路解析 SSH 包当解析到 key exchange 的 KEX 应答报文含主机公钥 签名见 src/krssh/main.go#L65-L88 的tryParse就组装成一个HostAuthJSON通过HostAuthDial()拨号krd-hostauth.sock把它发给 krdsrc/krssh/main.go#L55-L63krd 收到后进入 onHostAuth用主机公钥验证签名写入最近的会话记录并唤醒正在awaitHostAuthFor等待的签名流程这样用户手机上批准签名时看到的就不只是某台机器要签名而是这台机器的真实公钥指纹——即使有人伪造了主机名签名请求里携带的主机证据也会暴露不匹配krd 会通知krssh直接终止会话HOST_KEY_MISMATCH。单进程如何稳住三条线并发模型与自愈看懂三个 socket 后再看 main.go 的整体并发结构就一目了然了main 协程 ├── goroutine: controlServer.Start() HandleControlHTTP(daemonSocket) ├── goroutine: daemon.ServeKRAgent(enclaveClient, agentSocket, hostAuthSocket) │ └── 内部还有 goroutine 循环 Accept hostauth 连接 └── 阻塞 -stopSignalSIGTERM/SIGKILL/...收到后 controlServer.Stop()几个工程细节值得学习信号统一收口signal.Notify监听os.Interrupt、SIGTERM等退出前先停 enclave 客户端保证配对状态干净落盘见 src/krd/main.go#L90-L96故障自愈客户端拨号失败时会自动pkill krd并用nohup krd重启后重试见 src/common/socket/socket_unix.go#L15-L34系统级托管Linux 下用 systemd 单元模板见 install/systemd-service-as-current-user.shRestarton-failure按当前用户运行macOS 下用 LaunchAgentinstall/macos/share_ext/co.krypt.krd.plist配合make start一键装好Makefile#L42-L47常见问题速查现象原因与处理Could not connect to Krypton daemonkrd 没在运行执行kr restart即可ping timed outkrd 卡死或版本过旧客户端会自动尝试重启 krdAn old version of krd is still running新旧 krd 共存kr restart后重试终端出现Krypton ▶ Requesting SSH authentication from phone正常工作流等待你在 Krypton App 中批准关键源码文件导航守护进程入口src/krd/main.gosocket 路径与拨号逻辑src/common/socket/socket.go自动重启逻辑Linux/FreeBSDsrc/common/socket/socket_unix.go控制服务与 HTTP 路由src/daemon/control/server.goSSH agent 实现src/daemon/ssh_agent.gokrssh 代理与主机证据采集src/krssh/main.gokrgpg Git 签名接口src/krgpg/main.go客户端请求封装src/daemon/client/client.go通知文件机制src/common/socket/notify.go总结krd 用一个 Go 进程 三个职责分离的 UNIX socket把控制命令、SSH agent、主机证据回传三条数据流解耦CLI 工具走 HTTP 风格控制面ssh 走标准 agent 协议主机验证走轻量 JSON 通道。三者共享同一个 enclave 客户端最终都汇聚到手机端的 Krypton App 做人工批准——这正是私钥永不离开手机这一安全模型的工程落点。赞分享【免费下载链接】krDEPRECATED A dev tool for SSH auth Git commit/tag signing using a key stored in Krypton.项目地址https://gitcode.com/gh_mirrors/kr/kr点击查看免费下载相关推荐fail2ban.client.csocket 源码解析Fail2Ban 客户端与守护进程的 Unix Socket 通信协议fail2ban.client.csocket 源码解析Fail2Ban 客户端与守护进程的 Unix Socket 通信协议 导读 fail2ban.cli网络安全运维microduck 机器人整体架构解析七个守护进程、Unix Socket 控制面与更新安全路径microduck 机器人整体架构解析七个守护进程、Unix Socket 控制面与更新安全路径 本文基于 docs/design/architecture.机器人嵌入式具身智能智能硬件明日方舟工具箱你的终极干员培养助手快速规划精英化材料明日方舟工具箱你的终极干员培养助手快速规划精英化材料 如果你是明日方舟玩家是否经常为计算干员精英化材料而头疼是否在公开招募时犹豫不决现在 明日方舟工创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →