网络摄像机反向代理

网络摄像机反向代理

我正在使用 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";

将 替换xxxBase64(<username>:<password>)。也就是说,找到一个 Base-64 编码器,输入用户名、文字冒号 ( :) 字符和密码,然后将 替换xxx为结果字符串。

例如,如果用户名是admin,密码是hunter2,我们可以在 Bash 提示符下运行以下命令:

printf %s 'admin:hunter2' | base64

并将结果字符串放入标题中,如下所示:

proxy_set_header Authorization "Basic YWRtaW46aHVudGVyMg==";

答案3

黑暗中的射击

我知道,如果文件权限设置不正确,有时您会得到一个登录框,在某些情况下,该登录框是针对文件权限级别而不是连接级别的,如果这有意义的话。也许这就是 Web 服务器端的某种文件权限问题?您最终可能会得到两个不同的凭据,一个基于连接/服务的凭据,如果连接/服务没有文件权限,则为文件级别凭据。

相关内容