Первое подтверждение — через ваш сервер.

Два участника могут обменяться данными подтверждения через выбранный ими VPS или домашний сервер. После подтверждения сервер можно выключить.

Один файл · Python 3.11+

Небольшой временный посредник

Это самостоятельный скрипт, а не установка Ironclad целиком. Не нужны база данных, зависимости из pip, аккаунт администратора Ironclad или доступы к нашим серверам. Скрипт передаёт зашифрованные данные настройки; обычная переписка затем идёт через Ironclad со сквозным шифрованием.

Скачать relay.py

Открытый исходный код сервера. Файл скачивается, а не запускается автоматически.

SHA256: b75c8344f16e328e91e92097c54ac9f6cb17f6089fd14403afc51a26ba2f5526
01 · Подготовка

Сервер, доступный обоим

Сохраните скрипт в отдельную папку. Получите сертификат для своего домена у удостоверяющего центра. Закрытый ключ сертификата должен читаться только учётной записью процесса; не публикуйте его рядом со скриптом.

python3 --version
curl --fail --proto '=https' --tlsv1.2 \
  https://pathcreator.ru/mobile/personal-relay/relay.py -o relay.py
sha256sum relay.py

Сравните полученный SHA256 со значением выше. Не передавайте скачанный файл сразу в интерпретатор через pipe: сначала сохраните и просмотрите его.

02 · Запуск

Включите HTTPS

Замените пути к сертификату и ключу своими. Оставьте терминал с процессом открытым до завершения подтверждения.

python3 relay.py --bind 0.0.0.0 --port 8765 \
  --cert /path/to/fullchain.pem --key /path/to/privkey.pem

Адрес для приложения: https://relay.example.org:8765 — подставьте свой домен. Сертификат должен соответствовать этому домену. У сервера нет веб-интерфейса: ошибка при открытии его корня в браузере сама по себе не означает поломку.

Если HTTPS уже обслуживает reverse proxy

python3 relay.py --bind 127.0.0.1 --port 8765 --loopback-http

Прокси на том же сервере должен принимать HTTPS и передавать пути /v1/rooms/… без изменения на 127.0.0.1:8765. Отключите access logs, кеширование и перенаправления; ограничьте тело запроса 1600 KiB и полную длительность 15 секундами. В приложение всё равно вводится HTTPS-адрес. HTTP разрешён скриптом только на loopback.

03 · На двух устройствах

Пригласите и проверьте друг друга

  1. Оба участника входят в Ironclad. Первый открывает Новый чат → Связаться через личный сервер, вводит HTTPS-адрес и нажимает «Создать приглашение».
  2. Передайте приглашение второму участнику лично или по отдельному приватному каналу, которому оба доверяют. Любой получивший приглашение может присоединиться. Не вставляйте его на сервер, в сайт, публичный чат или обращение в поддержку.
  3. Второй участник открывает тот же пункт и вставляет приглашение. Оба проверяют показанный аккаунт и весь отпечаток лично или через независимый доверенный канал. Адрес сервера и сравнение только внутри этого нового чата не подтверждают личность.
  4. Если всё совпало, оба подтверждают участника. Дождитесь сообщения «Подтверждено через свой сервер» на обоих устройствах и откройте чат.
  5. Остановите сервер сочетанием Ctrl+C. Для дальнейшей доставки сообщений он не нужен.

Если обмен не завершён за 15 минут или процесс перезапущен, отмените ожидающее подтверждение в обоих приложениях и создайте новое приглашение. При несовпадении отпечатков подтверждать нельзя.

Что остаётся у каждого

Посредник хранит зашифрованные данные только в оперативной памяти, до 15 минут. Он видит IP-адреса, время, размеры данных и отдельный ключ доступа к ящику, но не получает секрет шифрования приглашения. Он может задерживать или блокировать обмен.

Приложения подписывают общий результат и отправляют Ironclad открытое доказательство подтверждения устройств. В нём нет адреса вашего сервера или секрета приглашения. У чата появляется отдельный способ подтверждения — это не QR-проверка и не утверждение о личной встрече. Новое или восстановленное устройство не наследует эту локальную отметку.

Доверие к приложениям и устройствам участников остаётся необходимым. Этот способ не скрывает метаданные дальнейшей обычной доставки; записанный обмен настройки не получает прямой секретности при последующей утечке секрета приглашения. Поэтому не сохраняйте и не публикуйте приглашение после использования.

English guide

Your server. A temporary introduction.

Use a VPS or reachable home server for the initial device confirmation, then switch it off. Ordinary end-to-end encrypted conversations continue through Ironclad.

Download and prepare

Download relay.py

A single standalone Python 3.11+ script; no pip packages, Ironclad backend, database or Ironclad credentials. Run it under a dedicated unprivileged account. The SHA256 above identifies the published file.

You need a hostname, a valid HTTPS certificate trusted by both phones, and a TCP port reachable from both devices. Open the server/provider firewall. A home server needs port forwarding and a reachable address, or a private network/VPN both participants can reach; CGNAT alone is insufficient. Keep the TLS private key readable only by the process account.

python3 relay.py --bind 0.0.0.0 --port 8765 \
  --cert /path/to/fullchain.pem --key /path/to/privkey.pem

Replace the certificate paths and use https://your-host.example:8765 in the app. Keep the process running until both devices finish. There is no browser UI on the relay.

With a same-host TLS reverse proxy, run python3 relay.py --bind 127.0.0.1 --port 8765 --loopback-http. Forward /v1/rooms/… unchanged; disable access logs, caching and redirects. Limit bodies to 1600 KiB and total request duration to 15 seconds. The mobile endpoint must still use HTTPS.

Confirm on both devices

  1. Sign in to Ironclad. Open New chat → Connect through personal server, enter your HTTPS address and create an invitation.
  2. Share the invitation privately through a separate channel you both trust. Anyone holding it can join. Never paste it into the relay server, a website, public chat or support message.
  3. The other person joins using that invitation. Verify the account and compare the entire fingerprint in person or through an independent trusted channel. The server address alone, or comparison only through this new chat, is insufficient.
  4. Both confirm only if everything matches. Wait for completion on both devices, then stop the relay with Ctrl+C.

If 15 minutes pass or the relay restarts, cancel the pending confirmation on both devices and create a new invitation.

What this protects

The relay holds encrypted setup data in memory for up to 15 minutes. It sees IP addresses, timing, lengths and a separate mailbox capability, not the invitation encryption secret. It can delay or deny service.

The apps send Ironclad a jointly signed public device receipt without your relay hostname or invitation secret. This is a distinct device confirmation, not a claim of an in-person meeting; a new or restored device does not inherit another device’s local confirmation.

Trusted apps, uncompromised participant devices and private invitation sharing remain necessary. Normal delivery metadata is not hidden. Recorded setup offers lack forward secrecy if the invitation secret is later exposed; do not retain or publish the invitation after use.