web-dev-qa-db-fra.com

Réception du flux RTMPS sur NGinx-RTMP

La pratique standard pour la RTMP est toujours d'avoir une clé de flux de texte brut sur les fils.

Je souhaite accompagner des flux RTMPS des codeurs à Nginx, mais le module RTMP n'a pas encore de RTMPS.

Je ne suis pas intéressé par toutes les solutions de relais pour permettre de prendre un flux RTMP et d'envoyer à un endroit comme Facebook sur RTMPS, car la même faille de sécurité est toujours là car, à un moment donné, vous passez les clés sur le texte brut.

Ma question est de savoir où puis-je trouver les spécifications de référence sur RTMPS? J'aimerais savoir quelles clés sont nécessaires pour faire une poignée de main appropriée entre une source RTMPS telle que OBS et NGinx, puis je vais utiliser la connexion avec le module RTMP. Les touches normales et une autorité peuvent-elles être utilisées sur un serveur afin de pouvoir faire la poignée de main avec un codeur RTMPS?

J'ai vu Stunnel utilisé pour envelopper RTMP dans TLS. Est-il possible de faire l'inverse - Utilisez Stunnel pour recevoir RTMPS et reconvertir RTMP pour le module RTMP?

4
johnsonjp34

Mise à jour: Ceci est ma réponse originale qui décrit assez bien les problèmes que l'on peut faire face lors de la mise en œuvre de RTMPS avec nginx. Cependant, j'ai ajouté un version améliorée pour un contrôle d'accès plus à régler, et je recommande d'utiliser la configuration à partir de celui-ci. , à la place.


Oui, cela est possible avec Stunnel, car RTMPS n'est qu'une session RTMP enveloppée dans une session TLS standard. Les exemples sur Internet sont la plupart du temps RTMP → RTMPS I.E. Le STANDNEL fonctionne comme un serveur de texte brut et du client TLS, qui est configuré avec client = yes. Sans cela, le client par défaut sur no, qui est le Mode Server.

Le Stunnel La configuration pourrait ressembler à ceci:

[rtmps]
accept = 1935
connect = 127.0.0.1:1936
cert=/etc/letsencrypt/live/rtmp.example.com/fullchain.pem
key=/etc/letsencrypt/live/rtmp.example.com/privkey.pem

Avec ça:

  • Le Nginx devrait être à l'écoute du fichier RTMP sur boucle locale, port 1936/tcp.
  • Comme vous ne pouvez pas renouveler le crypté de SECIALITE en utilisant la RTMP, vous pourriez avoir besoin d'un bloc de serveur HTTP pour le défi HTTP-01.
  • Comme la connexion à Nginx vient toujours de l'étouffement, c'est-à-dire à partir du scannel I.e. à partir du 127.0.0.1, vous ne pouvez pas utiliser les directives allow/deny/Push le flux de l'application avec la clé avec la clé, mais vous pouvez également pull it it of the Application publique (/live).

Le texte suivant NGINX Exemple de configuration prend en compte ces considérations:

rtmp {
    server {
        listen 127.0.0.1:1936;
        chunk_size 4096;

        application app-secret-stream-key {
            live on;
            record off;
            allow publish 127.0.0.1;  # for streaming through stunnel
            allow play 127.0.0.1;     # for the pull from /live
        }

        application live {
            live on;
            record off;
            deny publish all;         # no need to publish on /live
            allow play all;           # playing allowed

            pull rtmp://127.0.0.1:1936/app-secret-stream-key;
        }
    }
}

http {
    server {
        listen 80;
        server_name rtmp.example.com;

        location ^~ /.well-known/acme-challenge/ {
            root /var/www/letsencrypt;
        }
        location / {
            return 404;
        }
    }
}

Cependant, ce n'est qu'un exemple, vous pouvez donc la modifier pour répondre à vos besoins exacts. (En outre, je n'ai pas testé cette configuration mais écrite uniquement sur la base de la documentation, alors n'hésitez pas à corriger, si j'ai eu quelque chose de mal.)

3
Esa Jokinen

Puisque Nginx est capable de mettre fin à TLS pour UPSTRAMAM TCP serveurs, cela devrait en prendre soin, en utilisant uniquement NGinx (simplement ajouté stream section à la configuration de @esa JOKINEN):

stream {
    upstream backend {
        server 127.0.0.1:1936;
    }
    server {
        listen 1935 ssl;
        proxy_pass backend;
        ssl_certificate /etc/letsencrypt/live/rtmp.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/rtmp.example.com/privkey.pem;
    }
}

rtmp {
    server {
        listen 127.0.0.1:1936;
        chunk_size 4096;

        application app-secret-stream-key {
            live on;
            record off;
            allow publish 127.0.0.1;  # for streaming through stunnel
            allow play 127.0.0.1;     # for the pull from /live
        }

        application live {
            live on;
            record off;
            deny publish all;         # no need to publish on /live
            allow play all;           # playing allowed

            pull rtmp://127.0.0.1:1936/app-secret-stream-key;
        }
    }
}

http {
    server {
        listen 80;
        server_name rtmp.example.com;

        location ^~ /.well-known/acme-challenge/ {
            root /var/www/letsencrypt;
        }
        location / {
            return 404;
        }
    }
}
6
Danila Vershinin

Je ne sais pas si cela est valide ici, mais j'ai utilisé une simple terminaison SSL que ci-dessus avec le protocole de proxy pour conserver les adresses IP client. Le module RTMP prend en charge le protocole de proxy afin que vous puissiez toujours laisser refuser l'adresse IP. Fait des tests de base et il semble fonctionner simplement bien, corriger les messages dans le journal et refuser l'adresse IP a fonctionné.

Peut-être que j'ai mal compris, mais il semble faire ce que je pense que cela devrait être, c'est-à-dire autoriser les connexions SSL via RTMPS et à maintenir les adresses IP client pour le contrôle d'accès dans le module RTMP.

Mon bloc de flux ressemble à ceci:

stream {

    upstream backend {
        server 127.0.0.1:1935;
    }

    server {
        listen 1936 ssl;
        proxy_pass backend;
        proxy_protocol on;
        ssl_certificate /etc/..../fullchain.pem;
        ssl_certificate_key /etc/.../privkey.pem;
    }
}

Et les bits pertinents de ma section RTMP: (Remarque: les connexions directes ne fonctionnent probablement probablement pas mais non essayées ... suggère ceci dans le blog (voir ci-dessous) mais je n'ai pas besoin de connexions directes).

rtmp {
    server {

        listen 1935 proxy_protocol;
        chunk_size 4000;

     
        application stream_app{
            live on;
            .....
            .....
            .....
            }
        }
    }
}

Vous pouvez en lire à ce sujet dans le blog RTMP http://nginx-rtmp.blogspot.com .

J'espère que cela aide quelqu'un et merci aux réponses ci-dessus car ils m'ont signalé dans la bonne direction.

Fyi je nie jouer à tous comme je pousse à la recherche de HLS, n'avez pas besoin de jouer ni d'autre pour le moment.

0
Code Rider