Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1
RSS
[Helper] Пользовательский HTTPS-сертификат (включая Lets Encrypt) для Web Controller, UniFi Network
 
Я заметил несколько вариантов и вопросов по поводу установки сертификата Let’s Encrypt или другого кастомного HTTP-сертификата для Контроллера. Использовать прокси перед unifi на самом деле не нужно, так как можно просто взять сертификат и импортировать его в unifi. Существует несколько способов сгенерировать сертификат (в примере ниже предполагается использование Let’s Encrypt), но общий порядок действий таков:  
- Сгенерировать сертификат (например, с помощью letsencrypt-auto)  
- Преобразовать сертификат и приватный ключ в формат pkcs12  
- Преобразовать pkcs12-файл в хранилище java keystore  
- Скопировать java keystore в нужное место для unifi  
- Перезапустить unifi  

Я использую два cron-задания: одно для генерации сертификата через letsencrypt (шаг 1), второе — для конвертации и импорта в unifi (шаги 2-5). Ниже приведён bash-скрипт (протестирован на Ubuntu) для шагов 2-5 (не забудьте заменить "unifi.mydomain.com" на ваш домен/сертификат):  
#!/bin/bash  
PATH=’/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games’;  
openssl pkcs12 -export -in /etc/letsencrypt/live/unifi.mydomain.com/fullchain.pem -inkey /etc/letsencrypt/live/unifi.mydomain.com/privkey.pem -out /etc/letsencrypt/live/unifi.mydomain.com/cert_and_key.p12 -name tomcat -CAfile /etc/letsencrypt/live/unifi.mydomain.com/chain.pem -caname root -password pass:aaa;  
rm -f /etc/letsencrypt/live/unifi.mydomain.com/keystore;  
keytool -importkeystore -srcstorepass aaa -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -srckeystore /etc/letsencrypt/live/unifi.mydomain.com/cert_and_key.p12 -srcstoretype PKCS12 -alias tomcat -keystore /etc/letsencrypt/live/unifi.mydomain.com/keystore;  
keytool -import -trustcacerts -alias unifi -deststorepass aircontrolenterprise -file /etc/letsencrypt/live/unifi.mydomain.com/chain.pem -noprompt -keystore /etc/letsencrypt/live/unifi.mydomain.com/keystore;  
mv /var/lib/unifi/keystore /var/lib/unifi/keystore-`date -I`;  
cp /etc/letsencrypt/live/unifi.mydomain.com/keystore /var/lib/unifi/keystore;  
service unifi restart;  

Важно: не меняйте alias и пароли, указанные выше — именно такие ожидает unifi. Это значит, что ваш https://unifi.mydomain.com:8443 будет использовать указанный сертификат вместо самоподписанного по умолчанию — прокси не нужен. Надеюсь, это поможет кому-то автоматизировать процесс.
 
Отлично. У меня сработало на Raspberry Pi с Raspbian и Unifi Controller 5.5.20.
 
Привет, у меня проблемы с этим скриптом. Есть ли обновлённая версия, которая работает? Я пытался внести те изменения, что ты предложил, но безрезультатно.
 
С 9 января 2018 года этот способ больше не работает. Ошибка: Клиент с выбранным аутентификатором не поддерживает комбинацию вызовов, которая удовлетворит CA. Причина: https://community.letsencrypt.org/t/2018-01-09-issue-with-tls-sni-01-and-shared-hosting-infrastructure/49996

Изменения: тот же скрипт, но перед запуском нужно изменить файл «gen-unifi-cert.sh». Убрать «tls-sni-01» и заменить его на «http-01». Перенаправлять порт 443 на сервер unifi больше не нужно (это не требуется). Теперь порт 80 должен быть направлен на сервер unifi (вместо 443). Сейчас всё снова работает.

Я всё ещё надеюсь, что в Unifi добавят что-то подобное прямо в веб-интерфейс — чтобы всё работало из коробки. Лучше всего было бы, если бы они нашли решение, позволяющее использовать порт, отличный от 80 или 443. Желательно порт 8443, так как у многих он уже направлен на сервер unifi, и тогда не придется ничего менять специально.
 
Я успешно установил SSH-сертификат на свой сервер UniFi, работающий на Ubuntu VM, и хочу поделиться тем, что сделал. Let’s Encrypt — бесплатно, пошагово.  

Основы перед началом:  
- Установил VM с Ubuntu Server LTS 16.04.  
- В процессе установки выбрал пакет OpenSSH Server, чтобы иметь возможность управлять сервером через Putty или подобное (я использовал Secure Shell плагин для браузера Chrome, так как у меня нет админских прав и я не мог установить Putty на работе, откуда хочу управлять машиной).  

Моя первая ошибка — выделил слишком маленький жёсткий диск. Я понял, что MongoDB требует 3 ГБ свободного места, чтобы вообще запуститься. Пришлось увеличить раздел. После установки сервер работает нормально с 512 МБ оперативной памяти. В качестве гипервизора я использовал Hyper-V на Windows 10. Делал снимки системы, чтобы можно было откатиться, если что-то пойдёт совсем не так.  

- Настроил проброс портов для всех, связанных с UniFi.  
- Пробросил порт 443 (пришлось перенести веб-интерфейс моего роутера на другой порт).  

Потребовалось время, чтобы понять, почему не работает.  

- Установил UniFi, настроил, убедился, что он работает.  
- Убедился, что есть рабочее доменное имя, которое указывает на ваш IP (dyndns, no-ip или что-то подобное).  
- Проверил, что можно достучаться до нового UniFi-сервера извне (хотя бы порт 443 должен быть доступен, но проверить это не так просто, потому что на нём не должно быть запущено других сервисов).  

В этом руководстве замените:  
unifi.domain.com — на ваш (под)домен  
your@email.com — на ваш электронный адрес  

Вот руководство, которое я нашёл и немного поправил/улучшил:  

@weighsone  
‎11-04-2016 21:02  
ссылка на страницу форума  

Небольшое дополнение для всех, кто читает эту тему: теперь можно сделать всё бесплатно с помощью Let’s Encrypt. Это быстрее, дешевле и, пожалуй, проще оригинального решения.  
Я сделал всё по инструкции здесь: https://www.reddit.com/r/Ubiquiti/comments/43v23u/using_letsencrypt_with_the_un­ifi_controller/  
Спасибо @briellie за пост!  

Точно то, что мне нужно — пошагово от чистой установки контроллера на Ubuntu 16.04 LTS. Только предварительно установил UniFi контроллер (через apt или .deb) и обновил ОС.  

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

Установите git:  
sudo apt-get -y install git bc  

Склонируйте репозиторий letsencrypt:  
sudo git clone https://github.com/letsencrypt/letsencrypt /usr/src/letsencrypt  

Создайте папку в корне для скриптов (нужны права root для следующих действий, можно возиться с sudo, как хотите):  
sudo su  
mkdir /root/bin  

Скачайте скрипт установки:  
wget https://source.sosdg.org/brielle/lets-encrypt-scripts/raw/master/gen-unifi-cert.sh -O /root/bin/gen-unifi-cert.sh  

Перейдите в папку и сделайте скрипт исполняемым:  
cd /root/bin  
chmod +x gen-unifi-cert.sh  

Запустите скрипт с необходимыми параметрами:  
./gen-unifi-cert.sh -e your@email.com -d unifi.domain.com  

Согласитесь на установку необходимых зависимостей.  

Проверьте, что всё прошло успешно (ищите «Congratulations!» в разделе важных уведомлений). Если что-то пошло не так — исправьте ошибки, иначе сертификат не будет применён.  

Если всё хорошо, у вашего контроллера теперь получится SSL-сертификат от Let’s Encrypt. Они действуют 3 месяца, поэтому нужно настроить автоматическое обновление через cron:  

Я немного изменил, потому что не был уверен:  
- будет ли работать, так как cron у меня в Ubuntu сервере не был установлен  
- будет ли запускаться от имени суперпользователя  

Создайте новый cron-файл для еженедельного запуска:  
sudo nano /etc/cron.weekly/renew-unifi-ssl  

И вставьте туда:  
/root/bin/gen-unifi-cert.sh -r -d unifi.domain.com  

Вот и всё. Ваш контроллер теперь с SSL-сертификатом, который будет обновляться автоматически и бесплатно бесконечно.  

Я сделал немного иначе (надеюсь, правильно):  

Установил cron:  
sudo apt-get update  
sudo apt-get install cron  

Добавил cron-задачу:  
sudo crontab -e  

Выбрал nano и вставил строку:  
0 5 * * 1 /root/bin/gen-unifi-cert.sh -r -d unifi.domain.com  

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

Планирую обновить этот текст, если смогу подтвердить, что автообновление работает (придётся ждать максимум 3 месяца, чтобы проверить).
 
Я не устанавливал это на других виртуальных машинах, но не могу быть на 100% уверен, что там его не было. По крайней мере, для дистрибутива Azure оно работало идеально сразу после установки, даже после перезагрузок. Сейчас всё работает отлично: только что обновил unifi до версии 5.5.20, и haveged всегда автоматически запускается как служба после каждой загрузки.
 
Рад это слышать. Имейте в виду, что haveged — это демон, который всегда должен запускаться при старте системы. А в других VPS он был включён?
 
Кто-нибудь пробовал это под Windows? Думаю, многое должно работать. Есть несколько Windows-клиентов для LetsEncrypt. Не пробовал, но, наверное, их можно запустить через скрипт. Остальное можно сделать из командной строки (скрипт) через Java (импорт ключа и перезапуск сервиса). Пока что я сгенерировал сертификат через сайт www.sslforfree.com и вручную настроил DNS TXT-запись, потом использовал программу KeyStore Explorer на Windows — это удобный способ в пару кликов. Я продолжал бы так делать, если бы это нужно было раз в три года. А вот каждые три месяца — это не вариант. Если это всё работает на Unifi, я посмотрю, можно ли настроить zywall на автозапуск обновления SSL-сертификата... хотя надежд особо нет.
 
Да, раньше всё работало, я удалил тот droplet, создал новые в Vultr, Azure и Linode. Единственный, который заработал сразу — это Azure! В итоге сделал новый в DigitalOcean и заставил его работать, помогло добавление haveged. Сначала всё работало, но когда пытался применить сертификат, он «зависал». Сейчас всё запущено и работает, спасибо за ответ!
 
Контроллер работал до этого изменения? Если нет, то, скорее всего, нужно добавить немного энтропии, следуя рекомендациям, описанным здесь: https://community.ui.com/questions/47304b03-3687-4b34-9388-3416be153a81
 
Привет, ребята! Создал дроплет в DigitalOcean, все настроил, сделал снепшот дроплета, потом установил cert-bot и запустил ваш скрипт. Сервис unifi вроде работает (sudo service unifi status), но кажется, он не подключается к MongoDB, хотя mongod тоже активен и запущен. Я не очень хорошо разбираюсь в Ubuntu (16.04.2), поэтому восстановил снепшот, но контроллер всё равно работает, но к нему не подключиться! Есть идеи? Могу всегда создать контроллер с нуля, так как ещё не использовал его в продакшене, но если буду это делать, хотелось бы быть уверенным, что смогу всегда восстановить дроплет. Спасибо заранее, /skalf
 
Спасибо за этот скрипт! Я использовал опцию --renew-hook в certbot, чтобы автоматически запускать скрипт при обновлении сертификата. Подробнее в моём блоге: https://blog.webtito.be/2017/06/01/lets-encrypt-unifi/?lang=en
 
Спасибо! Твой скрипт сработал отлично!
Страницы: 1
Читают тему (гостей: 1)