Небольшой временный посредник
Это самостоятельный скрипт, а не установка Ironclad целиком. Не нужны база данных, зависимости из pip, аккаунт администратора Ironclad или доступы к нашим серверам. Скрипт передаёт зашифрованные данные настройки; обычная переписка затем идёт через Ironclad со сквозным шифрованием.
Скачать relay.pyОткрытый исходный код сервера. Файл скачивается, а не запускается автоматически.
SHA256: b75c8344f16e328e91e92097c54ac9f6cb17f6089fd14403afc51a26ba2f5526
Сервер, доступный обоим
- Python 3.11 или новее и отдельная непривилегированная учётная запись для процесса.
- Домен и действующий HTTPS-сертификат, которому доверяют оба телефона. Самоподписанный сертификат обычное приложение не примет.
- Выбранный TCP-порт открыт в firewall сервера и у провайдера. Для дома нужен проброс порта и доступный адрес либо частная сеть/VPN, доступная обоим; CGNAT без такого пути не подойдёт.
Сохраните скрипт в отдельную папку. Получите сертификат для своего домена у удостоверяющего центра. Закрытый ключ сертификата должен читаться только учётной записью процесса; не публикуйте его рядом со скриптом.
python3 --version
curl --fail --proto '=https' --tlsv1.2 \
https://pathcreator.ru/mobile/personal-relay/relay.py -o relay.py
sha256sum relay.py
Сравните полученный SHA256 со значением выше. Не передавайте скачанный файл сразу в интерпретатор через pipe: сначала сохраните и просмотрите его.
Включите 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.
Пригласите и проверьте друг друга
- Оба участника входят в Ironclad. Первый открывает Новый чат → Связаться через личный сервер, вводит HTTPS-адрес и нажимает «Создать приглашение».
- Передайте приглашение второму участнику лично или по отдельному приватному каналу, которому оба доверяют. Любой получивший приглашение может присоединиться. Не вставляйте его на сервер, в сайт, публичный чат или обращение в поддержку.
- Второй участник открывает тот же пункт и вставляет приглашение. Оба проверяют показанный аккаунт и весь отпечаток лично или через независимый доверенный канал. Адрес сервера и сравнение только внутри этого нового чата не подтверждают личность.
- Если всё совпало, оба подтверждают участника. Дождитесь сообщения «Подтверждено через свой сервер» на обоих устройствах и откройте чат.
- Остановите сервер сочетанием
Ctrl+C. Для дальнейшей доставки сообщений он не нужен.
Если обмен не завершён за 15 минут или процесс перезапущен, отмените ожидающее подтверждение в обоих приложениях и создайте новое приглашение. При несовпадении отпечатков подтверждать нельзя.
Что остаётся у каждого
Посредник хранит зашифрованные данные только в оперативной памяти, до 15 минут. Он видит IP-адреса, время, размеры данных и отдельный ключ доступа к ящику, но не получает секрет шифрования приглашения. Он может задерживать или блокировать обмен.
Приложения подписывают общий результат и отправляют Ironclad открытое доказательство подтверждения устройств. В нём нет адреса вашего сервера или секрета приглашения. У чата появляется отдельный способ подтверждения — это не QR-проверка и не утверждение о личной встрече. Новое или восстановленное устройство не наследует эту локальную отметку.
Доверие к приложениям и устройствам участников остаётся необходимым. Этот способ не скрывает метаданные дальнейшей обычной доставки; записанный обмен настройки не получает прямой секретности при последующей утечке секрета приглашения. Поэтому не сохраняйте и не публикуйте приглашение после использования.
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
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
- Sign in to Ironclad. Open New chat → Connect through personal server, enter your HTTPS address and create an invitation.
- 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.
- 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.
- 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.