
スマートフォンを必要とせずにSignalアカウントを登録し、Signal Desktopをリンクするためのデスクトップアプリケーション。Signalの暗号プロトコルを使用して安全なデバイスプロビジョニングを実現します。
Signalのアカウントを登録し、Signal Desktopとリンクするためのデスクトップアプリケーションです。スマートフォンを必要としません。

このユーティリティはスマートフォンを不要にしますが、セットアップ段階でSMSメッセージを受信する手段は依然として必要です。 Signalは最近電話番号なしのアカウントを導入しましたが、それでもAndroidとGoogle Play servicesが必要です。将来的には代替の支払いオプションが提供される可能性が高いでしょう。
このツールが興味深いと思われる理由はいくつかあります:
Signalの会話のセキュリティは、それがインストールされているデバイスのセキュリティと同じくらい低いものです:
パスコードでロックされていない状態でデバイスを紛失したり盗まれたりした場合、当然ながら誰かがそのデバイス上のメッセージを読むことができます。同様に、法執行機関が押収したデバイスに侵入するためにフォレンジックツールを使用することが知られており、メッセージを含むデバイス上のあらゆるものを読むことが可能になります。
スマートフォンを持っていない人もおり、彼らもSignalを使えるべきです :-)
このツールはアカウントのプライマリデバイスとして登録し、Signal Desktopをセカンダリデバイスとしてリンクします。Signalはアカウントごとに5台のリンクされたデバイスを許可しており、このツールはそれらすべてをリンクするのに役立ちます。これは、例えば同僚とSignalアカウントを共有したい場合などに便利です。
現時点では、Signal Desktopはアカウントをセットアップするために電話番号とスマートフォンを必要とします。これは将来的に変わる可能性がありますが、それまではこれを使用できます。
「あなたの質問は、Signalに現在存在する電話番号サインアップに関するものだと思います。それは今年の後半に電話番号なしでサインアップする方法を追加することを期待して検討しているものです。[...]」
— Ehren Kret、Signal CTO、2026年7月20日
リリースページからお使いのシステム用のファイルをダウンロードしてください:
.dmgを開き、Signal SetupをApplicationsにドラッグします。AppImage: 実行可能にし(chmod +x Signal_Setup-*.AppImage)、実行します。お好みであれば、プレーンなsignal-setup-linux-*バイナリも公開されています。リリースは有料の開発者証明書(macOSでは年間99米ドル、Windowsではさらに高額)で署名されていないため、インストール後にシステムから警告が表示されます:
macOSでは「開発元が未確認のため開けません」と表示されます。アプリを右クリックして開くを選択し、確認します。これは一度だけ行う必要があります。「壊れている」と報告された場合は、ダウンロードの隔離フラグをクリアしてください:xattr -dr com.apple.quarantine "/Applications/Signal Setup.app"。
WindowsのSmartScreenでは「WindowsによってPCが保護されました」と表示されます。詳細情報をクリックし、実行をクリックします。
cargo build --release
./target/release/signal-setup
プロジェクトは2つのクレートからなるCargoワークスペースです:signal-setup-core(Signalの登録とデバイスリンクのロジック)と、それに依存するデスクトップGUIのsignal-setupです。ワークスペースをビルドすると、上記のsignal-setupバイナリが生成されます。
Linuxのみにおいて、GPU/ディスプレイ用にいくつかのシステムライブラリが役立ちます:
# Ubuntu / Debian
sudo apt install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \
libxkbcommon-dev libssl-dev protobuf-compiler
# Fedora
sudo dnf install libxcb-devel libxkbcommon-devel openssl-devel protobuf-compiler
# Arch
sudo pacman -S libxcb libxkbcommon openssl protobuf
すべてのアカウントは「Manage」画面からキーファイルとしてエクスポートできます:
signal-account-<number>.json。これには、そのアカウントのプライマリデバイスとして動作するために必要なすべてが含まれており、任意のパスフレーズで暗号化されています。
バックアップとして保管しておけば、別のマシンにインポートできます!
キーファイルにはマスターキーも含まれており、ロックの期限切れを待たずに番号を再登録する際に役立ちます。
本番環境の代わりに Signal のステージング環境に対してツールを実行できます。これは実際のアカウントを危険にさらすことなく開発やテストを行うのに便利です:
./target/release/signal-setup --staging
デバイス連携の手順を完了するには、同じくステージングサーバーに接続された Signal Desktop のインスタンスが必要です。Signal Desktop をソースからビルドすると、デフォルトでこの状態になります:
git clone https://github.com/signalapp/Signal-Desktop.git
cd Signal-Desktop
pnpm install
pnpm start
SIGNAL_SETUP_DEBUG=1 を設定すると、Signal の検証 API のすべての応答(ステータスとボディ)がターミナルに出力されます。登録がうまくいかないときに最初に確認すべき情報です。
完全にオフラインで偽データを使ってテストするための --demo フラグも用意されています(サーバー不要)。デモモードでは、検証コード 000000 はデバイス転送が可能なアカウントを、111111 は登録ロックされた番号をシミュレートします。
これと同じことを実現できる他のツールとして、AsamK による素晴らしい signal-cli がありますが、残念ながらグラフィカルユーザーインターフェースは提供されていません。このツールの以前のバージョンでは内部でそれを利用していましたが、動作させるためにユーザーが JVM をインストールしている必要がありました。
そこで、その方が簡単だと考えたこともあり、この機会に Signal の暗号技術を深く掘り下げてみることにしました。
以下は、動作の概要です(このアプリケーションはプライマリ Signal デバイスとして登録し、その後 Signal Desktop をセカンダリデバイスとしてリンクします)。
フローは次のとおりです:
%%{init: {'theme':'default', 'themeVariables': {'background':'#ffffff'}}}%%
sequenceDiagram
actor User
participant App as App
participant Server as Signal Server
participant Desktop as Signal Desktop
participant Store as Disk + Keyring
Note over App: Step 0: Welcome (if saved accounts)
rect rgb(235,245,255)
Note over User,Server: Phase 1: Request verification code
User->>App: Step 1: enter phone (+1234567890)
App->>Server: POST /v1/verification/session
Server-->>App: session.id (+ captcha_required?)
alt Captcha required
Note over App: Step 2 shown
User->>App: solve captcha, paste it
App->>Server: POST .../session/{id}/code (sms)
else No captcha
App->>Server: POST .../session/{id}/code (sms)
end
Server-->>User: SMS verification code
end
rect rgb(235,255,235)
Note over User,Server: Phase 2: Verify & register account
User->>App: Step 3: enter 6-digit code
App->>Server: PUT .../session/{id}/code {code}
Note over App: Generate keys: ACI/PNI identity,<br/>signed pre-keys, Kyber PQ keys,<br/>master/profile keys, password
App->>Server: POST /v1/registration (account attrs + keys)
alt 409 Device transfer available
Server-->>App: 409 / DeviceTransferAvailable
Note over App: warn, retry skipping device transfer
else 423 Registration locked
Server-->>App: 423 / RegistrationLocked
Note over App: ask for the account's key file
else Success
Server-->>App: registered
App->>Server: PUT /v1/accounts/registration_lock (HMAC of master key)
App->>Store: save metadata (disk) + secrets (keyring)
end
end
rect rgb(255,245,235)
Note over User,Desktop: Phase 3: Link Signal Desktop
User->>App: Step 4: launch Desktop, "Link to existing device"
Desktop-->>User: shows QR code
User->>App: paste QR image / link
App->>Server: GET /v1/devices/provisioning/code
Server-->>App: verification_code
Note over App: Build ProvisionMessage (identity keys,<br/>profile/master key, code) →<br/>ECDH + HKDF + AES-256-CBC + HMAC
App->>Server: PUT /v1/provisioning/{ephemeral_id} (envelope)
Server-->>Desktop: deliver envelope / register as device N
loop Poll until a new device id shows up
App->>Server: GET /v1/devices
end
loop For every linked device
App->>Server: GET /v2/keys/{aci}/{device}
Server-->>App: device pre-keys
end
Note over App: send_linked_device_sync():<br/>X3DH + Double Ratchet session per device,<br/>encrypt empty contacts SyncMessage
App->>Server: PUT /v1/messages/{aci} (encrypted sync, all linked devices)
Server-->>Desktop: SyncMessage / leaves "Syncing…"
end
App-->>User: Step 5 : 🎉 Setup complete
Signal Without Smartphone
Copyright (C) 2026 Alexis Métaireau
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.