Estoy usando una cámara Amcrest que requiere autenticación básica para representar su transmisión (documentación- página 17). Se accede a la cámara a través de http://admin:password@IP_CAMERA/cgi-bin/mjpg/video.cgi
.
Cuando intento presionar :56700
, se me solicita autenticación aunque esté codificada (a continuación). Incluso cuando ingreso las credenciales correctas, falla. ¿Qué estoy haciendo mal?
server {
listen 56700;
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_pass http://IP_CAMERA/cgi-bin/mjpg/video.cgi;
proxy_set_header Authorization "Basic xxx";
}
}
También intenté agregar proxy_pass_header Authorization;
como se describeaquí.
Respuesta1
Como se dijo anteriormente, se puede resolver mediante
proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";
donde dXNlcjpwYXNzd29yZA==
está el resultado del comando:echo -n "user:password" | base64
Supongo que ya lo intentaste
De todos modos, creo que la ubicación correcta se verá así.
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_pass http://IP_CAMERA;
proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";
proxy_set_header Authorization "Basic $http_authorization"; # For interactive mode
}
sin /cgi-bin/mjpg/video.cgi
porque pasará en el lado del navegador o del cliente http
OSi no te funciona puede estar relacionado con este caso https://stackoverflow.com/questions/14839712/nginx-reverse-proxy-passthrough-basic-authenication
Si la cámara tiene algunas comprobaciones de dominio, puede conocer el dominio esperado a través de las herramientas de desarrollo en la pestaña Encabezados - sección Encabezados de respuesta.
Pero necesitarás compilar nginx conheaders-more-nginx-module
Puedes hacerlo con este script.
cd /usr/src
NGINXFILE=$(wget -qO- http://nginx.org/en/download.html | tr ' ' '\n' | egrep -o 'nginx.+?tar.gz' | head -1)
wget http://nginx.org/download/${NGINXFILE}
tar zxvf ${NGINXFILE}
cd ${NGINXFILE%.*.*}
cp -r /etc/nginx /root/nginx_$(date +%F) #Backup current nginx configs
cd /usr/src
git clone https://github.com/openresty/headers-more-nginx-module.git
./configure --add-module=/usr/src/headers-more-nginx-module --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
make
make install
Una vez hecho esto, puedes probar dicha configuración:
location / {
proxy_http_version 1.1;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
more_set_input_headers 'Authorization: Basic dXNlcjpwYXNzd29yZA==';
#more_set_input_headers 'Authorization: $http_authorization'; # For interactive mode
proxy_set_header Accept-Encoding "";
proxy_pass http://IP_CAMERA;
proxy_redirect default;
more_set_headers -s 401 'www-authenticate: Basic realm="Authentication Required"';
}
donde están www-authenticate: Basic realm="Authentication Required"
tus datos reales de este encabezado
Revisé ambos casos, funciona para mí, lo probé en una aplicación de matraz personalizada. Desafortunadamente no tengo esa cámara para depuración personal.
Respuesta2
Edite con una solución específica de Amcrest
En algún momento (¿alrededor de 2017?) Amcrestlanzó una actualización de firmware queSe eliminó la autenticación básica.desde sus cámaras IP, dejando la autenticación implícita como la única opción.
Esta respuesta de Stack Overflowpuede ser su mejor opción para eliminar la autenticación implícita como desea usar FastCGI y nginx.
O eso, o quizás puedas encontrar una manera de degradar el firmware de tu cámara para que admita la autenticación básica nuevamente.
Respuesta anterior
¿Está codificando en Base64 el nombre de usuario y la contraseña con dos puntos en el medio?
ParaAutenticación básica HTTP, deberá hacer lo siguiente:
proxy_set_header Authorization "Basic xxx";
Reemplace el xxx
con Base64(<username>:<password>)
. Es decir, busque un codificador Base-64, ingrese el nombre de usuario, dos puntos literales ( :
) y la contraseña, y reemplace xxx
con la cadena resultante.
Por ejemplo, si el nombre de usuario es admin
y la contraseña es hunter2
, podríamos ejecutar lo siguiente en un indicador de Bash:
printf %s 'admin:hunter2' | base64
y ponga la cadena resultante en el encabezado así:
proxy_set_header Authorization "Basic YWRtaW46aHVudGVyMg==";
Respuesta3
Un tiro en la oscuridad
Sé que a veces, si los permisos del archivo no están configurados correctamente, puede aparecer un cuadro de inicio de sesión que en algunos casos es para el nivel de permiso del archivo y no para el nivel de conexión, si eso tiene sentido. ¿Quizás eso es lo que está sucediendo, algún tipo de problema de permiso de archivo en el extremo del servidor web? Puede terminar con dos credenciales diferentes, una basada en conexión/servicio y luego la de nivel de archivo si la conexión/servicio no tiene permiso de archivo.