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 xxx
durch 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 xxx
durch die resultierende Zeichenfolge.
Wenn der Benutzername beispielsweise admin
und 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.