Скрипт для обновления ключей для VPN RiseupVPN без Bitmask и клиента Riseup
Единственная проблема, которая возникает с Riseup VPN - пользовательские ключи периодически протухают (они обновляются примерно раз в 3-4 месяца). Уж не знаю, для чего это сделано, но факт остается фактом. Клиент Bitmask, понятно что, обновляет ключи автоматом, но работает только на астероиде с конкретным давлением и гравитацией. А нам такое не надо.
Сам клиент Bitmask на самом деле реализует SRP-авторизацию для последующего получения пользовательского сертификата VPN, однако, админ сервера может выдавать и анонимный ключ, без использования авторизации. С riseup.net несказанно повезло, что гайдам от разработчиков Bitmask, они все-таки (пока) последовали не до конца, и спокойно выдают ключ без авторизации и регистрации.
Так что Bonafide можно реализовать частично, опустив шаги регистрации пользователя и всю работу с SRP-авторизацией. Соответственно, остальное без проблем делается с помощью средств shell/bash и нескольких дополнительных утилит.
Такое ощущение, что проект медленно дохнет. Из 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/skri