# キー

**キー**ページ（iPad ではサイドバー、iPhone では「キー」タブ）で SSH キーを管理
します。秘密鍵の実体があるのは iOS のキーチェーンの中だけで、Tessera が自身の
データベースに保存するのは公開されたメタデータ（名前、フィンガープリント、使用
状況）だけです。

## キーの生成

**+ 生成**をタップして、アルゴリズムを選びます。

- **Ed25519** — 「高速で現代的な既定値」。キーチェーンに保存されるソフトウェア
  キーで、復旧ファイルに書き出して別のデバイスへ移せます。
- **P-256 Secure Enclave キー** — 「デバイスに紐づく」。Secure Enclave の中で
  生成され、**そこから出ることはありません**。このキーは書き出しも、他のデバイス
  への移動もできません。デバイスを失えばキーも失われます — 別の認可済みキーを
  どこかに用意しておいてください。

RSA の生成には対応していません。
[トラブルシューティング](https://bambouville.com/docs/ja/troubleshooting/#rsa-キーには対応していません)を
参照してください。

## キーの読み込み

**読み込む**をタップして、OpenSSH の秘密鍵ファイル（1 MB まで）を選びます。
ファイルがパスフレーズで保護されている場合、そのパスフレーズは復号のために一度
だけ使われ、保持されません。

- 読み込めるのは **Ed25519** だけです。現在の SSH スタックは非推奨の RSA/SHA-1
  署名しか提示できないため、RSA の読み込みは無効です。代わりに Ed25519 を使用して
  ください。
- 画面がキャプチャされたときやアプリがバックグラウンドに移ったとき、読み込み用の
  シートは自動的に隠れます（「秘密鍵の読み込みを非表示」）。

## 生体認証による保護

どのキーにも**生体認証またはパスコードを要求**のトグルがあります。オンにすると、
Tessera がそのキーにアクセスするたびに Face ID / Touch ID かデバイスのパスコード
が必要になります。ソフトウェアの Ed25519 キーでは、キーチェーンの境界で iOS が
これを強制します。P-256 Secure Enclave キーでは、鍵の実体が Secure Enclave の外に
出ることはなく、使うたびに Tessera 自身が認証を強制します — この設定を後から
変更できるのはそのためです。変更できない**必須**のタグが付くのは、この設定が
できるようになる前に作成されたキーだけです。

### 連続接続の認可

**設定 → セキュリティ → キーによる連続接続をまとめて認可**では、1 回の生体認証
で、同じキーを使った同じエンドポイントへの繰り返しの接続を 30 秒間カバーできます。
tmux のタブやファイル転送のたびに認証を求められることがなくなります。アプリを
バックグラウンドに移すと、[アプリロック](https://bambouville.com/docs/ja/security/)がオフのときでも、この許可は
必ず無効になります。

このトグルはキーの生成時や読み込み時に選べ、あとからキーの詳細で変更できます。
例外は、この設定ができるようになる前に作成された P-256 Secure Enclave キーです。
これらは変更できない**必須**のタグを持っており、変更するには新しいキーを生成して
差し替えるしかありません。

## キーの詳細パネル

キーをタップすると、種類、**フィンガープリント (sha256)**（OpenSSH 互換）、公開鍵
が表示されます。ここから次の操作ができます。

- **公開鍵をコピー** — `authorized_keys`の 1 行です。
- **ホストにコピー…** — サーバーに設置します（後述）。
- **秘密鍵を書き出す…** — Ed25519 のみ。パスフレーズで暗号化した
  `openssh-key-v1`の復旧ファイルを書き出します。
- **ローカルの秘密鍵を削除…** — [削除](#キーの削除)を参照してください。

**使用元**のセクションには、そのキーを参照しているホストが一覧表示されます。

## ホストへのキーの設置

**ホストにコピー…**でホストを選ぶと、`authorized_keys`に追加される行がそのまま
表示され、SSH 経由で`~/.ssh/authorized_keys`に検証用のマーカー付きで追記されます。

- 先に[ホストキーを信頼](https://bambouville.com/docs/ja/host-keys/)しておく必要があります。まず一度接続して
  内容を確認してから、やり直してください。
- すでにそのキーを認証に使っているホストには、Tessera はキーを設置しません。
- 完了した設置は記録され、削除の手順で報告されます（「把握しているリモート設置数:
  N」）。

## 書き出しと復旧

キーの**復旧**セクションは、そのキーのバックアップ状態を記録します。検証済みの
復旧ファイルの書き出しがあるかどうか（日付とフィンガープリント付き）が分かり、
Enclave キーの場合は、Secure Enclave 内の秘密情報はデバイスの外に出せないという
注意が常に表示されます。

- **復旧キーを保護…** — パスフレーズを付けて書き出します。
- **復旧ファイルを検証…** — 復旧ファイルが今もそのキーと一致するか確認します。
- **復旧ファイルから復元…** — キーチェーンの情報が失われていたり一致しなかったり
  する場合に、フィンガープリントを照合して修復します（バックアップから復元した
  あとなど）。

ソフトウェアキーを広く設置する前に、バックアップを取ってください。復旧できない
キーは、パスワード認証を無効にしていくにつれて、自分自身を締め出すことを意味
します。

## キーの削除

**ローカルの秘密鍵を削除…**は、確認のうえでキーをキーチェーンから削除します。
ローカルで削除しても、サーバー上の`authorized_keys`のエントリが
**失効することはありません**。記録済みのホストに使える代替の資格情報がある場合、
削除の手順で「記録済みの N 台のホストで失効させて削除」が提示され、まとめて削除
できます。そうでない場合は、キーを使えなくしたいなら、各サーバーで該当する行を
自分で削除してください。

以前のバージョンから残っているレガシー RSA キーは、無効の状態で表示されます。

## 孤立したキーチェーン項目

iOS はアプリを削除して再インストールしてもキーチェーンの項目を保持するため、キーの
メタデータとキーの実体がずれることがあります。秘密情報が失われたキーは、一覧に
**秘密情報がありません**のバッジ付きで表示されます（[復旧ファイルから復元](#書き出しと復旧)で直せます）。
対応するキーのない秘密情報が残っている場合は「孤立したキーチェーン項目 N 件」
として現れ、**クリーンアップを確認…**の手順が用意されます。迷う場合は、先に復旧
ファイルを書き出してから削除してください。

## デバイスアクセス

[このデバイスを承認](https://bambouville.com/docs/ja/continuity/#このデバイスを承認)によって、あなたの別の
デバイスがホストに登録されると、その許可がここに記録されます。相手のデバイス、
方向、ホスト、キーのフィンガープリントが残ります。**失効**は、設置したときと同じ
くあなた自身のアクセス権を使って、そのデバイスの公開鍵をホストから削除します。
ホストに到達できない場合、そのエントリは不確かな状態のまま残るので、再試行するか
手動で片付けられます。

## バイト列はどこにあるか

- ソフトウェアの Ed25519 キー: iOS のキーチェーン（同期されません）。
- P-256 キー: Secure Enclave。設計上、書き出しできません。
- Tessera 自身のデータベース: 公開鍵、フィンガープリント、ラベル、使用状況。
  秘密情報は決して入りません。

堅牢化の全容については、公開されている
[秘密鍵のセキュリティ監査](https://github.com/bambouville/tessera/blob/main/docs/private-key-security-audit.md)を参照してください。
