Skip to content

feat(ssh): 完整支持 Mihomo 认证与主机密钥配置#48

Draft
MiChongs wants to merge 1 commit into
codex/protocol-registration-validationfrom
codex/protocol-ssh-full
Draft

feat(ssh): 完整支持 Mihomo 认证与主机密钥配置#48
MiChongs wants to merge 1 commit into
codex/protocol-registration-validationfrom
codex/protocol-ssh-full

Conversation

@MiChongs

Copy link
Copy Markdown
Owner

背景

现有 SSH 出站虽然已经通过 russh 建立真实的 direct-tcpip 通道,但配置层与 Mihomo 的 SSH 节点字段并未完整对齐:订阅解析会丢失用户名和数组形式的主机公钥字段,私钥仅被当作文件路径处理,密码与私钥不能按顺序回退,主机公钥校验错误地用指纹子串匹配原始文本,并且已暴露的主机密钥算法及客户端版本字段没有进入实际 SSH 握手。

本提交在独立分支中补齐 SSH 客户端配置链路,确保安全相关字段在注册阶段完成解析和校验,并由 russh 在真实握手及认证过程中执行。

实现内容

  • 完整保留 Clash/Mihomo SSH 节点的 username/userpasswordprivate-keyprivate-key-passphrasehost-keyhost-key-algorithms 字段。
  • 支持 private-key 同时接受 PEM 私钥内容和私钥文件路径;加密私钥通过 private-key-passphrase 解密。
  • 在节点注册阶段解析私钥,错误配置立即返回明确错误,不再延迟到首次网络连接。
  • 对同时配置的私钥与密码采用 Mihomo 一致的认证顺序:先尝试公钥认证,失败后再尝试密码认证。
  • 未配置私钥和密码时保留 SSH none 认证能力,兼容允许无凭据登录的服务端。
  • host-key 解析为真实 SSH 公钥对象,支持授权密钥格式和原始 Base64 公钥,并在握手时执行完整公钥精确比较。
  • 支持 host-key-algorithmsrsaed25519ecdsa 别名及 russh 支持的精确算法名称,配置结果写入 russh::client::Config.preferred.key
  • client-version 写入真实 SSH 客户端标识,并拒绝非 SSH-2.0-*、换行注入及过长配置。
  • keepalive-interval 写入真实会话保活策略;值为零时明确禁用保活。
  • 要求 SSH 用户名非空,并对主机公钥、算法、客户端版本、保活间隔等安全字段执行注册期严格校验。

兼容性

  • 保留旧的 known-hosts 参数作为 host-key 的兼容别名。
  • 未配置 client-version 时使用与 Mihomo 行为相符的 OpenSSH 客户端标识。
  • 原有 SSH 会话复用、断线重连和 direct-tcpip 多路通道实现保持不变。

测试

  • cargo test -p core-outbound --no-fail-fast:419 项通过。
  • cargo test -p core-feeds --no-fail-fast:28 项通过。
  • cargo check --workspace --all-targets:通过。
  • git diff --check:通过。
  • 新增订阅字段保留、主机公钥解析、算法别名展开、未知算法拒绝、客户端版本注入防护,以及全部安全字段注册期校验测试。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant