我正在使用 Amcrest 相机,它需要基本身份验证才能呈现其流(文档- 第 17 页)。通过 可以访问相机http://admin:password@IP_CAMERA/cgi-bin/mjpg/video.cgi
。
当我尝试点击 时:56700
,系统会提示我进行身份验证,尽管它是硬编码的(如下所示)。即使我输入了正确的凭据,它也会失败。我做错了什么?
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";
}
}
我也尝试过proxy_pass_header Authorization;
按描述添加这里。
答案1
如上所述,可以通过以下方法解决
proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";
dXNlcjpwYXNzd29yZA==
命令的结果如下:echo -n "user:password" | base64
我想你已经尝试过了
无论如何,我相信正确的位置将是这样的
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
}
无需/cgi-bin/mjpg/video.cgi
,因为它将在浏览器或 http 客户端传递
或者如果它对你不起作用,它可能与此案有关 https://stackoverflow.com/questions/14839712/nginx-reverse-proxy-passthrough-basic-authenication
如果相机有一些领域检查,您可以通过开发工具中的标头选项卡 - 响应标头部分了解预期的领域。
但你需要使用以下命令编译 nginxheaders-more-nginx-module
你可以用这个脚本来实现
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
完成后你可以尝试这样的配置:
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"';
}
此标题的实际www-authenticate: Basic realm="Authentication Required"
数据
我检查了这两种情况,对我来说都有效,我在自定义烧瓶应用程序上测试了它。不幸的是,我没有这样的相机用于个人调试
答案2
使用 Amcrest 特定解决方案进行编辑
在某个时候(大约 2017 年?)Amcrest发布了固件更新删除基本身份验证从他们的 IP 摄像机中,只剩下摘要式身份验证作为唯一的选择。
Stack Overflow 上的这个答案可能是使用 FastCGI 和 nginx 剥离摘要式身份验证的最佳选择。
或者,您可以找到一种方法来降级相机上的固件,以再次支持基本身份验证。
上一个答案
您是否使用 Base64 编码来对用户名和密码进行编码,并且在中间使用冒号?
为了HTTP 基本身份验证,您需要执行以下操作:
proxy_set_header Authorization "Basic xxx";
将 替换xxx
为Base64(<username>:<password>)
。也就是说,找到一个 Base-64 编码器,输入用户名、文字冒号 ( :
) 字符和密码,然后将 替换xxx
为结果字符串。
例如,如果用户名是admin
,密码是hunter2
,我们可以在 Bash 提示符下运行以下命令:
printf %s 'admin:hunter2' | base64
并将结果字符串放入标题中,如下所示:
proxy_set_header Authorization "Basic YWRtaW46aHVudGVyMg==";
答案3
黑暗中的射击
我知道,如果文件权限设置不正确,有时您会得到一个登录框,在某些情况下,该登录框是针对文件权限级别而不是连接级别的,如果这有意义的话。也许这就是 Web 服务器端的某种文件权限问题?您最终可能会得到两个不同的凭据,一个基于连接/服务的凭据,如果连接/服务没有文件权限,则为文件级别凭据。