鍵ってなあに?

ゆれ子

今日は、鍵のお話だよ。……わたしからは鍵って見えないんだけど、大事なものみたい。

前回、SWING を入れてセットアップ画面を開くと、最初に鍵の選び方を聞かれることを紹介しました。ここでは、その鍵がそもそも何なのか、SWING の中で何に使われているのか、どう扱えばよいのかを見ていきます。

秘密鍵と公開鍵

初回 に説明したとおり、SWING は Nostr のイベントで「サイトを更新した」「この人のサイトを保存する」といった表明を伝えます。このイベントが本当にその人が作ったものかを確かめるために使うのが、鍵です。

Nostr の鍵は、秘密鍵と公開鍵の 2 つで 1 組になっています。秘密鍵は持ち主だけが知っている値で、イベントに署名するのに使います。公開鍵は秘密鍵から計算される値で、誰に見せてもかまいません。署名されたイベントを受け取った人は、公開鍵を使って、そのイベントが対応する秘密鍵で署名されたものか、途中で書き換えられていないかを確かめられます。公開鍵からは秘密鍵を割り出せないので、公開鍵を配っても、署名できるのは秘密鍵を持っている人だけです。署名のくわしい形式は Nostr の NIP-01 に定められています。

Nostr には中央でアカウントを管理する場所がありません。そのため、公開鍵そのものがその人を表す名前の役目を果たします。

ゆれ子

みんなに見せていい鍵と、ぜったいに見せちゃだめな鍵……なんだね。

npub と nsec

鍵の中身はただの数値なので、そのままでは長い 16 進数の文字列(hex)になります。人間がやりとりしやすいように、Nostr では NIP-19 で決められた書き方もよく使われます。公開鍵は npub1 で始まる文字列、秘密鍵は nsec1 で始まる文字列で表します。どちらも中身は hex と同じ鍵で、書き方が違うだけです。先頭を見れば公開鍵か秘密鍵かがすぐにわかるので、取り違えを防ぐ役割もあります。

SWING の設定では、秘密鍵を nsec か hex のどちらかで書けます。ほかの人に自分のサイトをミラーしてもらうときに伝えるのは、公開鍵の npub のほうです。swing mirror add やダッシュボードの「ミラーに追加」に貼り付けるのも npub です。

新しい鍵の組は、次のコマンドで作れます。実行すると、nsec と npub、それぞれの hex を表示します。

swing key generate

ダッシュボードのセットアップ画面で「新しい鍵を生成する」を選んだ場合も、同じように新しい組が作られます。

SWING で鍵が使われるところ

SWING が署名するイベントは 3 種類です。自分のサイトを公開したときに出すサイトイベント(kind 35980)、ミラー対象を追加・削除したときに出す Follow Set(kind 30000)、保存しているサイトを知らせるレプリカ報告(kind 35981)です。はじめの 2 つは自分で操作したときに、レプリカ報告は mirror-agent が保存しているサイトごとに数日おきに自動で署名します。

受け取る側の SWING は、署名が正しくないイベントを捨て、さらに自分のミラー対象リストに載っている公開鍵が出したサイトイベントだけを保存の対象にします。誰かがあなたのサイトをミラーしているということは、その人の SWING が「この公開鍵で署名されたサイトイベントの CID を保存する」と決めている、ということです。

ゆれ子

じゃあ、もし秘密鍵を誰かに盗まれちゃったら……?

その場合、鍵を盗んだ人はあなたになりすましてサイトイベントに署名できます。あなたをミラーしている人の SWING は、それがなりすましの更新だとはわかりません。保存のポリシーを通れば、なりすましたサイトが新しいバージョンとして取り込まれてしまいます。ミラー対象リストを書き換えることもできます。秘密鍵を守ることは、自分のサイトを預かってくれている人たちを守ることと同じです。

秘密鍵の置き場所

秘密鍵を SWING に渡すと、設定ファイルに平文のまま書かれます。バイナリで動かしている場合は swing.toml の [nostr] にある secret_key です。Docker Compose で動かしている場合は .env の SWING_NOSTR_SECRET_KEY で、ここを空のままセットアップ画面で鍵を作ったときは、コンテナの /data に置かれる swing.toml に書かれます。

[nostr]
secret_key = "nsec1..."

平文なので、ファイルを読める人は誰でも秘密鍵を読めます。ファイルを Git にコミットしたり、ほかの人と共有するフォルダに置いたりしないよう気をつけましょう。Linux と macOS では、秘密鍵を書いた swing.toml がほかのユーザーにも読める権限になっていると、起動時に警告が出ます。そのときは、自分だけが読めるようにしておきます。

chmod 600 swing.toml

ダッシュボードのセットアップ画面から保存したファイルは、はじめから自分だけが読める権限で作られます。

ゆれ子

大事なことを書いた紙を、机の上に置きっぱなしにしない……みたいなことかも。

専用の鍵をすすめる理由

Nostr の鍵は、SNS のような Nostr のアプリでも使われています。すでに普段使いの鍵を持っている人は、それを SWING にも使いたくなるかもしれません。それでも SWING のドキュメントは、サイトの公開とミラーのための専用の鍵を新しく作ることをすすめています。

理由は、ここまで見てきた通りです。SWING に渡した秘密鍵は平文でファイルに残ります。そのファイルが漏れたとき、専用の鍵なら影響は SWING の範囲で済みますが、普段使いの鍵なら、その鍵を使っているほかの場所の投稿やつながりまで、なりすましの危険にさらされます。

秘密鍵を置かない方法

秘密鍵を手元のコンピュータに置きたくない場合は、スマホの署名アプリに署名を任せる方法もあります。Nostr の NIP-46 という仕組みで、SWING が署名してほしいイベントをリレー経由で暗号化して署名アプリに送り、署名アプリが秘密鍵で署名して返します。秘密鍵そのものが SWING に渡ることはありません。

SWING のドキュメントでは、Android の Amber と iPhone・iPad の Clave で動作を確かめています。セットアップ画面で「スマホの署名アプリで署名する(NIP-46)」を選び、「QRコードを表示」を押して、署名アプリの中の QR 読み取りで読み取り、接続を承認します。コマンドラインからつなぐこともできます。

swing signer pair

接続情報を保存したら、動いている swing を再起動すると署名アプリを使い始めます。

swing stop --restart

このとき手元には、署名アプリとの接続情報が remote-signer.json というファイルに保存されます。中には SWING 専用の使い捨ての鍵が入っていますが、これは署名アプリとのやりとりを暗号化するためだけのもので、イベントに署名できる鍵ではありません。署名アプリで接続を取り消せば使えなくなります。

ゆれ子

鍵はスマホが持っていて、こっちは「署名して」ってお願いするだけ……なんだね。

ただし、署名アプリを使うときは少し注意が必要です。先ほど見たように、レプリカ報告は数日おきに自動で署名されるので、SWING からのリクエストは常に許可しておくのがおすすめです。公開とミラー対象の変更だけは毎回確かめたい場合は、署名アプリの権限設定で kind 35981 だけを許可にしておくと、それ以外のリクエストでスマホに承認を求められます。

署名アプリが使えない間は、公開・ミラー対象の変更・レプリカ報告の更新ができません。サイトの取得と保存は署名を使わないので続けられます。署名できない状態が長く続くとレプリカ報告の更新が止まり、既定では 3 日で期限が切れて、ミラーしている人数に数えられなくなります。スマホを閉じている間やスリープ中に答えられるかは署名アプリによるので、上手く動かないときは署名アプリを起動して待ってみてください。

ゆれ子

スマホも、ときどきは起こしてあげないとね……。

次回

鍵を取り扱う準備ができれば、SWING でできることを一通り試せます。次回は、ゆれ子のいるデスクトップ画面から見えるものを手がかりに、ほかの人のサイトをミラーして読んでみるところまでを見ていきます。

ゆれ子

次は、いっしょにサイトを見に行こうね。