Как настроить сайт и поток для онлайн радио с https

Задача, в общем-то тривиальная, но некоторые сложности возникли с ssl для Айскаста, о чём я и хотел бы рассказать ниже.

Диаграмма деплоя
На весь экран / посмотреть исходник диаграммы (diagrams.net)

Софт

  • Docker
  • Icecast
  • Nginx
  • Certbot

Процесс настройки

Докер лучше ставить по-инструкции от разработчиков.

Айскаст ставим в образе от команды Либретайм:

docker pull libretime/icecast:2.4.4-alpine

Конфиг для Айскаста положил по адресу /usr/local/share/icecast-server.xml1. Более чем избыточное описание параметров доступно в мануале Айскаста. Ssl настроим позже, после получения сертификата.

создать папку для логов:

mkdir /var/log/icecast

разрешить в неё писать:

chmod 777 /var/log/icecast/

Запускаем Айскаст через Докер командой:

docker run -d \
  -p 8000:8000 \
  -v /usr/local/share/icecast - conf.xml:/etc/icecast.xml \
  -v /var/log/icecast:/var/log /icecast \
  libretime/icecast:2.4.4-alpine

На данном этапе, можно уже подключиться к Айскасту и начать вещать.

Html-страничку с описанием потока, веб-плеером, стили и картинки я положил в /var/www/html. Как поставить и сконфигурировать Докер образ Энжинкса хорошо написано в блоге Докера.

Как получить ssl-сертификат, чтобы nginx начал работать по https и как это настроить, подробно рассказано у DigitalOcean.

Те самые сложности

В принципе, после всего что сделано выше, html-страничка начнет отдаваться по https. Но вот включить поток через плеер на сайте будет нельзя! Айскаст работает по http, а веб-браузер не разрешает на странице загруженной по https обращаться за http-содержимым. Чтобы заставить работать Айскаст по http с выпущенным сертификатом, надо с ним совершить некоторые манипуляции.

Icecast ожидает, что публичный и приватный ключи будут в одному .pem файле. Пример файла:

root@ubuntu22:/usr/local/share# cat  certbot-etc/live/адрес_сайта/bundle.pem
-----BEGIN CERTIFICATE-----
MIIELTCCAxWgAwIBAgISBOIzytOo4K4YP8hW9wClvI7iMA0GCSqGSIb3DQEBCwUA
...
YyoNWmQ5524cw5bKLRYTiDSG0fAIk53U4G+ybSC60hkgNJa7mE+ZYCuckCx2KOWo
GAdKyIVuPE+PHslKj52H5GA=
-----END CERTIFICATE-----

-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgjiHZ3M59U3V+XVe8
...
9SBWiOa6CXCJmIXNYb5kLltWY9YZo0AV5bh06/qUs4scBAmf6JNQXmO6
-----END PRIVATE KEY-----

Для этого, внутри папки /usr/local/share/certbot-etc/live/адрес_сайта/ выполним команду:

cat cert.pem privkey.pem > bundle.pem

Я ещё между сертификатами в файле добавил пустую строчку. Идею про строчку подглядел на stackoverflow.

Важно

такой вот “склеенный” файлик не будет генериться самостоятельно, если настроить автоматическое обновление ключей через cron, как в инструкции от DigitalOcean. Я самостоятельно обновлял сертификаты и “клеил” этот файлик.

В конфиге Айскаста (icecast-conf.xml), надо проставить ssl у listen-socket

<listen-socket>
    <port>8443</port>
    <ssl>1</ssl>
</listen-socket>

также, в paths указать путь до сертификата (потом через докер свяжем с реальным путём до файлика):

<paths>
    <ssl-certificate>/usr/share/icecast/icecast.pem</ssl-certificate>
    <ssl-allowed-ciphers>ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS</ssl-allowed-ciphers>
</paths>

Теперь, запустить Айскаст с указанием сертификата:

docker run -d \
    -p 8000:8000 \
    -p 8443:8443 \
    -v /usr/local/share/icecast-server.xml:/etc/icecast.xml \
    -v /var/log/icecast:/var/log/icecast \
    -v /usr/local/share/certbot-etc/live/адрес_сайта/bundle.pem:/usr/share/icecast/icecast.pem \
    libretime/icecast:2.4.4-alpine

Логи ошибок Айскаста можно смотреть в файле /var/log/icecast/error.log

По-идее, этого должно быть достаточно, чтобы Айскаст начал работать через https, и ссылку на поток можно теперь указать на страничке сайта.

Может быть полезно

Как настроить Nginx + letsencrypt, но попроще?

Nginx + letsencrypt - более простая статья на хабре

А может настроить reverse proxy в nginx, чтобы не маяться с настройкой ssl в Icecast?

Разработчики айскаста не рекомендуют так делать

Если есть проблемы с настройкой ssl, везде пишут проверить - собран ли Icecast с поддержкой ssl. Как это сделать?

docker container exec icecast-ssl ldd /usr/bin/icecast | grep ssl

Я проверял - внутри контейнера Icecast c ssl.


Примечания

  1. /usr/local/share : Local architecture-independent hierarchy. На Лоссте написали то же самое языком попроще 

Notes mentioning this note

There are no notes linking to this note.


Here are all the notes in this garden, along with their links, visualized as a graph.