Estou usando uma câmera Amcrest que requer autenticação básica para renderizar seu stream (documentação- página 17). A câmera é acessada através de http://admin:password@IP_CAMERA/cgi-bin/mjpg/video.cgi
.
Quando tento acertar :56700
, sou solicitado auth, mesmo que esteja codificado (abaixo). Mesmo quando insiro as credenciais corretas, ele falha. O que estou fazendo de errado?
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";
}
}
Eu também tentei adicionar proxy_pass_header Authorization;
conforme descritoaqui.
Responder1
Como dito acima, pode ser resolvido por
proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";
onde dXNlcjpwYXNzd29yZA==
está o resultado do comando:echo -n "user:password" | base64
acho que você já tentou isso
de qualquer forma, acredito que a localização correta será semelhante
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
}
sem /cgi-bin/mjpg/video.cgi
porque vai passar no navegador ou no lado do cliente http
OUSe não funcionar para você, pode estar relacionado a este caso https://stackoverflow.com/questions/14839712/nginx-reverse-proxy-passthrough-basic-authenication
Se a câmera tiver algumas verificações de domínio, você poderá saber o reino esperado por meio de ferramentas de desenvolvimento na guia Cabeçalhos - seção Cabeçalhos de resposta.
Mas você precisará compilar o nginx comheaders-more-nginx-module
Você pode fazer isso com 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
uma vez feito isso, você pode tentar essa configuração:
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"';
}
onde estão www-authenticate: Basic realm="Authentication Required"
seus dados reais deste cabeçalho
Verifiquei os dois casos, funciona para mim, testei em um aplicativo de frasco personalizado. Infelizmente não tenho essa câmera para depuração pessoal
Responder2
Edite com solução específica da Amcrest
Em algum momento (por volta de 2017?) Amcrestlançou uma atualização de firmware queautenticação básica removidade suas câmeras IP, deixando a Autenticação Digest como a única opção.
Esta resposta do Stack Overflowpode ser sua melhor opção para remover a autenticação Digest como você deseja usando FastCGI e nginx.
Ou isso, ou talvez você possa encontrar uma maneira de fazer o downgrade do firmware da sua câmera para oferecer suporte à autenticação básica novamente.
Resposta Anterior
Você está codificando o nome de usuário e a senha em Base64 com dois pontos no meio?
ParaAutenticação básica HTTP, você precisará fazer o seguinte:
proxy_set_header Authorization "Basic xxx";
Substitua o xxx
por Base64(<username>:<password>)
. Ou seja, encontre um codificador Base-64, insira o nome de usuário, um :
caractere literal de dois pontos ( ) e a senha e substitua xxx
pela string resultante.
Por exemplo, se o nome de usuário for admin
e a senha for hunter2
, poderíamos executar o seguinte em um prompt do Bash:
printf %s 'admin:hunter2' | base64
e coloque a string resultante no cabeçalho assim:
proxy_set_header Authorization "Basic YWRtaW46aHVudGVyMg==";
Responder3
Tiro no escuro
Sei que às vezes, se as permissões do arquivo não estiverem definidas corretamente, você poderá obter uma caixa de login que, em alguns casos, é para o nível de permissão do arquivo e não para o nível de conexão, se isso fizer sentido. Talvez seja isso que está acontecendo, algum tipo de problema de permissão de arquivo no servidor web? Você pode obter duas credenciais diferentes, uma baseada em conexão/serviço e, em seguida, a de nível de arquivo se a conexão/serviço não tiver permissão de arquivo.