Картинка для привлечения внимания
Картинка для привлечения внимания

Сегодня речь пойдет НЕ о новомодной нейросети, не о космической программе NASA, не о созвездии Близнецов, и даже не об очередной криптобирже. Интернет-протоколу Gemini не повезло с названием, его все время путают с чем-то другим.

А протокол интересный, дело в том, что он:

  • минималистичный, как Gopher

  • а значит, удобный для создания самодельных компьютерных программ, работающих с ним

  • радикально защищает читателя от скриптов, всплывающих окон и прочего

  • при этом заточен на параноидальную приватность и безопасность

  • и еще там непривычный подход к шифрованию канала передачи данных, о чем сейчас и поговорим

Проект некоммерческий, с полностью открытыми спецификациями, был разработан энтузиастами, как это и должно быть.

Сразу же хочу показать примеры команд в терминале Linux, для тех кто любит сразу код.

Смотрим Gemini-сайты из командной строки

printf 'gemini://bbs.geminispace.org/\r\n' | ncat -C --ssl bbs.geminispace.org 1965

Наличие SNI обязательно, поэтому проверьте, чтобы ваш ncat или socat его поддерживал.

Положительный результат выглядит примерно так:

20 text/gemini; charset=utf-8
# ???? BBS
Discussion forums, microblogging, and Git issue tracking for the Gemini community. You only need a Gemini client to participate. Welcome!

=> /s/ ???? Subspaces
=> /help ???? Help
=> /conduct  ❤️ Code of conduct

Логинимся на форум из командной строки

Тут чуть сложнее, про идентичности расскажу внизу.

# генерируем ключ, программа спросит всякое разное, везде вводим одну точку, кроме 'common name', там нужно ввести любое слово от балды
openssl req -new -x509 -out cert.pem -nodes

# идем на BBS регистрироваться
printf 'gemini://bbs.geminispace.org/?p2\r\n' | ncat -C --ssl --ssl-cert cert.pem --ssl-key privkey.pem bbs.geminispace.org 1965

Ответ сервера изменился, теперь он выглядит примерно так:

20 text/gemini; charset=utf-8
# ???? BBS

## New Certificate Detected

You can create a new user account with this certificate (0E39286B7C). If you already have an account, you can register this certificate as an alternative.

=> /register/6Jq2F5Kx2W Create account

=> /add-cert Add alternative certificate
=> /recover-cert Recover certificate

Потом надо будет уже средствами форума ввести никнейм, выбрать аватарку и все такое.

Поднимаем сервер

Это очень примитивный сервер, он не проверяет входные данные, умеет только выдавать фиксированный текст.

#генерируем сертификат, программа спросит кое-что, заполняем всё одной точкой, в разделе 'common name' должно быть доменное имя, на котором сервер будет в последствии принимать заросы
openssl req -x509 -newkey rsa:2048 -out cert.pem -days 1200 -nodes

# создаем страницу для примера
printf '20 text/gemini\r\nWelcome to habrahabr capsule!\r\n' > page.gmi

# и заодно скрипт, который будет ее выводить, потом пригодится
echo '!/bin/bash' > output_page.sh
echo 'cat page.gmi' >> output_page.sh
chmod +x output_page.sh

# запускаем сервер, для выключения нажать ctrl+c
socat 'OPENSSL-LISTEN:1965,reuseaddr,pf=ip4,fork,cert=cert.pem,key=privkey.pem,verify=0' 'EXEC:/home/user/gemini/output_page.sh'

Похожим образом я поднял ноду на домене фестиваля Undefined. Скрипт присылает ASCII-art картинку и небольшой текст (при перезагрузке страницы должен меняться). Смотреть через шлюз, либо вышеописанным способом.

Еще один протокол? Зачем?

Современный World Wide Web заметно потяжелел. Изначально предназначенный для простого просмотра текста с картинками, он был легким и быстрым, со временем он начал кумулятивно обрастать новыми фичами. Сегодня WEB технология позволяет делать очень много, вплоть до создания офисных приложений, работающих из браузера. Такой прогресс будет неизбежно иметь свою цену, ведь с увеличением количества фич растет и сложность браузера и экосистемы вокруг него. Появляются множество слабых мест в системе безопасности, контролировать которые становится все сложнее.

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

Вот затем и был придуман протокол Gemini. Чтобы у людей в будущем был шанс на приватный и безопасный интернет.

Почитать, посмотреть, изучить

  • Спецификация

  • Полезные ссылки, поисковики, справка.

  • Заметка про Finger, Gopher и Gemini заодно, и вообще что такое Small Internet.

  • Хорошее высупление человека по имени James Tomasino на конференции MCH, на английском языке, про то, зачем нужен Small Internet и про Gemini в частности. Смотреть на YouTube. Если хотите, я загрузил это же видео на децентрализованный PeerTube.

Что там с шифрованием?

Принудительное TLS шифрование всех соединений с использованием самоподписанного сертификата сервера. Доверие к сертификату по принципу Trust on first use, то есть, при первом контакте сертификат добавляется в список доверенных, и дальше сайтом можно пользоваться при условии что сертификат остается тем же. Если сертификат поменялся, а домен остался прежнем, то браузер выдает предупреждение.

Вы спросите, а где же Certificate Authorities? А нет их. Они не нужны.

Но как же тогда защититься от атаки Man in the Middle? Только сравнивая отпечаток ключа вручную, плюс есть еще несколько методов, об этом будет ниже.

Кстати, похожая схема используется в SSH и некоторых других протоколах. Юзеру предлагается вручную сравнить отпечаток ключа при первом коннекте, и ничего плохого в этом нет.

Серьезно, как убедиться что сайт в протоколе Gemini подлинный?

Если при первом посещении сайта атака MitM не производилась, то ваш браузер запомнит правильный сертификат и будет автоматически ему доверять. В случае начала атаки браузер заметит подмену и предупредит вас. Если же нужна полная уверенность, то вот несколько методов:

  1. встретиться с админом и сравнить отпечаток ключа, лично или через какой-нибудь защищенный канал.

  2. позаходить на сайт с разных мест (то есть, посмотреть с разных network perspectives), через прокси, и проследить, меняется ли отпечаток ключа при этом. Если меняется, значит кто-то пытается подделать соединение.

  3. посмотреть в списке сертификатов, при желании, сгенерировать хранилище сертификатов для браузера и импортировать

  4. гипотетически, при использовании Gemini протокола для удаленного банкинга, банк может высылать отпечаток ключа в том же бумажном конверте, в котором находится свежая пластиковая карта, и сфотографировать клиента с конвертом в руках при вручении, а дальше клиент сможет все настроить сам по инструкции.

При этом, сайтом можно пользоваться как обычно, а проверку отпечатка отложить на потом.

Понятно. И что это дает?

Для админов - очень легкое создание новых нод. Самоподписанный сертификат генерируется легко и быстро, не нужно нигде указывать свою почту. Единственное неудобство - все еще нужно доменное имя.

Для юзеров - самоподписанный сертификат больше не считается чем-то плохим, все сайты открываются сразу, проверка отпечатка - по желанию. У такой системы есть свои недостатки, но если подумать, то безопасность примерно одинаковая, просто доверие сместилось на пользователей. Это как ключи от квартиры, что-то действительно важное лучше проверить самому, чем доверять кому-то еще.

Такая вещь, как воровство сессий и паролей, в gemini отсутствует благодаря системе идентичностей.

Идентификация посетителей в протоколе Gemini

Я говорил про параноидальную приватность и безопасность от отслеживания? В протоколе Gemini все посетители анонимны, и сервер не может отличить одного юзера от другого (разве что по IP), если только сам посетитель не включит идентичность.

Идентичность - это просто еще один TLS сертификат шифрования, но на этот раз на стороне клиента. Сертификаты генерируются на устройстве клиента по желанию, причем для каждого сайта отдельно (хотя можно и совмещать). Для каждого сайта можно сделать сразу несколько идентичностей и переключать их.

Идентичность нужна при регистрации аккаунта на Gemini-форуме, она позволяют завести никнейм, и впоследствии дает доступ к этому никнейму, от имени которого можно постить сообщения и общаться с обитателями gemini-пространства.

Злоумышленник не может похитить идентичность, потому что она всегда хранится на устройстве юзера. Идентичности в Gemini - это пример того как должна быть устроена авторизация в нормальном мире, тут есть чему поучиться.

Протокол Titan

У Gemini есть ограничение на размер запроса - 1024 байта. Сюда входит имя ресурса плюс параметры.

Протокол Titan кроме строки запроса принимает также тело сообщения, с почти неограниченной длиной, таким образом решает эту проблему. Теперь на сервер gemini можно отправить длинный текст или файл. А в целом это такой же Gemini, с тем же шифрованием, с возможностью использовать идентичность. В основную спецификацию Titan не входит, и номер порта у него другой.

Причем тут тильда?

Давным давно, еще во времена Юникса, когда интернет только появлялся, люди поняли, что не выгодно регистрировать домены для каждого блога или домашней страницы, и возникла идея, сделать тильду. Это когда создается один большой сайт, а на нем создаются адресные подпространства для каждого пользователя, начинающиеся со значка тильды. Чем-то напоминает современный Shared Hosting. Так вот, так получилось, что обитатели тильды старались делать странички как можно меньше, а разметку как можно проще, и это как нельзя кстати пригодилось, когда появился протокол Gemini. Нормальной практикой считается автоматическое конвертирование тильды в Gemini и обратно, блоги можно смотреть одновременно из обоих протоколов. Для тех, кто хочет иметь свою домашнюю страницу, при этом не заморачиваясь с настройкой, то это то, что нужно.

Какой gemini-браузер самый адекватный?

Для андроида - Lagrange. Только он. У остальных либо идентичности не грузятся, либо другие проблемы. Для остальных платформ, опять же, Lagrange. Tomasino советует браузер Kristall - минималистичный браузер, написанный с использованием Qt5.

Как вы могли видеть в начале статьи, протокол настолько простой, что его можно смотреть из самодельного браузера.

Кроме этого, есть шлюзы, позволяющие смотреть gemini-страницы из обычного интернета. Вот один из них.

В теории, поддержка может появиться в обычных браузерах на подобие Mozilla Firefox, не обязательно встроенная, это вполне может быть дополнение (плагин). Но нужно помнить, что вся эта история с протоколом, это еще и возможность облегчить браузер и сделать его более быстрым. Если у вас слабый компьютер, и вы бы хотели избежать загрузки полноценного браузера, то протокол Gemini вас выручает.

Слабые стороны протокола Gemini

Сам по себе протокол не защищает от отслеживания IP адреса, и совсем не способен самостоятельно обходить блокировки, поэтому его лучше применять в сочетании с любым прокси (Tor, I2P, Freenet, BitMessage, Shadowsocks, Meshtastic, радиорелейная линия, почтовые голуби и прочее).

Для создания сервера по прежнему нужен белый IP адрес и еще желательно доменное имя. Поэтому люди обычно создают ноду на том же домене, на котором у них уже работает сайт. Если регистрировать домен совсем не хочется, то тогда hidden service - отличный вариант.

Было принято мудрое решение протокол больше НЕ развивать. То есть, он так и останется в таком виде, как сейчас. В результате протокол обречен на легковесность и быстроту, но для этого пришлось заплатить отказом от новых функций. Поначалу это может быть непривычно, но на это есть веская идеологическая причина.

Самое главное на мой взгляд - для посещения gemini страниц необходимо, чтобы сервер их предоставляющий был все время онлайн. Если он выключится, то страницы пропадают вместе с ним. Никакого автоматического копирования не предусмотрено. Gemini страдает тем же, что и обычный интернет. Проблема частично решается сайтами-архиваторами, один из них - DeLorean Time Machine на базе поискового движка Kennedy.

Здесь статья заканчивается, спасибо что дочитали до этого места. Ожидаю шквал критики по поводу Trust on first Use, докажите мне что без CA жить никак нельзя.

Также хочу попросить прощения за мою лексику. В статье используются слова из жаргона компьютерных мастеров. В своих последующих статьях я постараюсь этого избегать.

Фестиваль

Фестиваль программирования и самодельной электроники Undefined состоится 17-18 февраля 2024 года в пригороде Санкт-Петербурга, приглашаю, очень нужны докладчики на конференцию, мейкеры, волонтеры, зрители.

С уважением, nikhotmsk

Комментарии (14)


  1. mc2
    29.12.2023 18:19
    +4

    Чуть уточнения про тильду. у ADM-3A терминала, клавиши Home и ~ были размещены на одной и той же кнопке, по этому переход в домашний каталог сделали через тильду. Отсюда и пошли ссылки и для остальных host:~username.


  1. Number571
    29.12.2023 18:19
    +1

    Юзеру предлагается вручную сравнить отпечаток ключа при первом коннекте, и ничего плохого в этом нет.

    Точно плохого ничего нет? А с чем он будет сравнивать то отпечаток? От куда он его получит? Само получение отпечатка также может быть подменено вместе с сертификатом.

    UPD: но в общем статья получилась хорошая )


    1. mOlind
      29.12.2023 18:19
      +1

      Ну потому что отпечаток - это хэш от публичного ключа сервера. Если кто-то хочет передать чужой публичный ключ - он ничего не сможет прочитать в ответе клиента.


  1. Arkasha
    29.12.2023 18:19
    +1

    докажите мне что без CA жить никак нельзя.

    Ну, не именно без CA, но попробую

    позаходить на сайт с разных мест

    Только в случае MitM перед сервером (перед хостингом или у вашего домашнего провайдера в случае домашнего сервера) это не поможет

    посмотреть в списке сертификатов

    git-аккаунт от списка сертификатов можно увести и подделать ключи.

    встретиться с админом и сравнить отпечаток ключа, лично или через какой-нибудь защищенный канал.

    Лично встречаться/переписываться по сторонним каналам с каждым админом массово никто не будет.

    Спасибо за статью


    1. Actaeon
      29.12.2023 18:19

      Рекламу можно заказать на телевидении, чтобы значит на всю страну, по центральным каналам быстро показывали списки отпечатков. Для нескольких тысяч популярных BBS - сойдет.


      1. Arkasha
        29.12.2023 18:19
        +2

        "Сойдёт" - это вообще не аргумент, расширяемости нет.

        Наткнулся на интересный пост с описанием проблем gemini от разработчика cURL, там в том числе про сертификаты есть

        https://daniel.haxx.se/blog/2023/05/28/the-gemini-protocol-seen-by-this-http-client-person/

        И вот здесь некоторые пояснения

        gemini://nytpu.com/gemlog/2023-06-04.gmi


  1. Another_Point
    29.12.2023 18:19
    +2

    Да, идея лёгкого протокола без лишнего мусора хороша. Например к разряду такового относятся telnet-BBS. Тоже лёгкие и доступны даже из под доса. В интернете есть группы людей которые восстанавливают старый интернет, этот самый Web 1.0. В принципе правильно делают. Современные сайты весят как фильмы в хорошем качестве, а контента там на 10 Мбайт. И HTTPS пихают ваще где можно, даже туда где он нахрен не нужен))))


    1. Alexeyslav
      29.12.2023 18:19

      В современном мире он нужен везде, таковы реалии.
      Web 1.0 конечно хорош, но абсолютно не функционален на сегодняшнее время. Текстовая форма подачи может и хороша в определённых случаях, но это лишь 1% полезного контента, который к тому же очень трудно создавать, слишком большие накладные расходы. Поэтому он и умер. Жаль конечно.


      1. Another_Point
        29.12.2023 18:19
        +1

        HTTPS может быть нужен там где юзер указывает конфиденциальную информацию (карточки банковские, номера телефонов и так далее), но зачем лепить это на сайты где нет этого? Например один из белорусских сайтов с прогнозом погоды, там нет ни системы аккаунтов для юзеров(канеш, зачем это в прогнозе погоды), ни функции где нужна банковская карта, но там самый новый Https и невероятно топорный сервер, и даже на новом смартфоне сайт грузится секунд 20-40. Не говоря уже про старые(и не очень) компьютеры. Выглядит это как полнейший бред.

        Web 1.0 может в принципе содержать и другой контент, в виде отдельных файлов на сервере. Сейчас даже специально есть каталоги сайтов, работающих по http и сделанных очень просто, большинство из которых регулярно обновляются. Например old-web.com, появившийся в ноябре этого года, или old-dos.ru, работающий уже 15 лет. Не всем людям нужно сверхмодное оформление и невероятно дружественный интерфейс. Некоторым достаточно простого дизайна, толкового содержания и конкретной пользы от каждого элемента, будь то сайт или программа.


        1. Arkasha
          29.12.2023 18:19
          +2

          https не нужен, если ваш провайдер не лезет грязными ручонками в трафик. Хотя лично я с таким ни разу в жизни не сталкивался.

          А ещё можно смотреть, что вы посещаете, и продавать рекламодателям. Имхо, гугл в своё время именно поэтому топил за https и добавлял всякие warning-и в браузер: чтобы конкурентов убрать.


          1. Alexeyslav
            29.12.2023 18:19

            А я сталкивался. И именно в погодные и новостные сайты. Хочешь посмотреть погоду? А тебе всякая фигня сыплется, включаешь мобильный интернет - сайты открываются нормально. Причем сайты https но браузер ругается на "неправильные" и всеми силами старается их не открыть, потому что подменённые работают по http либо с неправильным/недействительным сертификатом(польза встроенных в браузер сертификатов, кстати).


        1. Alexeyslav
          29.12.2023 18:19
          +2

          Вектор угроз уже шире, и по-другому не будет - ящик пандоры открыт. Самое очевидное - анализ трафика провайдером и ЕГО МОДИФИКАЦИЯ. И не только провайдером, а например трояном в домашнем/корпоративном роутере(есть и такие!).


  1. enamchuk
    29.12.2023 18:19

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

    Также заметил, что в разных gemini-браузерах по-разному форматируется текст.


    1. nikhotmsk Автор
      29.12.2023 18:19

      На счет рисунков, можно встроить картинку прямо в url, и она загрузится вместе со страницей. Потом еще есть великий и ужасный ASCII-art. Для меня было сюрпризом, что оказывается в gemini поддерживаются цветовые команды терминала, то есть, цветной ascii art, и Lagrange его показывает.