Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1 2 След.
RSS
Lets Encrypt и контроллер UniFi, UniFi Network
 
С запуском публичной беты Lets Encrypt на носу, интересно, кто-нибудь знает, как правильно использовать подписанные сертификаты с контроллером UniFi? Хочу получить сертификат LE для домена, где живёт мой контроллер. Тогда можно будет забыть обо всех ошибках с сертификатами, которые выскакивают при каждом входе.  

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

У меня на сервере ещё несколько других доменов, которые тоже работают на 443, так что должно с ними сочетаться. Для них я использую Nginx в роли веб-сервера.  

Спасибо!
 
Я только что настроил свой сертификат LE и решил поделиться, как это сделал. Чистый сервер Ubuntu 16.04.2 LTS на AWS, ничего лишнего, кроме UniFi контроллера версии 5.4.16.

Сначала создайте shell-скрипт для копирования. Я положил свой в /root/le-renew-hook.sh.

#!/bin/bash  
#  
# Пожалуйста, измените значения под вашу среду  
#  
certdir=/etc/letsencrypt/live/unifi.example.com  # просто замените имя домена после /live/  
keytooldir=/usr/bin  # java keytool находится в /usr/bin  
keystoredir=/var/lib/unifi  
#  
printf "Остановка сервиса unifi\n"  
service unifi stop  
printf "Экспорт нового ключа в формат pkcs12\n"  
openssl pkcs12 -export -out $certdir/certificate.p12 -name unifi -inkey $certdir/privkey.pem -in $certdir/fullchain.pem -caname root -password pass:aircontrolenterprise  
printf "Резервное копирование keystore\n"  
cp $keystoredir/keystore $keystoredir/keystore-backup  
printf "Импорт нового сертификата\n"  
keytool -importkeystore -destkeystore $keystoredir/keystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -srckeystore $certdir/certificate.p12 -srcstoretype PKCS12 -srcstorepass aircontrolenterprise -alias unifi -noprompt  
printf "Запуск сервиса unifi\n"  
service unifi start  
printf "Готово!\n"

Следуйте инструкциям CertBot для получения начального сертификата. У меня на сервере только контроллер, поэтому я выбрал standalone на порту 443.

certbot certonly --standalone --preferred-challenges tls-sni -d unifi.example.com

Когда всё успешно завершится, нужно установить сертификаты. Проверьте, чтобы в скрипте стояло правильное имя вашей машины, а затем просто запустите его. Скорее всего, придётся закрыть браузер и открыть заново — после этого всё должно заработать.

Теперь надо автоматизировать обновление сертификатов — это проще простого.

Выполните:

sudo crontab -e

и добавьте строку:

0 0 1 * * /usr/bin/certbot renew --renew-hook /root/le-renew-hook.sh

Это проверит сертификат первого числа каждого месяца в полночь. Если сертификат нужно обновить, он обновится и запустит скрипт установки. Учтите, что при установке будет пауза на несколько секунд — контроллер остановится и запустится заново, так что возможны небольшие перебои. Если у вас есть время, когда сеть работает особенно тихо, лучше поставить выполнение не на первое число в полночь, а на это время.
 
@EastSideGym

Давай, создавай новую тему с твоей проблемой и отмечай меня. --Klint
 
Я бы очень хотел получить постоянное решение. А пока нужна такая, которая поможет прямо сейчас. У вас есть вариант для меня?
 
Кто-то уже упоминал скрипт от @Frankedinven. В общем, суть в том, чтобы использовать pre/post хуки, доступные в certbot, чтобы взять на себя основную работу по загрузке сертификата в UniFi. Скрипт, над которым я сейчас работаю в проекте Easy UBNT, базируется на идее Фрэнка (правда, немного по-другому) и работает (пока что на Debian/Ubuntu). Я ещё не тестировал скрипт на CK, но планирую это сделать в будущем. Если кто-нибудь хочет помочь ускорить этот процесс — дайте знать. --Klint
 
@danbowkley

Выглядит отлично. Я как раз собирался написать скрипт, когда наткнулся на твой (и бесстыдно его скопировал!). Сейчас тестирую (всегда бесплатный) экземпляр Google Compute Engine f1-micro с Debian 8. Пока всё отлично. Установил certbot так: sudo apt-get install certbot -t jessie-backports
 
До обновления контроллера до версии 0.12.0 я мог успешно установить Let’s Encrypt. Теперь же постоянно выскакивает ошибка 403 Forbidden. Чтобы исправить эту ошибку, убедитесь, что ваше доменное имя правильное, а DNS записи A / AAAA для домена указывают на верный IP-адрес. Я подозреваю, что после обновления мой скрипт перестал быть совместимым. Только я этого не понимаю. Кто-нибудь может помочь или знает, как решить эту проблему лучше?

Шаг 1:  
sudo apt-get update  

Шаг 2:  
sudo apt-get install git  
sudo apt-get install nano  

Шаг 3:  
sudo apt-get install libssl-dev -t jessie-backports  

Шаг 4:  
git clone https://github.com/letsencrypt/letsencrypt  
letsencrypt/letsencrypt-auto  

Шаг 5:  
service nginx stop  

Шаг 6:  
letsencrypt/letsencrypt-auto certonly --text --standalone --preferred-challenges tls-sni-01 --domain Domain.dyndns.org --email info@Domain.de --agree-tos --renew-by-default  

Шаг 7:  
service unifi stop  
rm /usr/lib/unifi/data/keystore  
nano /etc/default/unifi  

Шаг 8:  
удалите строку: UNIFI_SSL_KEYSTORE=/etc/ssl/private/unifi.keystore.jks  

Шаг 9:  
sudo openssl pkcs12 -export -inkey /etc/letsencrypt/live/Domain.dyndns.org/privkey.pem -in /etc/letsencrypt/live/Domain.dyndns.org/fullchain.pem -out /home/cert.p12 -name ubnt -password pass:temppass  
sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /usr/lib/unifi/data/keystore -srckeystore /home/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias ubnt -noprompt  

Шаг 10:  
service nginx start  
service unifi start  

Шаг 11:  
Проверьте вызов SSL сайта: exit  

-----------------------------------------------  

# Редактировать работу ежемесячно  
# Остановить сервисы  
service nginx stop  
service unifi stop  

# Получить сертификат от LetsEncrypt  
/home/letsencrypt/letsencrypt-auto certonly --text --standalone --standalone-supported-challenges tls-sni-01 --domain Domain.dyndns.org --email info@Domain.de --agree-tos --renew-by-default  

# Конвертировать сертификат в формат PKCS12  
openssl pkcs12 -export -inkey /etc/letsencrypt/live/Domain.dyndns.org/privkey.pem -in /etc/letsencrypt/live/Domain.dyndns.org/fullchain.pem -out /home/cert.p12 -name ubnt -password pass:temppass  

# Загрузить в Java keystore, который понимает UBNT  
keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /usr/lib/unifi/data/keystore -srckeystore /home/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias ubnt -noprompt  

# Очистить и использовать новый сертификат  
rm /home/cert.p12  

# Запустить сервисы  
service nginx start  
service unifi start  

# Остановить сервисы  
service nginx stop  
service unifi stop  

# Получить сертификат от LetsEncrypt  
/home/letsencrypt/letsencrypt-auto certonly --text --standalone --preferred-challenges tls-sni-01 --domain Domain.dyndns.org --email info@Domain.de --agree-tos --renew-by-default  

# Конвертировать сертификат в формат PKCS12  
openssl pkcs12 -export -inkey /etc/letsencrypt/live/$domain/privkey.pem -in /etc/letsencrypt/live/$domain/fullchain.pem -out /home/cert.p12 -name ubnt -password pass:temppass  

# Загрузить в Java keystore, который понимает UBNT  
keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /usr/lib/unifi/data/keystore -srckeystore /home/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias ubnt -noprompt  

# Очистить и использовать новый сертификат  
rm /home/cert.p12  

# Также используйте тот же сертификат для Nginx (конфигурация Cloud Key)  
rm /etc/ssl/private/cloudkey.crt  
rm /etc/ssl/private/cloudkey.key  
rm /etc/ssl/private/unifi.keystore.jks  
rm /etc/ssl/private/cert.tar  
cp /etc/letsencrypt/live/$domain/privkey.pem /etc/ssl/private/cloudkey.key  
cp /etc/letsencrypt/live/$domain/fullchain.pem /etc/ssl/private/cloudkey.crt  
cp /usr/lib/unifi/data/keystore /etc/ssl/private/unifi.keystore.jks  
cd /etc/ssl/private/  
tar -cf cert.tar cloudkey.crt cloudkey.key unifi.keystore.jks  

# Запустить сервисы  
service nginx start  
service unifi start
 
@jupitersolu и @auocloudmtanner: Чтобы автоматизировать Let's Encrypt, нужно поместить безголовую версию вашего скрипта в /etc/letsencrypt/renew-hooks/deploy/. CertBot автоматически запустит ваш скрипт при обновлении сертификата. В этом случае нельзя запрашивать имя домена, например.
 
Используйте это вместо этого. https://util.wifi.gl/unifi-import-cert.sh
 
Используя вышеизложенное, я создал: https://github.com/mtan93/unifi-letsencrypt/ Это должно работать на Ubuntu и других дистрибутивах на базе Debian.
 
Привет! Я использовал скрипт от @danbowkley, пока не заметил, что на Ubuntu 16.04 LTS у меня появлялись ошибки с cron: service: command not found. Поэтому я его переделал: добавил проверку изменения сертификата, удаление временного файла .p12 и заменил service на systemctl:

```bash
#!/usr/bin/env bash
# Версия 2018-04-09d
# Модификация Martin Boissonneault
# email: packages@ve2mrx.dyndns.info
# Ссылки:
# https://community.ui.com/questions/3decc2c9-1c7b-4711-a842-59d90dc3be7e#comment/b6ddeb56-f633-4619-b426-cc122a4769dd
# https://source.sosdg.org/brielle/lets-encrypt-scripts/src/branch/master/gen-unifi-cert.sh
# https://github.com/stevejenkins/unifi-linux-utils
#
# Назначение: копировать сертификаты Let's Encrypt из папки cert UNMS
# и импортировать их в контроллер UniFi
# Пожалуйста, измените значения под свою среду

## Просто замените доменное имя после /home/unms/data/cert/live/
certdir=/home/unms/data/cert/live/server.example.net

# java keytool находится в /usr/bin
keytooldir=/usr/bin

# Расположение keystore UniFi (обычно /var/lib/unifi)
keystoredir=/var/lib/unifi

if md5sum -c $certdir/cert.pem.md5 >/dev/null; then
   echo "Сертификат не изменился, обновление контроллера не требуется."
   exit 0
else
   echo "Сертификат изменился, обновляем контроллер..."
   md5sum $certdir/cert.pem > $certdir/cert.pem.md5
   echo "Экспортируем новый ключ в формат pkcs12..."
   openssl pkcs12 -export -password pass:aircontrolenterprise \
     -in $certdir/fullchain.pem \
     -inkey $certdir/privkey.pem \
     -out $certdir/certificate.p12 -name unifi \
     -caname root

   echo "Останавливаем сервис unifi..."
   #service unifi stop
   #/etc/init.d/unifi stop
   systemctl stop unifi

   echo "Делаем резервную копию keystore..."
   cp $keystoredir/keystore-backup $keystoredir/keystore-backup.1
   cp $keystoredir/keystore $keystoredir/keystore-backup

   echo "Удаляем существующий сертификат..."
   keytool -delete -alias unifi -keystore $keystoredir/keystore \
     -deststorepass aircontrolenterprise -noprompt

   echo "Импортируем новый сертификат..."
   keytool -importkeystore \
     -destkeystore $keystoredir/keystore \
     -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise \
     -srckeystore $certdir/certificate.p12 -srcstoretype PKCS12 \
     -srcstorepass aircontrolenterprise \
     -alias unifi -noprompt

   echo "Запускаем сервис unifi..."
   #service unifi start
   #/etc/init.d/unifi start
   systemctl start unifi

   echo "Убираем временные файлы..."
   rm $certdir/certificate.p12

   echo "Готово!"
fi
```

Я решил разместить его в /usr/local/bin/  
Спасибо!  
Мартин  

P.S. В скрипте заменил домены на примеры из RFC 2606.
 
Небольшое обновление команды в одну строку для использования нового формата PKCS12. Ошибка, которую вы можете получить: JKS keystore использует проприетарный формат. Рекомендуется перейти на PKCS12 — это стандарт отрасли, используя команду "keytool -importkeystore -srckeystore /var/lib/unifi/keystore -destkeystore /var/lib/unifi/keystore -deststoretype pkcs12".

Так что измените вашу команду на  
keytool -importkeystore -destkeystore $keystoredir/keystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -srckeystore $certdir/certificate.p12 -srcstoretype PKCS12 -srcstorepass aircontrolenterprise -noprompt -deststoretype pkcs12

*** В первый раз, когда будете это делать, УДАЛИТЕ файл keystore, чтобы он создался заново в формате PKCS12.
 
В nginx нужно добавить ещё один блок для поддержки WebSocket. Вот что я использую, чтобы избежать сообщения «Websocket connection error»:

location /wss/ {
   proxy_pass https://localhost:8443/wss/;
   proxy_set_header Host $host;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";
}
 
Из всех руководств по настройке LetsEncrypt я нашёл это самым понятным и лёгким для следования: https://lg.io/2015/12/13/using-lets-encrypt-to-secure-cloud-hosted-services-like-ubiquitis-mfi-unifi-and-unifi-video.html
 
Настроил nginx на Deb 8 (на Deb 7 по тому туториалу, который я использовал, не работает). Но теперь каждый раз, когда открываю новую страницу, появляется ошибка «WebSocket connection error». Хотя в общем всё вроде работает нормально.
 
Спасибо! Наконец-то удалось запустить сервис. Только похоже, что перенаправление работает неправильно, с этим еще разбираюсь.
 
Ты прав, скобок вроде как ровно столько, сколько надо. Хм... Вот моя конфигурация, может пригодится.

server {
   listen 443;
   server_name domain.example.com;

   ssl on;
   ssl_certificate /etc/letsencrypt/live/domain.example.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/domain.example.com/privkey.pem;
   ssl_dhparam /etc/nginx/dhparam.pem;

   ssl_trusted_certificate /etc/nginx/unifi.pem;

ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_cache shared:SSL:10m;
ssl_prefer_server_ciphers on;

location /.well-known/acme-challenge {
   alias /usr/share/nginx/html/.well-known/acme-challenge;
   location ~ /.well-known/acme-challenge/(.*) {
       add_header Content-Type application/jose+json;
   }
}

   location / {
       proxy_pass https://domain.example.com:8443/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 90;
proxy_ssl_verify off;
   }
}
 
Я понял, что там написано, и сделал так, как сказано, но всё равно не работает.
 
Да, я попробовал добавить новую строку в конце. Также пытался вставить то, что требовалось, заключив весь текст в скобки. Ничего не сработало. Безрезультатно. Я использовал Kokodo Edit, и там все скобки закрыты, так что не понимаю, чего не хватает. Кстати, да, я подчищал настоящие имя домена в конфиге.
 
Я считаю, что все фигурные скобки и точки с запятой на месте. Возможно, просто не хватает переноса строки в последней строке. Некоторые парсеры так работают... Я всегда добавляю его, потому что меня это не раз подвело. Предполагаю, что вы заменили все "mydomain.com" на название своего настоящего домена. С уважением, Мартин Политик, март 2017.
Страницы: 1 2 След.
Читают тему (гостей: 1)