Al configurar Nginx como proxy SSL/TLS OffLoading de un Tomcat ejecutando la aplicación UniFi Video, no es posible reproducir los streaming de videos a través de HTTPS. El streaming de video funciona correctamente a través de HTTP, pero no a través de HTTPS. En el interfaz web de UniFi Video se muestra un tooltip con el siguiente mensaje de error: Unable to load stream. Please make sure port 7446 is open on your NVR.
A continuación una captura de pantalla del error en la interfaz web de UniFi Video:
A continuación una captura del Developper Tools de Firefox donde se aprecian las peticiones que hace el navegador al servidor, y a partir del cual ya se puede ver el origen del problema:
Y los mensajes que se registran en el log /var/log/unifi-video/evostream.00.log
del demonio evostream (el servicio encargado de servir los streaming de video):
|
|
Arquitectura del servicio
La arquitectura de UniFi Video se puede resumir en:
- Tomcat: En el se ejecuta la aplicación UniFi Video. Escucha en los puertos 7080 (HTTP) y 7443 (HTTPS).
- evostream: Servidor de streaming de video. Escucha en los puertos:
ems.liveflv.port
: 6666.ems.livews.port
: 7445 (WebSocket HTTP).ems.livewss.port
: 7446 (WebSocket HTTPS).ems.rtmp.port
: 1935.ems.rtsp.port
: 7447.
Análisis del problema
La conexión por HTTPS al WebSocket por el puerto 7446 no funciona así que la estrategia que seguí para evitar este problema fue interceptar el tráfico dirigido hacia el puerto 7446, mandarlo a Nginx para que se encarge del cifrado/descifrado en el lado del cliente y continuar con el flujo en plano en el lado del servidor; es decir, hacer un SSL Offloading al puerto 7446.
Puesto que el demonio evostream ya estaba escuchando en el puerto 7446, no era posible que Nginx escuchara también en el mismo puerto, por lo que ópte por usar iptables para interceptar el tráfico entrante por la interfaz de red y dirigido hacia el puerto 7446 (HTTPS), mandarlo a Nginx y que Nginx lo enviara en plano al puerto 7445 (HTTPS).
A continuación el esquema de como sería una conexión al Live View de la interfaz web de UniFi Video con la solución propuesta.
Solución
Configurar Nginx
|
|
Configurar iptables
|
|
Una vez aplicados los cambios el servicio de streaming de video funciona correctamente con HTTPS, a continuación una captura del Developpers Tools de Firefox: