Configurer Icecast avec un certificat SSL et Cloudflare

Voici comment configurer un serveur Icecast pour utiliser un certificat SSL pour proposer des flux radio servis en HTTPS, le tout derriĂšre Cloudflare.

Depuis que Strict Transport Security (HSTS) a Ă©tĂ© activĂ© par dĂ©faut pour tous les sites hĂ©bergĂ©s sur le serveur, la page de Thunderstruck Radio ne s’affiche plus correctement car le serveur Icecast est encore servi en simple HTTP, donc sans certificat SSL.

Nous allons donc changer tout cela et sécuriser Icecast avec le certificat SSL de notre domaine, de maniÚre à ce que les flux radio ainsi que le flux JSON soient servis en HTTPS.

Étape 1 : crĂ©er un sous-domaine au niveau DNS

Il vaut mieux sĂ©parer la radio de votre site principal, c’est beaucoup plus simple Ă  gĂ©rer et Ă©vite les Ă©pineux problĂšmes de configuration.

J’opte pour ajouter le sous-domaine thunderstruck.skyminds.net avec un enregistrement DNS de type A dans Cloudflare:

thunderstruck.skyminds.net.	1	IN	A	xxx.xxx.xxx.xxxCode language: CSS (css)

On garde le sous-domaine en DNS seulement, nul besoin d’activer le cache (puisque c’est un flux).

Étape 2 : ouvrir le port 8443 dans le pare-feu

J’utilise Cloudflare donc nous avons quelques ports HTTPS ouverts par dĂ©faut qui peuvent ĂȘtre utilisĂ©s sans blocages :

# Ports HTTPS ouverts par défaut chez Cloudflare, sans support cache :

    443
    2053
    2083
    2087
    2096
    8443Code language: PHP (php)

Nous utilisons ufw donc la commande est trĂšs simple pour ouvrir le port 8443 :

ufw allow 8443/tcp comment "Icecast SSL"Code language: JavaScript (javascript)

Le serveur accepte désormais les connexions sur le port 8443 pour Icecast.

Étape 3 : configurer le sous-domaine sous NginX

Nous allons maintenant configurer notre sous-domaine et éditer le bloc serveur de notre domaine sous NginX:

nano /etc/nginx/sites-available/skyminds.conf

Et nous y ajoutons ce bloc:

# Thunderstruck.skyminds.net
server {
    listen       8443 ssl http2;
    listen  [::]:8443 ssl http2;

    server_name thunderstruck.skyminds.net;

    # Let's Encrypt
    ssl_certificate         /etc/nginx/ssl/skyminds.net/fullchain.pem;
    ssl_certificate_key     /etc/nginx/ssl/skyminds.net/privkey.pem;

    location / {
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_pass              http://127.0.0.1:8443;
        proxy_read_timeout      90;
        proxy_redirect          off;
        proxy_buffering         off;
        tcp_nodelay             on;

	    # CSP headers
	    add_header Content-Security-Policy "media-src 'self' https://thunderstruck.skyminds.net:8443";
    }
}Code language: PHP (php)

Testez la configuration et rechargez nginx :

nginx -t

service nginx reload

Étape 4 : unifier le certificat SSL et sa clĂ© privĂ©e

Icecast peut fonctionner avec un certificat SSL à partir de la version 2.4.4. Commencez donc par vérifier que cette version est à minima installée sur le serveur:

icecast2 -v

Ensuite, Icecast nécessite un fichier de certificat unique, qui est en fait une compilation du certificat et de sa clé privée.

Nous créons donc un fichier shell qui va contenir notre commande:

nano /home/scripts/icecast-ssl.sh

et dans lequel nous ajoutons notre commande cat :

#!/bin/bash
cat /etc/nginx/ssl/skyminds.net/fullchain.pem /etc/nginx/ssl/skyminds.net/privkey.pem > /etc/icecast2/bundle.pemCode language: JavaScript (javascript)

Vous pouvez exécuter le fichier de maniÚre à générer le fichier bundle.pem:

bash /home/scripts/icecast-ssl.sh

On assigne maintenant les bons droits pour que le certificat soit lisible par icecast2:

chown icecast2:icecast /etc/icecast2/bundle.pem

Étape 5 : automatiser le renouvellement du certificat Icecast

J’utilise acme.sh pour la gĂ©nĂ©ration et le renouvellement automatique de tous les certificats du serveur donc il est trĂšs utile d’Ă©diter la configuration du certificat pour que le script de gĂ©nĂ©ration du certificat pour SSL ait lieu automatiquement, juste aprĂšs le renouvellement du certificat de notre domaine.

On édite donc la configuration acme.sh du domaine:

nano /root/.acme.sh/skyminds.net_ecc/skyminds.net.conf

Et nous éditons la directive Le_RenewHook avec le chemin de notre nouveau script shell :

Le_RenewHook='bash /home/scripts/icecast-ssl.sh && service icecast2 restart'Code language: JavaScript (javascript)

Sauvegardez les changements.

Étape 6 : Ă©diter la configuration Icecast

On crée une clé DH spécifique pour Icecast, elle nous servira pour sécuriser la configuration:

openssl dhparam -out /etc/icecast2/dhparams.pem 2048

Résultat:

Generating DH parameters, 2048 bit long safe prime
..................................................................................................................................................................................................................................................................................................................................................................................................................................+..............++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*

Nous pouvons maintenant passer Ă  la modification de la configuration de notre serveur Icecast:

nano /etc/icecast2/icecast.xml

1. Décommentez ce bloc:

<listen-socket>
    <port>8443</port>
    <ssl>1</ssl>
</listen-socket>Code language: HTML, XML (xml)

2. éditez les directives <ssl-certificate> et <ssl-private-key> avec le chemin du certificat unifié, et ajoutez dhparams et les ciphers autorisés:

<paths>
    <ssl-certificate>/etc/icecast2/bundle.pem</ssl-certificate>
    <ssl-private-key>/etc/icecast2/bundle.pem</ssl-private-key>
    <ssl-dhparams>/etc/rsas/certs/dhparams.pem</ssl-dhparams>
    <ssl-allowed-ciphers>ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
    ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:
    ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:
    ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:
    ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS</ssl-allowed-ciphers>
</paths>Code language: HTML, XML (xml)

3. Vérifier la directive hostname :

<hostname>thunderstruck.skyminds.net</hostname>Code language: HTML, XML (xml)

Enregistrez les changements et redémarrez le service:

service icecast2 restart

Étape 6 : tests

A ce stade, vous pouvez naviguer sur la page de votre sous-domaine, en précisant le port 8443. Si tout va bien, vous devriez obtenir une page servie par le serveur Icecast:

https://thunderstruck.skyminds.net:8443/Code language: JavaScript (javascript)

Un autre moyen est de faire un curl -I sur notre nouvelle adresse:

curl -I https://thunderstruck.skyminds.net:8443/

HTTP/1.0 400 Bad Request
Server: Icecast 2.4.4
Connection: Close
Date: Tue, 31 Jan 2023 13:25:50 GMT
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache, no-store
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Pragma: no-cache
Access-Control-Allow-Origin: Code language: JavaScript (javascript)

Ignorez l’erreur 400 dans mon exemple, la ligne intĂ©ressante est la seconde: Server: Icecast 2.4.4.

Notre serveur Icecast est donc bien visible et accessible pour tout le monde.

Conclusion

Et voilà, nous venons de sécuriser un service de plus sur notre serveur: Icecast tourne maintenant sur son propre sous-domaine et utilise une version unifiée du certificat wildcard de notre domaine, qui sera automatiquement mis à jour lors du renouvellement périodique du certificat principal.

Cela nous permet d’intĂ©grer le lecteur audio sur la page de Thunderstruck Radio sans avoir d’erreurs de type contenu mixte (des ressources chargĂ©s en HTTP sur une page HTTPS).

Des obstacles techniques ? Je trouve des solutions sur-mesure pour que votre site WordPress/WooCommerce fonctionne sans accroc.

Contactez-moi pour un diagnostic gratuit »

Matt

Développeur certifié WordPress & WooCommerce chez Codeable, administrateur systÚme et enseignant-chercheur, je mets mon expertise au service de vos projets web.

Ma priorité : des sites performants, fiables et sĂ©curisĂ©s, pensĂ©s pour offrir la meilleure expĂ©rience utilisateur. J’accompagne chaque client avec Ă©coute et pĂ©dagogie, pour transformer vos idĂ©es en solutions concrĂštes et durables.

Profitez de solutions WordPress et WooCommerce sur-mesure, pensées pour optimiser durablement votre site.
Explorez les leviers pour booster l’impact de votre site web.

Opinions