Толик Панков
hex_laden
............ .................. ................
November 2020
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Толик Панков [userpic]
Скрипт для обновления ключей для VPN RiseupVPN без Bitmask и клиента Riseup

Преамбула


Единственная проблема, которая возникает с Riseup VPN - пользовательские ключи периодически протухают (они обновляются примерно раз в 3-4 месяца). Уж не знаю, для чего это сделано, но факт остается фактом. Клиент Bitmask, понятно что, обновляет ключи автоматом, но работает только на астероиде с конкретным давлением и гравитацией. А нам такое не надо.

Сам клиент Bitmask на самом деле реализует SRP-авторизацию для последующего получения пользовательского сертификата VPN, однако, админ сервера может выдавать и анонимный ключ, без использования авторизации. С riseup.net несказанно повезло, что гайдам от разработчиков Bitmask, они все-таки (пока) последовали не до конца, и спокойно выдают ключ без авторизации и регистрации.

Так что Bonafide можно реализовать частично, опустив шаги регистрации пользователя и всю работу с SRP-авторизацией. Соответственно, остальное без проблем делается с помощью средств shell/bash и нескольких дополнительных утилит.

Ремарка про сам Bitmask


Такое ощущение, что проект медленно дохнет. Из 4 провайдеров, работающих через клиент Bitmask, осталось только два: Riseup, который даже сделал свой отдельный клиент по образу и подобию, и calyx.net, не очень понятный проект от какой-то мелкой американской научной конторы https://www.calyxinstitute.org/, впрочем, тоже предоставляющий бесплатный VPN. А вот колумбийский VPN (всегда мечтал попробовать что-нибудь колумбийское) и единственный платный Codigosur сдохли. И самое печальное, что сдох демо-сервер от самого Bitmask. Который позволялось использовать для отладки своих клиентов под Bitmask-протокол.

Немного про алгоритм скрипта


1. Нам необходимо выкачать из корня сайта провайдера файл provider.json. Там содержится основная информация о провайдере.
2. Далее вытаскиваем из provider.json "api_uri" и "api_version". Два этих значения (api_uri + api_version) составляют API_BASE, т.е., например, для Calyx "api_uri": "https://api.calyx.net:4430" и "api_version": "1", соответственно API_BASE будет https://api.calyx.net:4430/1
3. Выгружаем себе корневой сертификат провайдера (самоподписанный) из "ca_cert_uri" (для Calyx будет https://calyx.net/ca.crt)
4. Получаем его fingerprint из "ca_cert_fingerprint". Отпечаток сертификата SHA256 (у всех двух виденных именно такой)
5. Считаем отпечаток скачанного сертификата с помощью openssl:

openssl x509 -in $WORKDIR"/"$CACRTFILE -noout -fingerprint -sha256 -inform pem

- делаем необходимые строковые преобразования:

openssl x509 -in $WORKDIR"/"$CACRTFILE -noout -fingerprint -sha256 -inform pem|awk -F = '{print tolower($2)}'|tr -d ':'

и сравниваем то, что получили из сертификата с прочитанным из provider.json должно совпадать.

6. Теоретически, с этого момента вся работа с дальнейшим API должна вестись с этим сертификатом, но для простоты можно все запросы делать curl с параметром --insecure.

7. Можно выкачать список конфигов сервиса, оформив GET-запрос на адрес API_BASE/configs.json. Список выглядит примерно так:

{
  "services":{
    "soledad":"/1/configs/soledad-service.json",
    "eip":"/1/configs/eip-service.json",
    "smtp":"/1/configs/smtp-service.json"
  }
}


8. На самом деле из интересного здесь только параметр "eip", это ссылка на конфиги VPN. Обычно перечисляются сервера и какие-то критичные параметры конфига. Так, например, выглядит текущий eip-service.json для Riseup:

На PasteBin

9. Теперь пора получать пользовательский сертификат (и ключ), который будет использоваться для авторизации в VPN, и для этого вообще-то надо логиниться по SRP, но два оставшихся провайдера - Riseup и Calyx, позволяют запрос сделать так.

Делаем POST-запрос (пустой) к API_BASE/cert.

10. Сохраняем результат.

Для парсинга JSON из консоли используется jq, установите для своего дистрибутива, если у вас еще нет.

Параметры запуска скрипта


Use bminfo <-p> <provider> [KEYS]

Обязательных параметра 2 - первый ключ (-p) и провайдер VPN (riseup.net, например).

Остальные параметры ([KEYS]):

--getinfo - получить только provider.json
--clear - очистить рабочий каталог
--getconfigs - получить provider.json, configs.json и eip config
--providerkey - получить корневой сертификат провайдера VPN (cacert.pem)
--userkey - получить сертификат пользователя (openvpn.pem)
--copy - скопировать сертификаты и файлы json в каталог из $OUTDIR/<provider>
--check - скопировать только файлы, которые были изменены

Можно использовать в сочетании друг с другом все ключи, кроме --clear.

Примеры:
Получение всей информации и всех ключей

bminfo -p calyx.net --getconfigs --providerkey --userkey

Получение только пользовательского ключа:

bminfo -p calyx.net --userkey

Код скрипта


На GitHub

Полезные ссылки


riseup.net
SRP-6: аутентификация без передачи пароля
Bonafide. Secure user registration, authentication, and provider discovery.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/09/22/skript-dlya-obnovleniya-klyuchej-dlya-vpn-riseupvpn-bez-bitmask-i-klienta-riseup/

Tags: , ,