С запуском публичной беты Lets Encrypt на носу, интересно, кто-нибудь знает, как правильно использовать подписанные сертификаты с контроллером UniFi? Хочу получить сертификат LE для домена, где живёт мой контроллер. Тогда можно будет забыть обо всех ошибках с сертификатами, которые выскакивают при каждом входе.
Ещё веб-панель управления работает на порту 8443. Можно ли как-то привязать её к 443? Дело в том, что многие корпоративные фаерволы не пропускают сервисы на 8443, хочется всё стандартизировать.
У меня на сервере ещё несколько других доменов, которые тоже работают на 443, так что должно с ними сочетаться. Для них я использую Nginx в роли веб-сервера.
Спасибо!
danbowkley
Guest
18.06.2017 14:03:00
Я только что настроил свой сертификат 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.
Когда всё успешно завершится, нужно установить сертификаты. Проверьте, чтобы в скрипте стояло правильное имя вашей машины, а затем просто запустите его. Скорее всего, придётся закрыть браузер и открыть заново — после этого всё должно заработать.
Теперь надо автоматизировать обновление сертификатов — это проще простого.
Это проверит сертификат первого числа каждого месяца в полночь. Если сертификат нужно обновить, он обновится и запустит скрипт установки. Учтите, что при установке будет пауза на несколько секунд — контроллер остановится и запустится заново, так что возможны небольшие перебои. Если у вас есть время, когда сеть работает особенно тихо, лучше поставить выполнение не на первое число в полночь, а на это время.
SprockTech
Guest
26.10.2018 12:18:00
@EastSideGym
Давай, создавай новую тему с твоей проблемой и отмечай меня. --Klint
EastSideGym
Guest
26.10.2018 11:54:00
Я бы очень хотел получить постоянное решение. А пока нужна такая, которая поможет прямо сейчас. У вас есть вариант для меня?
SprockTech
Guest
26.10.2018 07:07:00
Кто-то уже упоминал скрипт от @Frankedinven. В общем, суть в том, чтобы использовать pre/post хуки, доступные в certbot, чтобы взять на себя основную работу по загрузке сертификата в UniFi. Скрипт, над которым я сейчас работаю в проекте Easy UBNT, базируется на идее Фрэнка (правда, немного по-другому) и работает (пока что на Debian/Ubuntu). Я ещё не тестировал скрипт на CK, но планирую это сделать в будущем. Если кто-нибудь хочет помочь ускорить этот процесс — дайте знать. --Klint
d-m-z
Guest
05.07.2017 07:33:00
@danbowkley
Выглядит отлично. Я как раз собирался написать скрипт, когда наткнулся на твой (и бесстыдно его скопировал!). Сейчас тестирую (всегда бесплатный) экземпляр Google Compute Engine f1-micro с Debian 8. Пока всё отлично. Установил certbot так: sudo apt-get install certbot -t jessie-backports
EastSideGym
Guest
25.10.2018 21:08:00
До обновления контроллера до версии 0.12.0 я мог успешно установить Let’s Encrypt. Теперь же постоянно выскакивает ошибка 403 Forbidden. Чтобы исправить эту ошибку, убедитесь, что ваше доменное имя правильное, а DNS записи A / AAAA для домена указывают на верный IP-адрес. Я подозреваю, что после обновления мой скрипт перестал быть совместимым. Только я этого не понимаю. Кто-нибудь может помочь или знает, как решить эту проблему лучше?
# Очистить и использовать новый сертификат 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
PetriR
Guest
19.10.2018 09:46:00
@jupitersolu и @auocloudmtanner: Чтобы автоматизировать Let's Encrypt, нужно поместить безголовую версию вашего скрипта в /etc/letsencrypt/renew-hooks/deploy/. CertBot автоматически запустит ваш скрипт при обновлении сертификата. В этом случае нельзя запрашивать имя домена, например.
jupitersolu
Guest
18.10.2018 22:10:00
Используйте это вместо этого.
mtan93
Guest
03.09.2018 16:26:00
Используя вышеизложенное, я создал: Это должно работать на Ubuntu и других дистрибутивах на базе Debian.
ve2mrx
Guest
10.04.2018 04:22:00
Привет! Я использовал скрипт от @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 # Ссылки: # # # # # Назначение: копировать сертификаты 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
Я решил разместить его в /usr/local/bin/ Спасибо! Мартин
P.S. В скрипте заменил домены на примеры из RFC 2606.
gcormier
Guest
28.03.2018 17:52:00
Небольшое обновление команды в одну строку для использования нового формата 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.
dacut
Guest
17.10.2017 09:48:00
В nginx нужно добавить ещё один блок для поддержки WebSocket. Вот что я использую, чтобы избежать сообщения «Websocket connection error»:
Из всех руководств по настройке LetsEncrypt я нашёл это самым понятным и лёгким для следования:
jpenberthy
Guest
12.06.2017 18:22:00
Настроил nginx на Deb 8 (на Deb 7 по тому туториалу, который я использовал, не работает). Но теперь каждый раз, когда открываю новую страницу, появляется ошибка «WebSocket connection error». Хотя в общем всё вроде работает нормально.
sightlessace
Guest
11.03.2017 23:09:00
Спасибо! Наконец-то удалось запустить сервис. Только похоже, что перенаправление работает неправильно, с этим еще разбираюсь.
jonoa
Guest
11.03.2017 22:22:00
Ты прав, скобок вроде как ровно столько, сколько надо. Хм... Вот моя конфигурация, может пригодится.
server { listen 443; server_name domain.example.com;
Я понял, что там написано, и сделал так, как сказано, но всё равно не работает.
fsfadmin
Guest
09.03.2017 05:39:00
Да, я попробовал добавить новую строку в конце. Также пытался вставить то, что требовалось, заключив весь текст в скобки. Ничего не сработало. Безрезультатно. Я использовал Kokodo Edit, и там все скобки закрыты, так что не понимаю, чего не хватает. Кстати, да, я подчищал настоящие имя домена в конфиге.
politick
Guest
09.03.2017 05:09:00
Я считаю, что все фигурные скобки и точки с запятой на месте. Возможно, просто не хватает переноса строки в последней строке. Некоторые парсеры так работают... Я всегда добавляю его, потому что меня это не раз подвело. Предполагаю, что вы заменили все "mydomain.com" на название своего настоящего домена. С уважением, Мартин Политик, март 2017.