Reverse-Proxy für IP-Kamera

Reverse-Proxy für IP-Kamera

Ich verwende eine Amcrest-Kamera, die eine Basisauthentifizierung zum Rendern des Streams erfordert (Dokumentation- Seite 17). Der Zugriff auf die Kamera erfolgt über http://admin:password@IP_CAMERA/cgi-bin/mjpg/video.cgi.

Wenn ich versuche, auf zu klicken :56700, werde ich zur Authentifizierung aufgefordert, obwohl diese fest codiert ist (siehe unten). Selbst wenn ich die richtigen Anmeldeinformationen eingebe, schlägt die Authentifizierung fehl. Was mache ich falsch?

    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";
        }
    }

Ich habe auch versucht, proxy_pass_header Authorization;wie beschrieben hinzuzufügenHier.

Antwort1

Wie oben gesagt, kann es gelöst werden durch

proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";

wo dXNlcjpwYXNzd29yZA==ist das Ergebnis des Befehls:echo -n "user:password" | base64

ich schätze, das hast du schon versucht

Wie auch immer, ich glaube, der richtige Standort wird so aussehen

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
}

ohne /cgi-bin/mjpg/video.cgi, weil es auf der Browser- oder HTTP-Clientseite weitergegeben wird

ODERWenn es bei Ihnen nicht funktioniert, kann es mit diesem Fall zusammenhängen https://stackoverflow.com/questions/14839712/nginx-reverse-proxy-passthrough-basic-authenication

Wenn die Kamera über einige Realm-Prüfungen verfügt, können Sie den erwarteten Realm über die Entwicklertools auf der Registerkarte „Header“ im Abschnitt „Antwort-Header“ erfahren.

Aber Sie müssen nginx kompilieren mitheaders-more-nginx-module

Mit diesem Skript gelingt es Ihnen

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

Sobald dies erledigt ist, können Sie folgende Konfiguration ausprobieren:

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"';
}

wo www-authenticate: Basic realm="Authentication Required"Ihre tatsächlichen Daten dieses Headers

Ich habe beide Fälle überprüft, es funktioniert bei mir, ich habe es mit einer benutzerdefinierten Flask-Anwendung getestet. Leider habe ich keine solche Kamera für persönliches Debuggen

Antwort2

Bearbeiten mit Amcrest-spezifischer Lösung

Irgendwann (um 2017?) Amcrestein Firmware-Update veröffentlicht, dasBasisauthentifizierung entferntvon ihren IP-Kameras, sodass die Digest-Authentifizierung die einzige Option ist.

Diese Stack Overflow-Antwortist möglicherweise die beste Option für Sie, die Digest-Authentifizierung nach Wunsch mit FastCGI und nginx zu entfernen.

Entweder das oder Sie finden vielleicht eine Möglichkeit, die Firmware Ihrer Kamera herunterzustufen, damit die Basisauthentifizierung wieder unterstützt wird.


Vorherige Antwort

Kodieren Sie den Benutzernamen und das Passwort Base64-basiert mit einem Doppelpunkt dazwischen?

FürHTTP-Basisauthentifizierungmüssen Sie Folgendes tun:

proxy_set_header Authorization "Basic xxx";

Ersetzen Sie das xxxdurch Base64(<username>:<password>). Das heißt, suchen Sie sich einen Base-64-Encoder, geben Sie den Benutzernamen, einen Doppelpunkt ( :) und das Kennwort ein und ersetzen Sie das xxxdurch die resultierende Zeichenfolge.

Wenn der Benutzername beispielsweise adminund das Kennwort lautet hunter2, könnten wir in einer Bash-Eingabeaufforderung Folgendes ausführen:

printf %s 'admin:hunter2' | base64

und fügen Sie die resultierende Zeichenfolge wie folgt in den Header ein:

proxy_set_header Authorization "Basic YWRtaW46aHVudGVyMg==";

Antwort3

Im Dunkeln geschossen

Ich weiß, dass manchmal, wenn die Dateiberechtigungen nicht richtig eingestellt sind, ein Anmeldefeld angezeigt wird, das in manchen Fällen für die Dateiberechtigungsstufe und nicht für die Verbindungsebene bestimmt ist, falls das Sinn ergibt. Vielleicht liegt es daran, dass auf der Webserverseite ein Problem mit den Dateiberechtigungen vorliegt? Sie können am Ende zwei verschiedene Anmeldeinformationen haben, eine auf Verbindungs-/Dienstbasis und eine auf Dateiebene, wenn die Verbindung/der Dienst keine Dateiberechtigung hat.

verwandte Informationen