Преамбула
Единственная проблема, которая возникает с 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.