
스마트폰 없이 Signal 계정을 등록하고 Signal Desktop을 연결할 수 있는 데스크톱 애플리케이션으로, Signal의 암호화 프로토콜을 사용하여 안전한 장치 프로비저닝을 제공합니다.
Signal 계정을 등록하고 Signal Desktop과 연결할 수 있는 데스크톱 애플리케이션으로, 스마트폰 없이도 모든 작업이 가능합니다.

Signal은 여전히 전화번호를 사용해야 합니다. 이 유틸리티는 스마트폰이 필요 없도록 해주지만, 설정 과정에서 SMS 메시지를 수신할 방법은 여전히 필요합니다.
이 도구가 여러분에게 흥미로울 수 있는 몇 가지 이유가 있습니다:
Signal 대화의 보안은 설치된 기기의 보안 수준에 따라 결정됩니다:
기기가 암호로 잠겨 있지 않은 상태에서 분실되거나 도난당하면 당연히 누군가 그 안의 메시지를 읽을 수 있습니다. 마찬가지로, 법 집행 기관은 압수된 기기에 침투하기 위해 포렌식 도구를 사용하는 것으로 알려져 있어 기기에 있는 모든 것(메시지 포함)을 읽을 수 있습니다.
어떤 사람들은 스마트폰이 없으며, 그들도 Signal을 사용할 수 있어야 합니다 :-)
Signal은 자체 소프트웨어에서 이 사용 사례를 지원할 의사가 없습니다. Signal Desktop에는 독립 등록 코드가 존재하지만, 개발 및 스테이징 빌드에서만 사용 가능하며, 유지보수자들은 그들의 트래커에서 이것이 최종 사용자를 위한 것이 아님을 확인했습니다. (#1118, #551, #575, #6431). 이것이 바로 이 별도의 도구가 존재하는 이유입니다.
릴리스 페이지에서 시스템에 맞는 파일을 다운로드하세요:
.dmg를 열고 Signal Setup을 응용 프로그램 폴더로 드래그하세요.AppImage: 실행 권한을 부여하고 (chmod +x Signal_Setup-*.AppImage) 실행하세요. 원한다면 일반 signal-setup-linux-* 바이너리도 제공됩니다.릴리스는 유료 개발자 인증서로 서명되지 않았습니다 (macOS는 연간 $99 USD, Windows는 더 비쌈). 따라서 설치 후 시스템이 경고를 표시합니다:
macOS는 "확인되지 않은 개발자로부터 온 앱이므로 열 수 없습니다."라고 표시합니다. 앱을 마우스 오른쪽 버튼으로 클릭하고 열기를 선택한 후 확인하세요. 이 작업은 한 번만 하면 됩니다. 앱이 "손상됨"이라고 보고하면 다운로드 격리 플래그를 해제하세요: xattr -dr com.apple.quarantine "/Applications/Signal Setup.app".
Windows SmartScreen이 "Windows에서 PC를 보호했습니다."라고 표시합니다. 추가 정보를 클릭한 후 실행을 클릭하세요.
cargo build --release
./target/release/signal-setup
이 프로젝트는 두 개의 크레이트로 구성된 Cargo 워크스페이스입니다: signal-setup-core (Signal 등록 및 기기 연결 로직)와 signal-setup (이에 의존하는 데스크톱 GUI). 워크스페이스를 빌드하면 위의 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
프로덕션 대신 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
--demo 플래그는 서버 없이 가짜 데이터로 완전한 오프라인 테스트를 위해 사용할 수 있습니다.
이러한 작업을 수행할 수 있는 다른 도구들도 있습니다. 예를 들어 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 Success
Server-->>App: registered
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 2
loop Poll up to 60s
App->>Server: GET /v2/keys/{aci}/2
Server-->>App: device 2 pre-keys (when ready)
end
Note over App: send_linked_device_sync():<br/>X3DH + Double Ratchet session,<br/>encrypt empty contacts SyncMessage
App->>Server: PUT /v1/messages/{aci} (encrypted sync)
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/>.