# 主机密钥验证

Tessera 采用首次使用即信任（TOFU）：首次连接一台服务器时会固定它的主机密钥，
之后每次连接都会对照这个固定项检查。

## 首次连接

首次连接到某台服务器时，Tessera 会用**未知主机**面板拦下，显示：

- 端点（地址和端口），
- **服务器指纹**（SHA-256，兼容 OpenSSH），
- **密钥类型**。

请对照你信任的来源核对指纹 —— 你的服务商控制台，或在服务器上运行：

```sh
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
```

然后轻点**信任并连接**将其固定，或轻点**取消**中止。在一台主机的密钥被信任
之前，Tessera 不会在它上面安装密钥，[文件](https://bambouville.com/docs/zh-hans/files/)面板也会要求你先打开一个
终端会话。

信任一次即覆盖整条连接：mosh 主机的信任搭载在它的引导 SSH 上，因此 tmux
侧信道不会再次提示。当你通过[接力](https://bambouville.com/docs/zh-hans/continuity/)到达，或通过
[附近设置](https://bambouville.com/docs/zh-hans/nearby-setup/)导入一台主机时，该面板还会说明这个密钥是否与你
另一台设备信任的一致 —— 而当它*不同*时，面板会把**不要连接**放在最前面。
这些是有用的背景信息，但固定仍然是每台设备各自做出的明确决定；
**信任绝不同步**。

![未知主机面板，显示服务器地址、SHA-256 指纹、密钥类型 ssh-ed25519，以及「信任并连接」和「取消」按钮。](https://bambouville.com/docs/assets/img/unknown-host.png)

*首次使用即信任的提示。这里显示的指纹就是你要拿去和服务器比对的那个。*


## 主机密钥发生变更

如果某台服务器的密钥与已固定的不一致，Tessera 会显示**主机密钥已变更**，附上
经典的「警告：远程主机的标识已改变！」提示、新旧两个指纹，以及**信任** /
**取消**按钮。

除非你知道它为什么变了，否则请把这当作一次可能的中间人攻击 —— 合理的原因包括
重装了服务器、更换了服务器，或有意轮换了它的主机密钥。

## 已知主机页面

**已知主机**页面（iPad 上在侧边栏；iPhone 上在密钥标签的选择器后面）列出每一个
已固定的密钥：主机、算法、添加时间和状态。筛选按钮可以缩小列表范围：

- **已验证** —— 已固定且匹配，
- **已过时** —— 90 天未见到，
- **已变更** —— 见到了不同的密钥；红色横幅会标出这处不匹配。

展开某一行即可查看它的指纹，并执行**拷贝指纹**、**接受新密钥**（在一次合理的
变更之后）或**移除**该固定项。移除固定项意味着下一次连接会再次被当作首次连接。

固定项存储在应用 Application Support 目录下的 `known_hosts.json` 中，以
`address:port` 为键，使用兼容 OpenSSH 的 SHA-256 指纹。

## 导出与导入

页面头部的**导出**按钮会把你的固定项写成一个标准的 OpenSSH `known_hosts`
文件 —— 只含公开的主机密钥和指纹，不含任何机密 —— 可供任何其他 SSH 客户端
使用。**导入**会读取一个 `known_hosts` 文件，并在任何内容被合并之前展示它
找到的每一个固定项供你审阅，由你决定哪些进来；如果文件里没有可用的内容，它
会明说（「未找到可导入的主机固定项。」）。两者在 iPad 和 iPhone 上都可用。

![已知主机页面，带有全部、已验证、已过时和已变更筛选按钮，一张列出已固定主机的表格显示密钥算法、添加时间和状态，其中一行已展开，露出它的指纹以及拷贝和移除按钮。](https://bambouville.com/docs/assets/img/known-hosts.png)

*每一台已固定的主机，都可以按状态筛选。展开一行即可看到它存储的指纹。*
